数据结构实验之链表七:单链表中重复元素的删除
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
Input
第一行输入元素个数 n (1 <= n <= 15);
第二行输入 n 个整数,保证在 int 范围内。
Output
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
Example Input
10 21 30 14 55 32 63 11 30 55 30
Example Output
10 30 55 30 11 63 32 55 14 30 21 7 30 55 11 63 32 14 21
Hint
Author
不得使用数组!
Answer:
01 | #include<stdio.h> |
02 | #include<stdlib.h> |
03 | #include<string.h> |
04 | struct node |
05 | { |
06 | int data ; |
07 | struct node *next; |
08 | }; |
09 |
10 | struct node *creat( int n) |
11 | { |
12 | struct node *head,*p; |
13 | head=( struct node*) malloc ( sizeof ( struct node)); |
14 | head->next=NULL; |
15 | while (n--) |
16 | { |
17 | p=( struct node*) malloc ( sizeof ( struct node)); |
18 | scanf ( "%d" ,&p->data); |
19 | p->next=head->next; |
20 | head->next=p; |
21 | } |
22 | return head; |
23 | }; |
24 |
25 | int del( struct node *head, int n) |
26 | { |
27 | struct node *p, *tail, *t; |
28 | p=head->next; //p指向第一个节点 |
29 | while (p!=NULL) //当p不是最后一个节点时,就继续查找重复节点 |
30 | { |
31 | tail=p; |
32 | t=tail->next; |
33 | while (t!=NULL) |
34 | { |
35 | if (p->data==t->data) |
36 | { |
37 | tail->next=t->next; |
38 | free (t); |
39 |
40 | t=tail->next; |
41 | n--; |
42 | } |
43 | else |
44 | { |
45 | tail=tail->next; |
46 | t=t->next; |
47 | } |
48 |
49 | } |
50 | p=p->next; |
51 | } |
52 | return n; |
53 | } |
54 |
55 | void show( struct node *head) |
56 | { |
57 | struct node *p; |
58 | p=head->next; |
59 | while (p!=NULL) |
60 | { |
61 | if (p->next!=NULL) |
62 | { |
63 | printf ( "%d " ,p->data); |
64 | } |
65 | else |
66 | { |
67 | printf ( "%d\n" ,p->data); |
68 | } |
69 | p=p->next; |
70 | } |
71 | } |
72 |
73 | int main() |
74 | { |
75 | int n,m; |
76 | struct node *head; |
77 | scanf ( "%d" ,&n); |
78 | head=creat(n); |
79 | printf ( "%d\n" ,n); |
80 | show(head); |
81 | m=del(head,n); |
82 | printf ( "%d\n" ,m); |
83 | show(head); |
84 | return 0; |
85 | } |
86 |
87 |