删除第一个节点时无限循环

时间:2013-11-08 17:47:22

标签: c linked-list

在链接列表中,在尝试创建程序以查找和删除链接列表中的元素时,我无法删除第一个节点。

我的计划:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
struct node
{
    int num;
    struct node *next;
}*start=NULL;
typedef struct node NODE;
main()
{
    NODE *t,*u,*v;
    int i,n,f=1;;
    for(i=0;i<=20;i+=2)
    {
        t=(NODE*)malloc(sizeof(NODE));
        t->num=i;
        t->next=NULL;
        if(start==NULL)
        {
            start=t;
            u=t;
        }
        else
        {
            u->next=t;
            u=t;
        }
    }
    t=start;
    while(t!=NULL)
    {
        printf("%d-->",t->num);
        t=t->next;
    }
    printf("NULL\nEnter Any value to delete");
    scanf("%d",&n);
    t=start;
    u=t;
    while(t!=NULL)
    {
        if(t->num==n)
        {
            u->next=t->next;
            v=t;
            t=t->next;
            free(v);
            f=0;
            break;
        }
        else
        {
            u=t;
            t=t->next;

        }
    }
    system("cls");
    if(f)
        printf("Not found\n");
    else
        printf("Deleted\n");
    t=start;
    while(t!=NULL)
    {
        printf("%d-->",t->num);
        t=t->next;
    }
    printf("NULL");
}

当我输入要删除的第一个节点的值时,除了第一个节点的元素之外的所有元素都适用于无限循环。

2 个答案:

答案 0 :(得分:1)

当您删除第一个节点时,这意味着您要删除链接列表的起始地址,您需要通过添加以下代码行手动检查第一个节点:

if(start->num==n)
{
t=start;
start=start->next;
free(t);
}else

您的完整代码是:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
struct node
{
    int num;
    struct node *next;
}*start=NULL;
typedef struct node NODE;
main()
{
    NODE *t,*u,*v;
    int i,n,f=1;;
    for(i=0;i<=20;i+=2)
    {
        t=(NODE*)malloc(sizeof(NODE));
        t->num=i;
        t->next=NULL;
        if(start==NULL)
        {
            start=t;
            u=t;
        }
        else
        {
            u->next=t;
            u=t;
        }
    }
    t=start;
    while(t!=NULL)
    {
        printf("%d-->",t->num);
        t=t->next;
    }
    printf("NULL\nEnter Any value to delete");
    scanf("%d",&n);
    t=start;
    u=t;
    if(start->num==n)
    {
        f=0;
        start=start->next;
        free(t);//t is start
    }
    else
    while(t!=NULL)
    {
        if(t->num==n)
        {
            u->next=t->next;
            v=t;
            t=t->next;
            free(v);
            f=0;
            break;
        }
        else
        {
            u=t;
            t=t->next;

        }
    }
    system("cls");
    if(f)
        printf("Not found\n");
    else
        printf("Deleted\n");
    t=start;
    while(t!=NULL)
    {
        printf("%d-->",t->num);
        t=t->next;
    }
    printf("NULL");
}

答案 1 :(得分:0)

在删除

之前添加if语句
   if(start == t) 
        start->next = t->next;

最后你指定t = start所以它进入无限循环,因为t-&gt; next是null所以你总是有空值。

因为在你使用的最后一个循环中:

   t=start;
   while(t!=NULL)
   {
       printf("%d-->",t->num);
      t=t->next;
   }

因此,如果您释放了第一个节点,那么您也释放了启动指针,并且t将是无效循环来自的NULL。