我被要求构建一个函数,它接收带有大量零的静态二维数组并将其转换为结构数组。每个结构包含非零值和列的索引
现在我已经构建了它,但问题在于打印功能。
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);
}
答案 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");
}
}