您的位置:首页 > 其它

含有头结点双向循环链表

2017-05-21 18:36 288 查看
1 #include <stdio.h>         /*含有头结点双向循环链表*/
2 #include <stdlib.h>
3
4 #define T 1
5 #define F 2
6
7 typedef int ElementType;
8 typedef int Boolean;
9
10 struct Node
11 {
12     struct Node* prior;
13     ElementType value;
14     struct Node* next;
15 };
16
17 typedef struct Node* node;
18
19 Boolean insert_tail(node head, ElementType value);   /*尾插*/
20 Boolean insert_head(node head, ElementType value);   /*头插*/
21 Boolean insert_index(node head, ElementType value, int index);  /*指定位置插入新值*/
22 Boolean delete_index(node head, int index);             /*指定位置删除*/
23 Boolean delete_value(node head, ElementType value);     /*指定数据删除*/
24 Boolean update_index(node head, ElementType value, int index);   /*指定位置修改数据*/
25 Boolean update_value(node head, ElementType old_value, ElementType new_value);  /*将数据修改*/
26 Boolean quary_index(node head, int index);   /*指定位置察值*/
27 Boolean quary_value(node head, ElementType value);  /*指定数据的位置*/
28
29 Boolean init(node* head);       /*初始化*/
30 int length(node head);    /*除去头结点的总长度*/
31 void printP(node head);   /*前驱打印*/
32 void printN(node head);   /*后驱打印*/
33
34 int main()
35 {
36     int i;
37     node head = NULL;
38
39     init(&head);
40     for (i = 0; i < 10; i++)
41     {
42         insert_head(head, i);
43     }
44     printN(head);
45     printP(head);
46
47     for (i = 0; i < 10; i++)
48     {
49         insert_tail(head, i);
50     }
51     printN(head);
52     printP(head);
53     printf("length = %d\n", length(head));
54
55     insert_index(head, 99, 0);
56     insert_index(head, 99, 11);
57     insert_index(head, 99, length(head));
58     printN(head);
59     printP(head);
60
61     delete_index(head, 0);
62     delete_index(head, 10);
63     delete_index(head, length(head)-1);
64     printN(head);
65     printP(head);
66
67     delete_value(head, 0);
68     printN(head);
69     printP(head);
70
71     update_index(head, 88 , 1);
72     update_index(head, 88 , length(head)-2);
73     printN(head);
74
75     update_value(head, 88 , 888);
76     printN(head);
77
78     quary_index(head, 1);
79     quary_index(head, length(head)-2);
80
81     quary_value(head, 88);
82     quary_value(head, 888);
83
84     return 0;
85 }
86
87 Boolean quary_index(node head, int index)
88 {
89     if (index < 0 || index > length(head))
90     {
91         return F;
92     }
93     int i;
94     for (i = 0; i < index; i++)
95     {
96         head = head->next;
97     }
98     printf("find = %d index =%d\n", head->next->value, index);
99
100     return T;
101 }
102
103 Boolean quary_value(node head, ElementType value)
104 {
105     node temp = head;
106     int i = 0;
107     int count = 0;
108     while (temp->next != head)
109     {
110         if (temp->next->value == value)
111         {
112             i++;
113             printf("find = %d index = %d\n", value, count );
114         }
115         count++;
116         temp = temp->next;
117     }
118     if (0 == i)
119     {
120         printf("no this value\n");
121     }
122     return T;
123 }
124
125 Boolean update_index(node head, ElementType value, int index)
126 {
127     if (index < 0 || index > length(head))
128     {
129         return F;
130     }
131     int i;
132     for (i = 0; i < index; i++)
133     {
134         head = head->next;
135     }
136     head->next->value = value;
137
138     return T;
139 }
140
141 Boolean update_value(node head, ElementType old_value, ElementType new_value)
142 {
143     node temp = head;
144     while (temp->next != head)
145     {
146         if (temp->next->value == old_value)
147         {
148             temp->next->value = new_value;
149         }
150             temp = temp->next;
151     }
152     return T;
153 }
154 Boolean delete_index(node head, int index)
155 {
156     if (index < 0 || index > length(head))
157     {
158         return F;
159     }
160     int i;
161     for (i = 0; i < index; i++)
162     {
163         head = head->next;
164     }
165
166     node temp = head->next->next;
167     free(head->next);
168     head->next = temp;
169     temp->prior = head;
170
171     return 0;
172
173 }
174
175 Boolean delete_value(node head, ElementType value)
176 {
177    node temp = head;
178    while (temp->next != head)
179    {
180        if (temp->next->value == value)
181        {
182            node temp2 = temp->next->next;
183            free(temp->next);
184            temp->next = temp2;
185            temp2->prior = temp;
186        }
187        else
188        {
189            temp = temp->next;
190        }
191    }
192     return T;
193 }
194
195 Boolean insert_index(node head, ElementType value, int index)
196 {
197     node temp = head;
198     node newnode = (node)malloc(sizeof(struct Node));
199     if (NULL == newnode)
200     {
201         return F;
202     }
203     if (index < 0 || index > length(head))
204     {
205         return F;
206     }
207     newnode->value = value;
208     int i;
209     for (i = 0; i < index; i++)
210     {
211         temp = temp->next;
212     }
213     newnode->next = temp->next;
214     temp->next = newnode;
215     newnode->next->prior = newnode;
216     newnode->prior = temp;
217
218     return T;
219
220 }
221
222 Boolean insert_head(node head, ElementType value)
223 {
224     node newnode = (node)malloc(sizeof(struct Node));
225     if (NULL == newnode)
226     {
227         return F;
228     }
229     newnode->value = value;
230
231     newnode->next = head->next;
232     head->next = newnode;
233     newnode->next->prior = newnode;
234     newnode->prior = head;
235
236     return T;
237 }
238
239 Boolean insert_tail(node head, ElementType value)
240 {
241     node newnode = (node)malloc(sizeof(struct Node));
242     if (NULL == newnode)
243     {
244         return F;
245     }
246     newnode->value = value;
247
248     head->prior->next = newnode;
249     newnode->next = head;
250     newnode->prior = head->prior;
251     head->prior = newnode;
252
253     return T;
254 }
255 int length(node head)
256 {
257     int count = 0;
258     node temp = head;
259     while (temp->next != head)
260     {
261         count++;
262         temp = temp->next;
263     }
264     return count;
265 }
266
267 Boolean init(node* head)
268 {
269     node newnode = (node)malloc(sizeof(struct Node));
270     if (NULL == newnode)
271     {
272         return F;
273     }
274     newnode->next = newnode;
275     newnode->prior = newnode;
276
277     *head = newnode;
278
279      return T;
280 }
281
282 void printP(node head)
283 {
284     node temp = head;
285     while (temp->prior != head)               /*temp->prior->prior */
286     {
287         printf("%d ", temp->prior->value);
288         temp = temp->prior;
289     }
290     printf("\n");
291
292 }
293 void printN(node head)
294 {
295     node temp = head;
296     while (temp->next != head)  /*temp->next->next */
297     {
298         printf("%d ", temp->next->value);
299         temp = temp->next;
300     }
301     printf("\n");
302
303 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: