试图在C中打印一组结构

时间:2017-07-14 16:49:59

标签: c arrays struct printing

我被要求构建一个函数,它接收带有大量零的静态二维数组并将其转换为结构数组。每个结构包含非零值和列的索引 Pic for easy understanding

现在我已经构建了它,但问题在于打印功能。

1)当我尝试打印两次时,它只打印一次,第二次列表变为NULL。为什么会这样?

    print(list);  
    print(list);

2)为什么我不能像在主函数中那样打印?

printf("this is just a print |%d||%d|  ", list[0]->next->next->next->data, list[0]->col);

为什么我无法访问它,程序崩溃......

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//#include <vld.h>
#include <string.h>
#include <ctype.h>
#define C 5
#define N 4

typedef struct Node {
    int data;
    int col;
    struct Node *next;
} node;

node **fun(int arr[N][C]) { 
    int i, j, k;
    node **list;
    node *temp;

    list = (node**)calloc(N, sizeof(node *));

    for (i = 0; i < N; i++) {
        list[i] = NULL;
        for (j = C - 1; j >= 0; j--)
            if (arr[i][j] != 0) {
                temp = (node*)malloc(sizeof(node));
                temp->data = arr[i][j];
                temp->col = j;
                temp->next = list[i];
                list[i] = temp;
            }
    }
    return list;
}

void print(node **head) {
    int i;
    node **temp = head;
    for (i = 0; i < N; i++) {
        while (temp[i]) {
            printf("|%d||%d|  ", temp[i]->data, temp[i]->col);
            temp[i] = temp[i]->next;
        }
        printf("\n\n");
    }
}

void main() {
    int arr[N][C] = { {0,0,4,0,7}, {3,0,0,0,0}, {9,1,0,6,0} , {0,0,0,0,0} };
    node **list;
    list = fun(arr);

    print(list);  ///////////
    print(list);  ///////////////

    printf("this is just a print |%d||%d|  ", list[0]->next->next->next->data, list[0]->col);
}

2 个答案:

答案 0 :(得分:0)

正如评论中提到的那样,您在打印它们的过程中会破坏指针列表:

    while(temp[i])
    {   printf("|%d||%d|  ",temp[i]->data,temp[i]->col);
        temp[i]=temp[i]->next;    // <---- here
    }

每个temp[i]head[i]相同,因此您在执行此操作时会修改原始列表。当此值为NULL时,while循环退出,因此最终结果是所有数组元素都为NULL。

您需要将此值分配给临时值,以便您可以在不更改列表的情况下遍历列表:

    node *temp2 = temp[i];
    while(temp2)
    {   printf("|%d||%d|  ",temp2->data,temp2->col);
        temp2=temp2->next;
    }

答案 1 :(得分:0)

您的print函数修改数组:它使用数组元素迭代列表,并使其保留NULL值。

以下是更正后的版本:

void print(node **head) {
    int i;
    for (i = 0; i < N; i++) {
        node *temp;
        for (temp = head[i]; temp; temp = temp->next) {
            printf("|%d||%d|  ", temp->data, temp->col);
        }
        printf("\n\n");
    }
}