欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构之带头结点带环的双向链表

程序员文章站 2024-03-22 11:16:58
...
  1 #include <stdio.h>
  2 #include"dlinklist.h"
  3 void dlinklist_init(dlinklist **head)//初始化带头结点带环的双链表                                         
  4 {
  5     if(head == NULL)
  6     {
  7         return;
  8     }
  9     *head = dcreat(0);
 10 }

 11 dlinklist *dcreat(dlinktype value)//创建一个新节点
 12 {
 13     dlinklist *newnode =(dlinklist *) malloc(sizeof(dlinklist));
 14     newnode->next = newnode;
 15     newnode->prev = newnode;
 16     newnode->data = value;
 17     return newnode;
 18 }

 19 void dlinklist_print(dlinklist *head)//打印函数
 20 {
 21     if(head == NULL)
 22     {
 23         return;//非法输入
 24     }
 25     else
 26     {
 27         dlinklist *cur1 = head->next;
 28         dlinklist *cur2 = head->prev;
 29         while(cur1 != head)
 30         {
 31             printf("[%c|%p] ",cur1->data,cur1);
 32             cur1 = cur1->next;
 33         }
 34         printf("\n");
 35         while(cur2 != head)
 36         {
 37             printf("[%c|%p] ",cur2->data,cur2);
 38             cur2 = cur2->prev;
 39         }
 40         printf("\n");
 41         return;
 42     }
 43 }

 44 void dlinklist_pushback(dlinklist *head,dlinktype value)//尾插
 45 {
 46     if(head == NULL)
 47     {
 48         return;//非法输入
 49     }
 50     else
 51     {
 52         dlinklist *cur = dcreat(value);
 53         dlinklist *cur2=head->prev;
 54         cur2->next = cur;                                                       
 55         cur->prev = cur2;
 56         head->prev = cur;
 57         cur->next = head;
 58         return;
 59 
 60     }
 61 }

 62 void dlinklist_popback(dlinklist *head)//尾删
 63 {
 64     if(head == NULL)
 65     {
 66         return;//非法输入
 67 
 68     }
 69     if(head->next == head)
 70     {
 71         return;
 72     }
 73     else
 74     {
 75         dlinklist *cur1 = head->prev;
 76         cur1->prev->next = head;
 77         head->prev = cur1->prev;
 78         free(cur1);
 79     }
 80 }

 81 void dlinklist_pushfront(dlinklist *head,dlinktype value)//头插
 82 {                                                                               
 83     if(head == NULL)
 84     {
 85         return;//非法输入
 86     }
 87     else
 88     {
 89         dlinklist *cur = head->next;
 90         dlinklist *new = dcreat(value);
 91         new->next = cur;
 92         cur->prev = new;
 93         new->prev = head;
 94         head->next = new;
 95     }
 96 }
 97 

 98 void dlinklist_popfront(dlinklist *head)//头删
 99 {
100     if(head == NULL)
101     {
102         return;
103     }
104     if(head->next == head)
105     {
106         return;
107     }
108     else
109     {                                                                           
110         dlinklist *cur = head->next;
111         head->next = cur->next;
112         cur->next->prev = head;
113         free(cur);
114     }
115 }                                     

116 dlinklist * dlinklist_find(dlinklist *head,dlinktype value)//查找value的地址
117 {
118     if(head == NULL)
119     {
120         return NULL;
121     }
122     else
123     {
124         dlinklist *cur = head->next;
125         while(cur != head)
126         {
127             if(cur->data==value)
128             {
129                 return cur;
130             }
131             cur = cur->next;
132         }
133         return NULL;
134     }
135 }
136 
137 

138 void dlinklist_pushleft(dlinklist *head,dlinklist *pos,dlinktype value)//在指定位置的左边插
139 {
140     if(head == NULL)
141     {
142         return;
143     }
144     else                                                                        
145     {
146         dlinklist *cur1 = pos->prev;
147         dlinklist *cur2 = dcreat(value);
148         cur1->next = cur2;
149         cur2->prev = cur1;
150         cur2->next = pos;
151         pos->prev = cur2;
152 
153     }
154 }

155 void dlinklist_pushright(dlinklist *head,dlinklist *pos,dlinktype value)//在指定位置的右边插
156 {
157     if(head == NULL)
158     {
159         return;
160     }
161     else
162     {
163         dlinklist *cur1 = pos->next;
164         dlinklist *cur2 = dcreat(value);
165         pos->next = cur2;
166         cur2->prev = pos;
167         cur1->prev = cur2;
168         cur2->next = cur1;
169     }
170 }

