在链接列表中,在尝试创建程序以查找和删除链接列表中的元素时,我无法删除第一个节点。
我的计划:
#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");
}
当我输入要删除的第一个节点的值时,除了第一个节点的元素之外的所有元素都适用于无限循环。
答案 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。