我正在尝试根据节点数n
在双链表中插入元素。就像n
为4
一样,输入的元素数量为: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");
}
}
}
答案 0 :(得分:3)
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;
}
....
答案 1 :(得分:3)
您正尝试在此处取消引用NULL指针:
if(start==NULL)
{
printf("Hi I am null!\n");
tmp->prev=NULL;
start->prev=tmp; //start is NULL
由于指向struct start
的指针未指向任何内存,因此您无法使用它来指示数据。
答案 2 :(得分:1)
你有一个无限的while循环。完成插入列表后设置一些变量。从开关盒出来后检查这个变量,然后再从while循环中断。