171 void dlinklist_erase(dlinklist *head,dlinklist *pos)//删除指定位置的节点
172 {
173     if(head == NULL)
174     {
175         return;
176     }
177     dlinklist *cur1 = pos->prev;
178     dlinklist *cur2 = pos->next;
179     cur1->next = cur2;
180     cur2->prev = cur1;
181     free(pos);
182 
183 }

184 void dlinklist_remove(dlinklist *head,dlinktype value)//删除指定元素
185 {
186     if(head == NULL)
187     {
188         return;
189     }
190     if(head->next == head)
191     {
192         return;
193     }
194     else
195     {
196         dlinklist *pos = dlinklist_find(head,value);                            
197         dlinklist_erase(head,pos);
198 
199     }
200 }

201 void dlinklist_removeall(dlinklist *head,dlinktype value)//删除所有value的节点
202 {
203     if(head == NULL)
204     {
205         return;
206     }
207     if(head->next == head)
208     {
209         return;
210     }
211     else
212     {
213         dlinklist *cur = head->next;
214         while(cur!=head)
215         {
216             dlinklist *pos = dlinklist_find(head,value);
217             if(pos == NULL)
218             {
219                 return;
220             }
221             dlinklist_erase(head,pos);
222             cur = cur->next;
223         }
224     }
225 } 

226 size_t dlinklist_size(dlinklist *head)//求链表的长度
227 {
228     if(head == NULL)
229     {
230         return;
231     }                                                                           
232     else
233     {
234         size_t count = 0;
235         dlinklist *cur = head->next;
236         while(cur != head)
237         {
238             count++;
239             cur = cur->next;
240         }
241         return count;
242     }
243 }
244 

245 int dlinklist_isempty(dlinklist *head)//判断链表是否为空
246 {
247     if(head == NULL)
248     {
249         return -1;
250     }
251     else
252     {
253         if(head->next == head)
254         {
255             return 0;
256         }
257         return 1;
258 
259     }
260 }

