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

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

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  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值