#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *next;
} *first = NULL;
void insert() {
struct node *temp;
struct node *nn = (struct node*)malloc(sizeof(struct node));
printf("enter the data\n");
scanf("%d", &nn->data);
temp = first;
while (temp->next != first)
temp = temp->next;
temp->next = nn;
nn->next = NULL;
}
void display() {
struct node *temp;
temp = first;
if (temp == NULL) {
printf("no elements\n");
return;
}
printf("elements in linked list are\n");
while (temp != NULL) {
printf("%d\n", temp->data);
temp = temp->next;
}
}
void deletion() {
struct node *temp;
temp = first;
first = first->next;
temp->next = NULL;
free(temp);
}
int main() {
int op;
do {
printf("1.insertion\n2.deletion\n3.display\n4.exit\n");
printf("enter option\n");
scanf("%d", &op);
switch (op) {
case 1:
insert();
break;
case 2:
deletion();
break;
case 3:
display();
break;
}
} while (op != 6);
}
这是为单个链表编写的程序,同时执行获取错误分段错误。请提出解决此问题的建议。 我得到以下输出:
./out
1.insertion
2.deletion
3.display
4.exit
enter option
1
enter the data
23
Segmentation fault
答案 0 :(得分:2)
temp=first; /* first is null */
while(temp->next!=first)
temp=temp->next;
...所以你试图访问NULL->next
,显然你得到一个SEG FAULT,使用调试器:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004006af in insert () at demo.c:17
17 while(temp->next!=first)
答案 1 :(得分:1)
insert
包含代码
temp=first;
while(temp->next!=first)
(其中first
是一个全局变量,最初是NULL
)。第一次运行时,while
循环立即取消引用NULL
指针。这有不确定的后果,但是段错并不奇怪。
要解决此问题,您可以将insert
更改为
void insert()
{
struct node *nn=malloc(sizeof(*nn));
if (nn == NULL) {
/* handle oom */
}
printf("enter the data\n");
scanf("%d",&nn->data);
nn->next=NULL;
if (first == NULL) {
first = nn;
}
else {
struct node *temp=first;
while(temp->next!=NULL)
temp=temp->next;
temp->next=nn;
}
}
请注意,这包括一些不同的更改
first==NULL
视为特例nn->next = NULL
malloc
的回报
sizeof(*nn))
稍微更具未来证明(如果您稍后更改nn
的类型,它仍会有效)malloc
可能会在低内存中返回NULL
答案 2 :(得分:1)
在您的第一个Insert
中,变量first
为NULL
...
您需要检查变量是否为null,不执行循环。
将您的插入代码更改为:
void insert()
{
struct node *temp;
struct node *nn=(struct node*)malloc(sizeof(struct node));
printf("enter the data\n");
scanf("%d",&nn->data);
if(first!=NULL){
temp=first;
while(temp->next!=first)
temp=temp->next;
temp->next=nn;
}else{
first=nn;
}
nn->next=NULL;
}
答案 3 :(得分:1)
您的insert()
函数包含temp=first;
但first
为空,您正在temp->next!=first
执行,null->next!=first
这是不正确的。
要解决此问题,请检查first
是否为空,
struct node *temp;
struct node *nn=(struct node*)malloc(sizeof(struct node));
printf("enter the data\n");
scanf("%d",&nn->data);
nn->next=null;
if(first==null)
{
first=nn;
}
else
{
temp=first;
while(temp->next!=null)
temp=temp->next;
temp->next=nn;
}
答案 4 :(得分:1)
使用
while(temp!=NULL)
取代
while(temp->next!=NULL)
答案 5 :(得分:0)
// insert element using recursion
Node *insetlinklist(Node *head,Node*mhead,int data,int position)
{
Node *newNode=NULL;
// printf("%d,%d %d %x\n",position,mhead->data,data,mhead);
if(position==0 && mhead->next==NULL && head->next==NULL){
newNode = (Node*)malloc(sizeof(Node));
newNode->next=NULL;
newNode->data=data;
newNode->next=head;
head=newNode;
return head;
}
if(position ==0){
newNode = (Node*)malloc(sizeof(Node));
newNode->next=NULL;
newNode->data=data;
newNode->next=head->next;
head->next =newNode;
return head;
}
if(mhead->next!=NULL){
head =mhead;
insetlinklist(head,mhead->next,data,position-1);
}
else
insetlinklist(head,mhead,data,0);
// printf("%d,%d\n",position,head->data);
return head;
}
void printL(Node*head){
Node *temp =head;
while(temp!=NULL){
printf("Data =%d\n",temp->data);
temp = temp->next;
}
}
Node* InsertNth(Node *head, int data, int position)
{
Node *temp =head;
// printL(head);
head= insetlinklist(head,temp,data,position);
// printL(head);
// printf("END\n");
return head;
// Complete this method only
// Do not write main function.
}