数据结构实验之链表七:单链表中重复元素的删除

题目描述

按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。

输入

第一行输入元素个数n; 
第二行输入n个整数。

输出

第一行输出初始链表元素个数; 
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。

示例输入

10
21 30 14 55 32 63 11 30 55 30

示例输出

10
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21

提示

 

来源

不得使用数组!

示例程序

View Code
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef struct node
 4 {
 5     int data;
 6     struct node *next;
 7 }st;
 8 void traverse(st *head)
 9 {
10     st *p;
11     p = head->next;
12     while(p->next)
13     {
14         printf("%d ",p->data);
15         p = p->next;
16     }
17     printf("%d\n",p->data);
18 }
19 st *creat(int n)
20 {
21     st *head,*p;
22     int t;
23     head = (st *)malloc(sizeof(st));
24     head->next = NULL;
25     t = n;
26     while(n--)
27     {
28         p = (st *)malloc(sizeof(st));
29         scanf("%d",&p->data);
30         p->next = head->next;
31         head->next = p;
32     }
33     printf("%d\n",t);
34     traverse(head);
35     return head;
36 }
37 void del(st *head,int n)
38 {
39     st *p,*q,*t;
40     int i = 0,flag = 1;
41     p = head->next;
42     t = p;
43     while(p)
44     {
45         t = p;
46         q = p->next;
47         while(q)
48         {
49             if(q->data!=p->data)
50             {
51                 q = q->next;
52                 t = t->next ;
53             }
54             else
55             {
56                 t->next = q->next;
57                 free(q);
58                 i++;
59                 q = t->next;
60                 flag = 0;
61             }
62         }
63         p = p->next;
64     }
65     printf("%d\n",n-i);
66     traverse(head);
67 }
68 int main()
69 {
70     st *head;
71     int n;
72     scanf("%d", &n);
73     head = creat(n);
74     del(head,n);
75     return 0;
76 }
原文地址:https://www.cnblogs.com/yelan/p/2872352.html