C 中的双链表中出现意外错误



我正在尝试根据n节点数在双链表中插入元素。就像如果n4那么输入的元素数量是:34 45 32 1但得到segmentation fault。谁能告诉我哪里出错了?

#include<stdio.h>
#include<malloc.h>
struct node{
            struct node *prev;
            struct node *next;
            int info;
            }*start;
create_list(int num)
{
 printf("Hi I entered!n");
 struct node *q,*tmp;
 tmp= malloc(sizeof(struct node));
 tmp->info=num;
 tmp->next=NULL;
 if(start==NULL)
 {
  printf("Hi I am null!n");
  tmp->prev=NULL;
  start->prev=tmp;
  start=tmp;
 }
 else
 {
  printf("Hi I am no more null!n");
  q=start;
  while(q->next!=NULL)
  q=q->next;
  q->next=tmp;
  tmp->prev=q;
  }
}


int main(){
int choice, n, elem,i;
start = NULL;
 printf("Enter your choice of number: n");
 scanf("%d", &choice);
 while(1)
      {
switch(choice)
{
  case 1:
     printf("Enter the number of nodes: n");
     scanf("%d", &n);
     for(i=0; i<n; i++)
     {
       printf("Enter the elemnts: n");
       scanf("%d", &elem);
       create_list(elem);
     }
     break;
 default:
         printf("You have tyoed wrong!n");
     }
   }
 }
if(start==NULL)
{
  ...
  start->prev=tmp;

如果start为 NULL,则上面的赋值不正确。

我建议在分配新节点时将prev初始化为 NULL,如下所示:

tmp= malloc(sizeof(struct node));
tmp->info=num;
tmp->next=NULL;
tmp->prev=NULL;        // add this
if(start==NULL)
{
    printf("Hi I am null!n");
    start=tmp;
}
....

您正在尝试在此处取消引用 NULL 指针:

if(start==NULL)
{
    printf("Hi I am null!n");
    tmp->prev=NULL;
    start->prev=tmp;    //start is NULL

由于指向结构start的指针不指向任何内存,因此不能使用它来存储数据。

你有一个无限的while循环。在完成插入列表后设置一些变量。从开关外壳出来后检查此变量,然后再次从 while 循环中断。

相关内容

  • 没有找到相关文章

最新更新