1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define PERR printf("FILE: %s, FUNCTION: %s, LINE: %d\n",\
5 __FILE__, __func__, __LINE__)
6
7 struct Tnode
8 {
9 struct Tnode *next;
10 int value;
11 };
12
13 void Del_Repeat_Node(struct Tnode **head)
14 {
15 if(NULL == head || NULL == *head){
16 return;
17 }
18
19 struct Tnode *pnode = *head, *fnode = NULL;
20
21 while(pnode ->next != *head)
22 {
23 if(pnode->next->value == pnode->value)
24 {
25 fnode = pnode->next;
26 pnode->next = fnode->next;
27 free(fnode);
28 continue;
29 }
30 pnode = pnode->next;
31 }
32 if((*head)->next == *head)//当(或删除后只有)只有一个节点
33 return ;
34 if(pnode->value == (*head)->value)//当尾结点的value也等于头结点的value
35 {
36 fnode = *head;
37 pnode->next = fnode->next;
38 *head = pnode;
39 free(fnode);
40 }
41 }
42
43 //以下为测试代码
44 //插入结点到表头
45 int Insert_to_head(struct Tnode **head, int value)
46 {
47 struct Tnode *new_node =
48 (struct Tnode *)calloc(1, sizeof(struct Tnode));
49 if(NULL == new_node){
50 perror("malloc");
51 return -1;
52 }
53 //填充结点信息
54 new_node->value = value;
55 new_node->next = NULL;
56
57 if(*head == NULL)
58 {
59 *head = new_node;
60 (*head)->next = *head;
61 }
62 else
63 {
64 struct Tnode *tail = *head;
65 while(tail->next != *head)
66 tail = tail->next;
67
68 new_node->next = *head;
69 tail->next = new_node;
70 *head = new_node;
71 }
72 return 0;
73 }
74
75 //遍历链表
76 int traverse_link(struct Tnode *head)
77 {
78 if(NULL == head)
79 return -1;
80 struct Tnode *pnode = head;
81 while(pnode->next != head)
82 {
83 printf("%d\t", pnode->value);
84 pnode = pnode->next;
85 }
86
87 printf("%d\n", pnode->value);
88
89 return 0;
90 }
91
92
93 int main()
94 {
95 int i;
96 struct Tnode *head = NULL;
97
98 Insert_to_head(&head, 1);
99
100 Insert_to_head(&head, 1);
101
102
103 Insert_to_head(&head, 1);
104 Insert_to_head(&head, 2);
105 Insert_to_head(&head, 2);
106
107 Insert_to_head(&head, 1);
108
109 traverse_link(head);
110
111 Del_Repeat_Node(&head);
112
113 traverse_link(head);
114
115 return 0;
116 }