我是编程新手并开始使用C,我编写了这个链表问题。我以为我做的是,
我在这里缺少什么可以有人帮助我为什么我的第二个输入出现分段错误错误以及如何纠正它? 是否应该对显示功能进行任何更改?
#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;
}
}
答案 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;
}
}