你能帮我理解为什么链表上的下面代码会给我一个分段错误错误吗?

时间:2017-06-14 19:23:35

标签: c pointers linked-list

我是编程新手并开始使用C,我编写了这个链表问题。我以为我做的是,

  • 将指针指向全局,以便从任何地方访问它并最初将其设置为null
  • 在插入代码中,创建相同类型的新指针并分配内存并为其提供插入的数据。指向此第一个插入数据当前的点头指针
  • 进行下一次插入并在头部进行迭代并迭代直到结束并使最后一个节点的下一个节点指向当前节点并将当前节点设为空
  • 同样,对于显示传递在头部并迭代直到结束并打印

我在这里缺少什么可以有人帮助我为什么我的第二个输入出现分段错误错误以及如何纠正它? 是否应该对显示功能进行任何更改?

#include<stdio.h>
#include<stdlib.h>

void insert(int data_add);
void display();
struct list
{
  int data;
  struct list *next;
} *head = NULL;

int main()
{
  int data_add,n;
  while(1)
  {

    printf("\n\n1.Add\n2.Display\n3.Exit\n");
    scanf("%d",&n);
    switch(n)
    {
      case 1: printf("\nEnter the element to add ");
              scanf("%d",&data_add);
              insert(data_add);
              break;
      case 2: printf("The nos are: ");
              display();
              break;
      case 3: exit(1);
      break;
      default: printf("\nOpen your eyes");
    }
  }
}

void insert(int add)
{
  struct list *current,*temp;
  current  = (struct list*) malloc (sizeof(struct list));
  current->data = add;
  if(head == NULL)
  {
    head = current;
    current->next = NULL;
  }
  else
    {
      for(temp = head; temp!=NULL;temp = temp->next);
      temp->next = current;
      current->next = NULL;

    }
}

void display()
{
  struct list *current;
  current = head;
  while(current!=NULL)
  {
    printf("%d",current->data);
    current = current->next;
}
}

3 个答案:

答案 0 :(得分:2)

想想这段代码:

  for(temp = head; temp!=NULL;temp = temp->next);
  temp->next = current;

那么,结束循环的条件是temp != NULL那么,循环运行后temp是什么? NULL,当然!

您的停止条件必须为temp->next != NULL

旁注:是时候学习使用调试器了。有了足够的经验,你只需查看代码即可发现这些事情,但也有更复杂的失败方法;)使用调试器,你会立即发现这个问题。

答案 1 :(得分:2)

您正在尝试:

NULL->next = current

相反,在你的for循环中你应该检查

temp->next != NULL

答案 2 :(得分:0)

我认为问题出在下面的代码中:

else{
  for(temp = head; temp!=NULL;temp = temp->next);
    temp->next = current;
    current->next = NULL;
}

当for循环中断时, temp 变为NULL,因此您不应访问 temp-&gt; next

您可以按以下方式更改代码:

void insert(int add)
{
  struct list *current,*temp;
  current  = (struct list*) malloc (sizeof(struct list));
  current->data = add;
  if(head == NULL)
  {
    head = current;
    current->next = NULL;
  }
  else
    {
      //for(temp = head; temp!=NULL;temp = temp->next);
      temp = head;
      while(true){
        if(temp->next == NULL)
          break;
        temp = temp->next;
      }
      temp->next = current;
      current->next = NULL;

    }
}