厦门大学数据结构期末考试单链表问题

因为过几天要去参加厦门大学的夏令营,提前刷了下厦门大学往年的期末考试试卷。

卷中有这么一道题目:

 

有一个单链表,其结点的元素值以递增顺序排列,给出数据结构,并编写一个算法删除该单链表中元素值相同的结点。

 

算法如下:

从头到尾扫描单链表,若当前结点和后继结点的值不相同,则指针后移,若相同,则删除该后继结点。

 1 #include "stdio.h"
 2 
 3 typedef struct Node{
 4     int data;
 5     struct Node *next;
 6 }Node, *LinkList;
 7 
 8 void InitList(LinkList *L)
 9 {
10     (*L) = (LinkList)malloc(sizeof(Node));
11     (*L)->next = NULL;
12 }
13 
14 void creat(LinkList p)
15 {
16     Node *s;
17     int flag = 1, num;
18     while(flag)
19     {
20         scanf("%d", &num);
21         if(num >= 0)
22         {
23             s = (LinkList)malloc(sizeof(Node));
24             s->data = num;
25             s->next = p->next;
26             p->next = s;
27         }
28         else
29         {
30             flag = 0;
31         }
32     }
33 }
34 
35 void print(LinkList p)
36 {
37     Node *s = p->next;
38     if(s == NULL)
39         printf("NULL\n");
40     while(s != NULL)
41     {
42         printf("%d ", s->data);
43         s = s->next;
44     }
45     printf("\n");
46 }
47 
48 void deleta_same(LinkList p)
49 {
50     Node *q, *s = p->next;
51     if(s == NULL)
52         printf("NULL\n");
53     while(s->next != NULL)
54     {
55         if(s->data != s->next->data)
56             s = s->next;
57         else
58         {
59             q = s->next;
60             s->next = q->next;
61             free(q);
62         }
63     }
64 }
65 
66 int main()
67 {
68     Node *p;
69     InitList(&p);
70     creat(p);
71     print(p);
72     deleta_same(p);
73     print(p);
74 }

 

posted @ 2017-07-11 16:44  大波非猫  阅读(1012)  评论(1编辑  收藏  举报