因为过几天要去参加厦门大学的夏令营,提前刷了下厦门大学往年的期末考试试卷。
卷中有这么一道题目:
有一个单链表,其结点的元素值以递增顺序排列,给出数据结构,并编写一个算法删除该单链表中元素值相同的结点。
算法如下:
从头到尾扫描单链表,若当前结点和后继结点的值不相同,则指针后移,若相同,则删除该后继结点。
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 "); 40 while(s != NULL) 41 { 42 printf("%d ", s->data); 43 s = s->next; 44 } 45 printf(" "); 46 } 47 48 void deleta_same(LinkList p) 49 { 50 Node *q, *s = p->next; 51 if(s == NULL) 52 printf("NULL "); 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 }