261 /////////////////////////
262 //下面是测试函数
263 ///////////////////////////
264 void test_dlinklist_pushback()
265 {
266     HEADER;
267     dlinklist *head;
268     dlinklist_init(&head);
269     printf("尾插四个节点\n");
270     dlinklist_pushback(head,'a');
271     dlinklist_pushback(head,'b');
272     dlinklist_pushback(head,'c');
273     dlinklist_pushback(head,'d');
274     dlinklist_print(head);
275     printf("\n");
276 }
277 
278 
279 void test_dlinklist_popback()
280 {
281     HEADER;
282     dlinklist *head;
283     dlinklist_init(&head);                                                      
284     printf("尾插四个节点\n");
285     dlinklist_pushback(head,'a');
286     dlinklist_pushback(head,'b');
287     dlinklist_pushback(head,'c');
288     dlinklist_pushback(head,'d');
289     dlinklist_print(head);
290     printf("尾删一个节点\n");
291     dlinklist_popback(head);
292     dlinklist_print(head);
293 
294 }
295 
296 void test_dlinklist_pushfront()
297 {
298     HEADER;
299     dlinklist *head;
300     dlinklist_init(&head);
301     printf("头插四个节点\n");
302     dlinklist_pushfront(head,'a');
303     dlinklist_pushfront(head,'b');
304     dlinklist_pushfront(head,'c');
305     dlinklist_pushfront(head,'d');
306     dlinklist_print(head);
307 
308 }
309 
310 void test_dlinklist_popfront()
311 {
312     HEADER;                                                                     
313     dlinklist *head;
314     dlinklist_init(&head);
315     printf("尾插四个节点\n");
316     dlinklist_pushback(head,'a');
317     dlinklist_pushback(head,'b');
318     dlinklist_pushback(head,'c');
319     dlinklist_pushback(head,'d');
320     dlinklist_print(head);
321     printf("头删一个节点");
322     dlinklist_popfront(head);
323     dlinklist_print(head);
324 
325 }
326 void test_dlinklist_find()
327 {
328     HEADER;
329     dlinklist *head;
330     dlinklist_init(&head);
331     printf("尾插四个节点\n");
332     dlinklist_pushback(head,'a');
333     dlinklist_pushback(head,'b');
334     dlinklist_pushback(head,'c');
335     dlinklist_pushback(head,'d');
336     dlinklist_print(head);
337     dlinklist *pos=dlinklist_find(head,'c');
338     printf("查找c的位置\n");
339     printf("[%c|%p]\n",pos->data,pos);
340 
341 }                                                                               
342 
343 void test_dlinklist_pushleft()
344 {
345     HEADER;
346     dlinklist *head;
347     dlinklist_init(&head);
348     printf("尾插四个节点\n");
349     dlinklist_pushback(head,'a');
350     dlinklist_pushback(head,'b');
351     dlinklist_pushback(head,'c');
352     dlinklist_pushback(head,'d');
353     printf("在b的前面插入一个x\n");
354     dlinklist_pushleft(head,dlinklist_find(head,'b'),'x');
355     dlinklist_print(head);
356 
357 }
358 void test_dlinklist_pushright()
359 {
360     HEADER;
361     dlinklist *head;
362     dlinklist_init(&head);
363     printf("尾插四个节点\n");
364     dlinklist_pushback(head,'a');
365     dlinklist_pushback(head,'b');
366     dlinklist_pushback(head,'c');
367     dlinklist_pushback(head,'d');
368     printf("在b的后面插入一个x\n");
369     dlinklist_pushright(head,dlinklist_find(head,'b'),'x');
370     dlinklist_print(head);                                                      
371 }
372 void test_dlinklist_erase()
373 {
374     HEADER;
375     dlinklist *head;
376     dlinklist_init(&head);
377     printf("尾插四个节点\n");
378     dlinklist_pushback(head,'a');
379     dlinklist_pushback(head,'b');
380     dlinklist_pushback(head,'c');
381     dlinklist_pushback(head,'d');
382     dlinklist_print(head);
383     printf("删除第二个节点\n");
384     dlinklist_erase(head,dlinklist_find(head,'b'));
385     dlinklist_print(head);
386 
387 
388 }
389 void test_dlinklist_remove()
390 {
391     HEADER;
392     dlinklist *head;
393     dlinklist_init(&head);
394     printf("尾插四个节点\n");
395     dlinklist_pushback(head,'a');
396     dlinklist_pushback(head,'b');
397     dlinklist_pushback(head,'c');
398     dlinklist_pushback(head,'d');
399     dlinklist_remove(head,'c');                                                 
400     dlinklist_print(head);
401 
402 }
403 
404 void test_dlinklist_removeall()
405 {
406     HEADER;
407     dlinklist *head;
408     dlinklist_init(&head);
409     printf("尾插四个节点\n");
410     dlinklist_pushback(head,'a');
411     dlinklist_pushback(head,'b');
412     dlinklist_pushback(head,'b');
413     dlinklist_pushback(head,'c');
414     dlinklist_pushback(head,'b');
415     dlinklist_pushback(head,'d');
416     dlinklist_print(head);
417     dlinklist_removeall(head,'b');
418     dlinklist_print(head);
419 }
420 
421 void test_dlinklist_size()
422 {
423     HEADER;
424     dlinklist *head;
425     dlinklist_init(&head);
426     printf("尾插四个节点\n");
427     dlinklist_pushback(head,'a');
428     dlinklist_pushback(head,'b');                                               
429     dlinklist_pushback(head,'c');
430     dlinklist_pushback(head,'d');
431     dlinklist_print(head);
432     size_t i = dlinklist_size(head);
433     printf("%u",i);
434 
435 }
436 void test_dlinklist_isempty()
437 {
438     HEADER;
439     dlinklist *head;
440     dlinklist_init(&head);
441     printf("尾插四个节点\n");
442     dlinklist_pushback(head,'b');
443     dlinklist_pushback(head,'b');
444     dlinklist_pushback(head,'b');
445     dlinklist_pushback(head,'b');
446     dlinklist_print(head);
447     printf("判断是否为空,空返回0,非空返回1\n");
448     int i = dlinklist_isempty(head);
449     printf("%d\n",i);
450 
451 }
452 int main()
453 {
454     test_dlinklist_pushback();
455     test_dlinklist_popback();
456     test_dlinklist_pushfront();
457     test_dlinklist_popfront();                                                  
458     test_dlinklist_find();
459     test_dlinklist_pushleft();
460     test_dlinklist_pushright();
461     test_dlinklist_erase();
462     test_dlinklist_remove();
463     test_dlinklist_removeall();
464     test_dlinklist_size();  
465     test_dlinklist_isempty();
466     return 0;
467 }