我编写了一个用于在第n个位置插入节点的代码 当用户在节点中输入1位数字时,它可以完美地工作,但是当用户输入等于或大于两位数字时,它将继续以无限循环打印最后一个节点。
我无法弄清楚出了什么问题。我的代码在
之下#include<stdio.h>
#include<stdlib.h>
struct st
{
int roll;
char name[20];
struct st *next;
};
void add_middle(struct st **ptr)
{
struct st *temp,*temp1;
temp=malloc(sizeof(struct st ));
printf("netre ur name\n");
scanf("%s",temp->name);
printf("enter ur roll\n");
scanf("%d",&(temp->roll));
if((*ptr==NULL)||(temp->roll<(*ptr)->roll))
{
temp->next=*ptr;
*ptr=temp;
}
else
{
temp1=*ptr;
while(temp1)
{
if((temp1->next==NULL)||(temp1->next->roll>temp->roll))
{
temp1->next=temp;
temp->next=temp1->next;
break;
}
temp1=temp1->next;
}
}
}
void display(struct st *ptr)
{
while(ptr)
{
printf("%s %d\n",ptr->name,ptr->roll);
ptr=ptr->next;
}
}
main()
{
struct st *headptr=0;
add_middle(&headptr);`
add_middle(&headptr);
add_middle(&headptr);
display(headptr);
}
答案 0 :(得分:4)
让我们看看插入新节点时会发生什么:
temp1->next = temp;
temp->next = temp1->next;
这将使前一个节点(temp1
)指向新节点,这很好。然后它会让新节点(temp
)指向自身(temp1->next == temp
),这很糟糕。
要解决此问题,您只需交换这两行即可。那就是:
if ((temp1->next==NULL) || (temp1->next->roll > temp->roll)) {
temp->next = temp1->next;
temp1->next = temp;
break;
}
此外,如果您使用更好的变量名称,这可能会更清楚:
temp1
变为previousNode
temp
变为newNode