【发布时间】:2017-07-14 16:49:58
【问题描述】:
我被要求构建一个函数,该函数接收一个带有很多零的静态二维数组,并将其转换为一个结构数组。每个结构都包含不为零的值和列的索引。
现在我已经构建了它,但问题在于打印功能。
1) 当我尝试打印两次时,它只打印一次,第二次列表变为 NULL。为什么会出现这种情况?
print(list);
print(list);
2) 为什么我不能像在 main 函数中那样打印?
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);
}
【问题讨论】:
-
关于第二个项目 - 你可能在某个时候访问了一个空的“next”,导致它崩溃......如果你在 linux 上,尝试用 gdb 调试它......
-
temp[i]=temp[i]->next;破坏性地改变了列表的结构。 -
另外,显然你的下一个指向自己,而不是下一个节点......不确定我是否能理解你的代码,但显然这是在填充节点时发生的......跨度>