这道题的算法思想就是逆序建立一个单链表,然后逐个比较并删除其中的重复元素,在删除结点时需找到其前一个结点的位置。
代码如下:
#include <stdio.h>
#include <malloc.h>
struct node{/*单链表的定义*/
int data;
struct node* next;
};
struct node* Createlist(int n){/*逆序建立单链表*/
struct node* head,*p;
int i,d;
head=(struct node*)malloc(sizeof(struct node));
head->next=NULL;
for(i=1;i<=n;i++){
p=(struct node*)malloc(sizeof(struct node));
scanf("%d",&d);
p->data=d;
p->next=head->next;
head->next=p;
}
return head;
};
int main(){
int n,i;
struct node* head,*p,*t,*q;
scanf("%d",&n);
head=Createlist(n);
printf("%d\n",n);
for(p=head->next;p!=NULL;p=p->next){
if(p==head->next)
printf("%d",p->data);
else
printf(" %d",p->data);
}
printf("\n");
for(p=head->next;p!=NULL;p=p->next){/*寻找重复元素并删除*/
for(q=p->next;q!=NULL;q=q->next){
t=head;
if(p->data==q->data){
while(t->next!=q)/*找到要删除结点的前一个结点*/
t=t->next;
t->next=q->next;
n--;
}
}
}
printf("%d\n",n);
for(p=head->next;p!=NULL;p=p->next){
if(p==head->next)
printf("%d",p->data);
else
printf(" %d",p->data);
}
return 0;
}