为什么链接列表中的追加功能不起作用?

时间:2018-03-05 18:44:13

标签: c

程序在想要将节点添加到链表时(在执行追加功能时)会出现运行时错误。

我测试了'创建'和'前置'功能,他们正确地完成了他们的部分。

#include <stdio.h>
#include <stdlib.h>
struct Node {
    int data ;
    struct Node* next ;
};

struct Node* Head=NULL ;

struct Node* create(int ,struct Node*);
struct Node* prepend(int ,struct Node*);
struct Node* traverse(struct Node*);
struct Node* append(int ,struct Node*);

int main()
{
    int data =4 , i ;
    Head = prepend(data,Head);
    for(i=0;i<3;i++){
        scanf("%d",&data);
        append(data,Head);
    }
    return 0;
}

创建用于添加新节点的func

 struct Node* create(int data ,struct Node* Head){
        struct Node* newNode = (struct Node*)malloc(sizeof(struct Node*));
        if(newNode == NULL){
            printf("Error\n");
            exit(0);
        }
        newNode -> data = data ;
        newNode -> next = Head ;
        return newNode ;
    }

在链接列表的第一个位置添加新节点:

struct Node* prepend(int data ,struct Node* Head){
        struct Node* newNode = create(data,Head);
        Head = newNode ;
        return Head ;
    }

用于返回上次创建的节点:

struct Node* traverse(struct Node* Head){
    struct Node* cursor = Head ;
    while(cursor->next != NULL || cursor->next != Head){
        cursor = cursor->next ;
    }
    return cursor ;
}

用于将新节点添加到链接列表的末尾:

struct Node* append(int data ,struct Node* Head){
    struct Node* newNode = create(data,Head);
    struct Node* cursor = traverse(Head);
    cursor->next = newNode ;
    return newNode ;
}

2 个答案:

答案 0 :(得分:1)

你没有用

分配足够的字节
   struct Node* newNode = (struct Node*)malloc(sizeof(struct Node*));

sizeof(struct Node *)是指针的大小,您的结构包含一个指针+另一个字段,因此该行为是未定义的行为。

一种正确的方法(在解除引用的指针上使用sizeof来获得正确的大小&amp;而不是转换malloc的返回值:

   struct Node* newNode = malloc(sizeof(*newNode));

第二个问题出在您的traverse函数中。当您执行cursor = cursor->next时,cursor可以是NULL,并且您可以在下一次迭代中重新测试cursor->next。只需迭代列表&amp;记住最后一个非NULL节点(并放弃Head作为下一个元素的测试,因为它不可能:

struct Node* traverse(struct Node* Head){
    struct Node* cursor = Head;
    struct Node* retval = cursor;
    while (cursor != NULL) {
        retval = cursor;
        cursor = cursor->next;
    }
    return retval;
}

答案 1 :(得分:0)

改变这个: struct Node* newNode = (struct Node*)malloc(sizeof(struct Node*));

到此: struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

分段错误错误来自遍历功能和while状态。似乎NULL值不能用于比较,我现在想知道为什么!顺便改变这个功能,然后再试一次:

struct Node* traverse(struct Node* Head){
  struct Node* cursor = Head ;    
  while(cursor->next){
      if(cursor->next == Head)
          break;
      cursor = cursor->next ;
  }
  return cursor ;
}