题目要求:
我的代码实现:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
//尾插法(有头结点)
LinkList List_HeadInsert(LinkList &L)
{
ElemType x;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
LNode *r=L,*s;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
r->next=s;
r=s;
scanf("%d",&x);
}
return L;
}
//本题的解答:
void FindXDelete(LinkList &L,ElemType x)
{
LNode *pre=L,*q=L->next;
while(q)
{
if(q->data==x)
{
pre->next=q->next;
free(q);
q=pre->next;
}
else
{
q=q->next;
pre=pre->next;
}
}
return;
}
//................................
//打印链表内所有元素
void ShowList(LinkList L)
{
LNode *p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
return;
}
//彻底销毁整个链表
void DestroyList(LinkList &L)
{
LNode *p=L->next,*q;
while(p)
{
q=p;
p=p->next;
free(q);
}
free(L);
return;
}
int main()
{
ElemType x;
LinkList L;
printf("\n构造带头结点的单链表L:\n");
L=List_HeadInsert(L);
printf("你想要去除什么元素:\n");
scanf("%d",&x);
FindXDelete(L,x);
printf("\n输出处理之后的链表:\n");
ShowList(L);
DestroyList(L);
return 0;
}
一边遍历一遍查找一边删除,一趟搞定。