题目要求:
我的代码实现:
#include<stdio.h>
#include<stdlib.h>
//单链表结点的数据类型定义:
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* link;
}LNode,*LinkList;
LinkList List_TailInsert(LinkList &L)
{
int x;
L=(LinkList)malloc(sizeof(LNode));
L->link=NULL;
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->link=NULL;
r->link=s;
r=s;
scanf("%d",&x);
}
return L;
}
//对本题的解答:
LinkList DeleteSame(LinkList &L,int n)
{
//这个数组用于表示哪些链表元素出现过了,出现过了,对应下标的数组元素为1,否则为0;
int c[n+1]={0};
LNode *p=L->link,*q=L->link->link,*s;
p->link=NULL;
while(q)
{
if(p->data>=0)c[p->data]=1;
else c[0-p->data]=1;
s=q;
q=q->link;
if((s->data<0&&c[0-s->data]==1)||(s->data>=0&&c[s->data]==1))free(s);
else{
p->link=s;
p=s;
p->link=NULL;
}
}
return L;
}
//...................................
//销毁这个链表:
void DestroyLinkList(LinkList &L)
{
LNode* p;
while(L)
{
p=L;
L=L->link;
free(p);
}
return;
}
void ShowList(LinkList L)
{
LNode *p=L->link;
while(p)
{
printf("%d ",p->data);
p=p->link;
}
printf("\n");
}
int main()
{
LinkList L;
int n;
printf("使用尾插法构造单链表L:\n");
L=List_TailInsert(L);
printf("\n请输入n的值:\n");
scanf("%d",&n);
L=DeleteSame(L,n);
printf("\n处理之后:\n");
ShowList(L);
DestroyLinkList(L);
return 0;
}