我在C中工作,尝试传递链接列表列表的引用,但是当我编译并运行我的代码时,我在打印值时出现了分段错误。
这些是我的结构:
typedef struct node_{
int value;
/*struct node_ next;*/
struct node_ *next; /*1) This needs to be a pointer to a node*/
}Node;
typedef Node* List;
我的函数原型:
int create_list(List*, FILE*);
void print_list(List*, int);
Node* new_node(int);
我的职能的召唤:
int length = create_list(array, fp);
printf("Pre Sort\n");
print_list(array, length);
我正在使用的功能:
int create_list(List* array, FILE* fp){
int length, i, index, value;
fscanf(fp, "%d", &length);
//array = malloc(sizeof(Node));
array = malloc(sizeof(List));
for(i = 0; i < length; i++)
{
//(*array)[i] = NULL;
array[i] = NULL;
}
while(!feof(fp)){
fscanf(fp, "%d %d", &index, &value);
Node* node = new_node(value);
node->next = array[index];
array[index] = node;
}
}
/*Creates a new node of type Node, sets node->value = value and returns it. */
Node* new_node(int value){
Node* node;
node = malloc(sizeof(Node));
node->value = value;
node->next = NULL;
return node;
}
/*For each index in the array, print the index, the linked list it points to,
* and the sum of its nodes. See the sample output for an example.*/
void print_list(List* array, int length){
int i;
for(i = 0; i < length; i++){
Node* curr = array[i];
printf(" -\n|%d|", i);
while(curr->next != NULL)
{
printf("%d ->", curr->value);
curr = curr->next;
}
printf("NULL = %d\n -\n", list_sum(array[i]));
}
}
无法正确打印的任何原因?如果我尝试在create_list()函数本身中执行任何形式的打印,它会打印值。
答案 0 :(得分:1)
代码中存在一些问题,请检查
create_list(List * array,FILE * fp),在此函数中,如果要为内存分配内存 然后它不会反射回调用者,因为它被视为单个指针。
假设您已将数组定义为“list * array”,因此应将其更改为take 双指针create_list(List **数组,FILE * fp),应调用如下
create_list(&amp; array,fp);
array = malloc(sizeof(List)); ,在此,它将只为阵列分配4个字节 (考虑到你在32位机器上运行),因为指针的大小是4个字节
所以以下导致分段错误
for(i = 0; i < length; i++)
{
//(*array)[i] = NULL;
array[i] = NULL;
}
将分配更改为数组代码,如下所示:
array = malloc(sizeof(list)* length);
列表构造也没有,为什么还要拿指数呢?是什么目的 这个指数值?
没有索引列表可以构造为(这里对数组的分配也没有 需要)
list * head = NULL;
而(!FEOF(FP)) {
fscanf(fp, "%d %d", &index, &value);
Node* node = new_node(value);
if(NULL == node)
{
//error , you can return from here
}
if(NULL == list)
{
head = node;
}
else
{
node->next = head;
head = node;
}
}
* arrary = head;