C语言链表删除问题
就是先创建一个链表比如3>2>1,然后我想删除2.但是我不会写删除函数,帮忙看看。我的创建函数是正确的,还有我想在删除函数中顺便打印出删除后的结果谢谢了#include<...
就是先创建一个链表比如3>2>1,然后我想删除2.但是我不会写删除函数,帮忙看看。我的创建函数是正确的,还有我想在删除函数中顺便打印出删除后的结果 谢谢了
#include<stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node*next;
}*linklist;
linklist creat()
{int x;
linklist l,p;
l=(linklist)malloc(sizeof(struct node));
l->next=NULL;
scanf("%d",&x);
while(x!=0)
{
p=(linklist)malloc(sizeof(struct node));
p->data=x;
p->next=l->next;
l->next=p;
scanf("%d",&x);}return l;
}
void prin(linklist l)
{
l=l->next;
while(l)
{
printf("%d%s", l->data, l->next?"->":"\n");
l=l->next;
}
}
void remove(linklist l,int x)
{ linklist a;
l=l->next;
while(l)
{
if(l->data==x);
free(a);
l=l->next;}
while(l)
{
printf("%d%s", l->data, l->next?"->":"\n");
l=l->next;
}
}
int main()
{
linklist a;
int n;
a=creat();
prin(a);
printf("输入删除元素");
scanf("%d",&n);
remove(a,n);
return 0;
} 展开
#include<stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node*next;
}*linklist;
linklist creat()
{int x;
linklist l,p;
l=(linklist)malloc(sizeof(struct node));
l->next=NULL;
scanf("%d",&x);
while(x!=0)
{
p=(linklist)malloc(sizeof(struct node));
p->data=x;
p->next=l->next;
l->next=p;
scanf("%d",&x);}return l;
}
void prin(linklist l)
{
l=l->next;
while(l)
{
printf("%d%s", l->data, l->next?"->":"\n");
l=l->next;
}
}
void remove(linklist l,int x)
{ linklist a;
l=l->next;
while(l)
{
if(l->data==x);
free(a);
l=l->next;}
while(l)
{
printf("%d%s", l->data, l->next?"->":"\n");
l=l->next;
}
}
int main()
{
linklist a;
int n;
a=creat();
prin(a);
printf("输入删除元素");
scanf("%d",&n);
remove(a,n);
return 0;
} 展开
4个回答
展开全部
所谓链表,就是用指针将内存中动态分配的结点空间,链接起来成一个表。
所以,建表的过程即是每次为新结点分配内存;因此,释放空间的话,也要从头到尾,一个一个结点的释放,这样才能全部释放掉。
这段代码释放了整个链表空间内存;while循环的作用是从头到尾释放后续结点,如果直接free(pHead)则后面的结点将无法找到,那么造成内存空间泄露。
另外,你的while循环存在一个错误,假设释放了倒数第一个结点后,pHead指向最后一个结点,而最后一个结点的next为NULL,那么这样最后一个结点也没有释放掉,while就退出了。
所以,建表的过程即是每次为新结点分配内存;因此,释放空间的话,也要从头到尾,一个一个结点的释放,这样才能全部释放掉。
这段代码释放了整个链表空间内存;while循环的作用是从头到尾释放后续结点,如果直接free(pHead)则后面的结点将无法找到,那么造成内存空间泄露。
另外,你的while循环存在一个错误,假设释放了倒数第一个结点后,pHead指向最后一个结点,而最后一个结点的next为NULL,那么这样最后一个结点也没有释放掉,while就退出了。
追问
大神,那应该怎么修改
展开全部
这个就需要你判断了,你首先需要将链表的数据全部遍历一遍,在遍历的同时就判断该数据是否为你要删除的数据,如果是,就删除,继续遍历……一直到结束,这样就可以吧1全部删除了。
满意请采纳!
满意请采纳!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
BOOL remove(linklist l, int x)
{
linklist p=l->next;
if(!p)
{
printf("Empty linklist!\n");
return FALSE;
}
while(p&&p->data!=x) p=p->next;
if(!p)
{
printf("Designated data not found!\n");
return FALSE;
}
if(p->next!=NULL)
{
linklist q=p->next;
p->data=q->data;
p->next=q->next;
free(q);
}
else
{
linklist q=l;
while(q->next!=p) q=q->next;
q->next=NULL;
free(p);
}
prin(l);
return TRUE;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
num
应该是链表节点的一个属性
比如
int
num;
num
!
=
p->num;是一句判断语句,在判断
当前节点p的num值
是否与
查询的num值相同,如果相同,代表这个节点就是需要删除的
应该是链表节点的一个属性
比如
int
num;
num
!
=
p->num;是一句判断语句,在判断
当前节点p的num值
是否与
查询的num值相同,如果相同,代表这个节点就是需要删除的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询