C语言单链表的删除指定元素操作。

#include<stdio.h>#include<stdlib.h>typedefintElemType;typedefvoidStatus;typedefstruct... #include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef void Status;

typedef struct Node
{
ElemType data;
struct Node *next;
}LNode, *LinkList;

Status CreatList(int ,LinkList );
Status Traverse(LinkList );
Status FreeList(LinkList );
ElemType DelElem(LinkList ,ElemType ,ElemType );

int main()
{
int Length;
ElemType e;
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("Input the Length of List:\n");
scanf("%d",&Length);

CreatList(Length,L);

printf("Travers the List :\n");
Traverse(L);
DelElem(L,3,e);
Traverse(L);
FreeList(L);
printf("List release Success!\n");
system("PAUSE");
return 0;
}

Status CreatList(int Length,LinkList L)
{
int i;
LinkList Body;
for (i=0;i<Length;i++)
{
Body=(LinkList)malloc(sizeof(LNode));
L->next=Body;
printf("Input the %dth num:\n",i+1);
scanf("%d",&(Body->data));
L=Body;
}
Body->next=NULL;
}
Status FreeList(LinkList L)
{
LinkList temp;
while (L->next!=NULL)
{
temp=L->next;
free(L);
L=temp;
}
free(L);
}
Status Traverse(LinkList L)
{
while (L->next!=NULL)
{
printf("%d ",L->next->data);
L=L->next;
}
printf("\n");
}
ElemType DelElem(LinkList L,ElemType elem,ElemType e)
{
LinkList p,q;
p=L;
q=p->next;
while(q!=NULL)
{

if((q->data)==elem)
{
e=elem;
p->next=q->next;
free(q);

return e;
}
else
{
p=p->next;
q=p;
}
}
}
我这个DelElem函数哪里写的不对,执行完删除指定元素的操作之后就出乱码了。。。求大神帮忙改改
展开
 我来答
匿名用户
推荐于2017-09-24
展开全部
你的DeleteElem我有些看不懂
根据你想要的功能,给改了一下--
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef void Status;

typedef struct Node
{
ElemType data;
struct Node *next;
}LNode, *LinkList;

Status CreatList(int ,LinkList );
Status Traverse(LinkList );
Status FreeList(LinkList );
ElemType DelElem(LinkList ,ElemType );

int main()
{
int Length;
ElemType e;
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("Input the Length of List:\n");
scanf("%d",&Length);

CreatList(Length,L);

printf("Travers the List :\n");
Traverse(L);
while(1)
{
printf("请输入要删除的元素:\n");
scanf("%d",&e);
if(DelElem(L,e))//在L中将元素e删除
{printf("删除%d后:\n",e);break;}
printf("未找到该元素,删除失败\n");
}
Traverse(L);
FreeList(L);
printf("List release Success!\n");
//system("PAUSE");return 0已经使程序暂停了
return 0;
}

Status CreatList(int Length,LinkList L)
{
int i;
LinkList Body=NULL,p=L;
for (i=0;i<Length;i++)
{
Body=(LinkList)malloc(sizeof(LNode));
p->next=Body;
printf("Input the %dth num:\n",i+1);
scanf("%d",&(Body->data));
p=Body;
}
Body->next=NULL;
}
Status FreeList(LinkList L)
{
LinkList temp=NULL,p=L;
while (p)
{
temp=p->next;
free(p);
p=temp;
}
}
Status Traverse(LinkList L)
{
LinkList p=L;
p=p->next;
while(p)//while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
ElemType DelElem(LinkList L,ElemType e)
{
LinkList p,q;
q=p=L;
p=p->next;//p指向头结点后第一个元素
while(p)
{
if(p->data==e)
{
q->next=p->next;
free(p);
return 1;
}
else{
q=p;//q始终指向p上一个结点
p=p->next;
}

}

//没有执行上个return,说明没找到
return 0;

}
帖桖卉084
2011-06-13 · 超过17用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:48.5万
展开全部
DelElem函数里
else
{
p=p->next;
q=p->next;
}
如果是你那样q=p;q与p指向同一个地址怎么会对呢?
希望你采纳。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b79519e
2011-06-13 · TA获得超过3399个赞
知道大有可为答主
回答量:1417
采纳率:100%
帮助的人:1336万
展开全部
程序写的不错,正如楼上所言,改成q=p->next 或者 q=q->next,后者也许更容易看懂
呵呵
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式