题目描述
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
输入
第一行输入元素个数n;
第二行输入n个整数。
第二行输入n个整数。
输出
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
示例输入
10 21 30 14 55 32 63 11 30 55 30
示例输出
10 30 55 30 11 63 32 55 14 30 21 730 55 11 63 32 14 21
#include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }; struct node *create(int n) { int i; struct node *head,*p; head=(struct node*)malloc(sizeof(struct node)); head->next=NULL; for(i=0;i<n;i++) { p=(struct node*)malloc(sizeof(struct node)); scanf("%d",&p->data); p->next=head->next; head->next=p; } return (head); }; void print(struct node *p) { struct node *h=p->next; while(h!=NULL) { if(h->next==NULL) printf("%d",h->data); else printf("%d ",h->data); h=h->next; } } void num(struct node *p) { int i; i=0; struct node *h=p->next; while(h!=NULL) { i++; h=h->next; } printf("%d",i); } void del(struct node *h) { struct node *q,*p,*t; p=h->next; while(p!=NULL) { q=p; while(q->next!=NULL) { if(p->data==q->next->data) { t=q->next; q->next=t->next; free(t); } else q=q->next; } p=p->next; } } int main() { int n; scanf("%d",&n); struct node *p; p=create(n); num(p); printf("\n"); print(p); printf("\n"); del(p); num(p); printf("\n"); print(p); return 0; }