C使用链接列表数组模拟传递参考

时间:2014-03-20 02:25:00

标签: c linked-list segmentation-fault structure pass-by-reference

我在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()函数本身中执行任何形式的打印,它会打印值。

1 个答案:

答案 0 :(得分:1)

代码中存在一些问题,请检查

  1. create_list(List * array,FILE * fp),在此函数中,如果要为内存分配内存 然后它不会反射回调用者,因为它被视为单个指针。

    假设您已将数组定义为“list * array”,因此应将其更改为take 双指针create_list(List **数组,FILE * fp),应调用如下

    create_list(&amp; array,fp);

  2. array = malloc(sizeof(List)); ,在此,它将只为阵列分配4个字节 (考虑到你在32位机器上运行),因为指针的大小是4个字节

    所以以下导致分段错误

    for(i = 0; i < length; i++)
    {
       //(*array)[i] = NULL;
       array[i] = NULL;
    }
    

    将分配更改为数组代码,如下所示:

    array = malloc(sizeof(list)* length);

  3. 列表构造也没有,为什么还要拿指数呢?是什么目的 这个指数值?

    没有索引列表可以构造为(这里对数组的分配也没有 需要)

    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;