C语言 在链表的第n个位置增加一个包含多位数的节点



我编写了一个代码,用于在第n个位置插入一个节点。
当用户在节点中输入1位数字时,它会正常工作,但当用户输入等于或大于2位数字时,它只会在无限循环中继续打印最后一个节点。

我不知道出了什么问题。我的代码在 下面
#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 namen");
    scanf("%s",temp->name);
    printf("enter ur rolln");
    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 %dn",ptr->name,ptr->roll);
        ptr=ptr->next;
    }
}
main()
{
    struct st *headptr=0;
    add_middle(&headptr);`
        add_middle(&headptr);
    add_middle(&headptr);
    display(headptr);
}

让我们看看插入新节点时会发生什么:

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

相关内容

  • 没有找到相关文章

最新更新