数据结构(16)循环链表

今天记录下循环链表,其实循环链表也就是将单链表中最后一个数据元素的next指针指向第一个元素。

        这里有一个概念需要说明下:

                游标:在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素

        如图

 

     数据结构(16)循环链表_第1张图片

        这里介绍静态链表的常用操作:

                         l 创建循环链表

                         l 销毁循环链表

                         l 清空�%@E�环链表

                         l 获取表长度

                         l 把node插入pos位置

                         l 获取pos位置的元素

                         l 删除pos位置的元素

                         l 删除表中与node相同的元素(删除第一个匹配成功的)

                         l 重置游标

                         l 返回游标所指向的结点

                         l 游标后移

             

        代码总分为三个文件:

                CircleList.h : 放置功能函数的声明,以及表的声明,表结点的定义 

  nbsp;             CircleList.c : 放置功能函数的定义,以及表的定义

                Main.c    : 主函数,使用功能函数完成各种需求,不过一般用作测试

       整体结构图为:

数据结构(16)循环链表_第2张图片

       这里详细说下插入操作和删除操作:

 

              插入操作:

                     如图

                     数据结构(16)循环链表_第3张图片

                     插入元素方法:

                            判断表和插入位置是否合法

                            由表头开始通过next域移动pos次后,当前元素的next域为要插入的位置

                            将新元素插入(和单链表插入方法相同)

                            表长度加1

                            判断是否为头插(就是头结点和首元素中间插入)

                            如果是头插的话,把尾结点的next域指向第一个元素(也就是头节点所指向的首元素)

                            如果之前表为空表,则游标指向插入的结点

  

            删除操作:

                   如图

                    数据结构(16)循环链表_第4张图片

                   删除元素方法:

                          判断表和插入位置是否合法

                          由表头开始通过next域移动pos次后,当前元素的next指向的元素为要删除的元素

                          删除元素�%@C�和单链表删除元素相同)

                          表长度减1

                          判断是否删除的为首元素

                          如果删除的是首元素的话,把表尾结点的next域指向首元素

                          如果删除后表为空,则重置头结点的next域和游标

                          如果删除的结点正好游标也指向它,则游标后移

   

OK! 上代码:

CircleList.h

[cpp]  view plain copy
  1. #ifndef _CIRCLELIST_H_  
  2. #define _CIRCLELIST_H_  
  3.   
  4. typedef void CircleList;  
  5. typedef struct _tag_CircleListNode CircleListNode;  
  6.   
  7. struct _tag_CircleListNode  
  8. {  
  9.     CircleListNode* next;  
  10. };  
  11.   
  12. CircleList* CircleList_Create();  
  13.   
  14. void CircleList_Destroy(CircleList* list);  
  15.   
  16. void CircleList_Clear(CircleList* list);  
  17.   
  18. int CircleList_Length(CircleList* list);  
  19.   
  20. int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);  
  21.   
  22. CircleListNode*&lbsp;CircleList_Get(CircleList* list, int pos);  
  23.   
  24. CircleListNode* CircleList_Delete(CircleList* list, int pos);  
  25.   
  26. CircleListNode* CircleList_DeleteNode(CircleLiqt* list, CircleListNode* node);  
  27.   
  28. CircleListNode* CircleList_Reset(CircleList* list);  
  29.   
  30. CircleListNode* CircleList_Current(CircleList* list);  
  31.   
  32. CircleListNode* CircleList_Next(CircleList* list);  
  33.   
  34. #endif  


CircleList.c

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3. #include "CircleList.h"  
  4.   
  5. typedef struct _tag_CircleList  
  6. {  
  7.     CircleListNode header;  
  8.     CircleListNode* slider;  
  9.     int length;  
  10. }TCircleList;  
  11.   
  12. CircleList* CircleList_Create()  
  13. {  
  14.     TCircleList* sList = (TCircleList*)malloc(sizeof(TCircleList));  
  15.       
  16.     if(NULL != sList)  
  17.     {  
  18.         sList->header.next = NULL;  
  19.         sList->slider = NULL;  
  20.         sList->length = 0;  
  21.     }  
  22.       
  23.     return sList;  
  24. }  
  25.   
  26. void CircleList_Destroy(CircleList* list)  
  27. {  
  28.     free(list);  
  29. }  
  30.   
  31. void CircleList_Clear(CircleList* list)  
  32. {  
  33.     TCircleList* sList = (TCircleList*)list;  
  34.       
  35.     if(NULL != sList)  
  36.     {  
  37.         sList->header.next = NULL;  
  38.         sList->slider = NULL;  
  39.         sList->length = 0;  
  40.     }  
  41. }  
  42.   
  43. int CircleList_Length(CircleList* list)  
  44. {  
  45.     TCircleList* sList = (TCircleList*)list;  
  46.       
  47.     int ret = -1;  
  48.       
  49.     if(NULL != sList)  
  50.     {  
  51.         ret = sList->length;  
  52.     }  
  53.       
  54.     return ret;  
  55. }  
  56.   
  57. int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)  
  58. {  
  59.     TCircleList* sList = (TCircleList*)list;  
  60.       
  61.     int ret = (NULL!=sList)&&(NULL!=node)&&(0<=pos);  
  62.       
  63.     int i = 0;  
  64.       
  65.     if(ret)  
  66.     {  
  67.         CircleListNode* current = (CircleListNode*)sList;  
  68.           
  69.         for(i=0; (i<pos)&&(current->next!=NULL); i++)  
  70.         {  
  71.             current = current->next;  
  72.         }  
  73.           
  74.         node->next = current->next;  
  75.         current->next = node;  
  76.           
  77.         if(0 == sList->length)  
  78.         {  
  79.             sList->slider = node;  
  80.         }  
  81.           
  82.         sList->length++;  
  83.           
  84.         if(current == (CircleListNode*)sList)  
  85.         {  
  86.             CircleListNode* last = CircleList_Get(sList, sList->length-1);  
  87.               
  88.             last->next = current->next;  
  89.         }  
  90.     }  
  91.       
  92.     return ret;  
  93. }  
  94.   
  95. CircleListNode* CircleList_Get(CircleList* list, int pos)  
  96. {  
  97.     TCircleList* sList = (TCircleList*)list;  
  98.       
  99.     CircleListNode* ret = NULL;  
  100.       
  101.     int i = 0;  
  102.       
  103.     if((NULL != sList)&&(0 < sList->length))  
  104.     {  
  105.         CircleListNode* current = (CircleListNode*)sList;  
  106.           
  107.         for(i=0; i<pos; i++)  
  108.         {  
  109.             current = current->next;   
  110.         }  
  111.           
  112.         ret = current->next;  
  113.     }  
  114.       
  115.     return ret;  
  116. }  
  117.   
  118. CircleListNode* CircleList_Delete(CircleList* list, int pos)  
  119. {  
  120.     TCircleList* sList = (TCircleList*)list;  
  121.       
  122.     CircleListNode* ret = NULL;  
  123.       
  124.     int i = 0;  
  125.       
  126.     if((NULL != sList)&&(0 <= pos)&&(0 < sList->length))  
  127.     {  
  128.         CircleListNode* current = (CircleListNode*)sList;  
  129.         CircleListNode* last = NULL;  
  130.           
  131.         for(i=0; i<pos; i++)  
  132.         {  
  133.             current = current->next;  
  134.         }  
  135.           
  136.         ret = current->next;  
  137.         current->next = ret->next;  
  138.           
  139.         sList->length--;  
  140.           
  141.         if(current == (CircleListNode*)sList)  
  142.         {  
  143.             last = (CircleListNode*)CircleList_Get(sList, sList->length-1);  
  144.         }  
  145.           
  146.         if(NULL != last)  
  147.         {  
  148.             sList->header.next = ret->next;  
  149.             last->next = ret->next;  
  150.         }  
  151.           
  152.         if(ret == sList->slider)  
  153.         {  
  154.             sList->slider = ret->next;  
  155.         }  
  156.           
  157.         if(0 == sList->length)  
  158.         {  
  159.             sList->slider = NULL;  
  160.             sList->header.next = NULL;  
  161.         }  
  162.     }  
  163.       
  164.     return ret;  
  165. }  
  166.   
  167. CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)  
  168. {  
  169.     TCircleList* sList = (TCircleList*)list;  
  170.       
  171.     CircleListNode* ret = NULL;  
  172.       
  173.     int i = 0;  
  174.       
  175.     if((NULL != sList)&&(NULL != node))  
  176.     {  
  177.         CircleListNode* current = (CircleListNode*)sList;  
  178.           
  179.         for(i=0; i<sList->length; i++)  
  180.         {  
  181.             if(node == current->next)  
  182.             {  
  183.                 ret = current->next;  
  184.                 break;  
  185.             }  
  186.               
  187.             current = current->next;  
  188.         }  
  189.           
  190.         if(NULL != ret)  
  191.         {  
  192.             CircleList_Delete(sList, i);  
  193.         }  
  194.     }  
  195.       
  196.     return ret;  
  197. }  
  198.   
  199. CircleListNode* CircleList_Reset(CircleList* list)  
  200. {  
  201.     TCircleList* sList = (TCircleList*)list;  
  202.       
  203.     CircleListNode* ret = NULL;  
  204.       
  205.     if(NULL != sList)  
  206.     {  
  207.         sList->slider = sList->header.next;  
  208.         ret = sList->slider;  
  209.     }  
  210.       
  211.     return ret;  
  212. }  
  213.   
  214. CircleListNode* CircleList_Current(CircleList* list)  
  215. {  
  216.     TCircleList* sList = (TCircleList*)list;  
  217.       
  218.     CircleListNode* ret = NULL;  
  219.       
  220.     if(NULL != sList)  
  221.     {  
  222.         ret = sList->slider;  
  223.     }  
  224.       
  225.     return ret;  
  226. }  
  227.   
  228. CircleListNode* CircleList_Next(CircleList* list)  
  229. {  
  230.     TCircleList* sList = (TCircleList*)list;  
  231.       
  232.     CircleListNode* ret = NULL;  
  233.       
  234.     if(NULL != sList)  
  235.     {  
  236.         ret = sList->slider;  
  237.         sList->slider = ret->next;  
  238.     }  
  239.       
  240.     return ret;  
  241. }  


Main.c

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include "CircleList.h"  
  4.   
  5. typedef struct _tag_Value  
  6. {  
  7.     CircleListNode header;  
  8.     int v;  
  9. }Value;  
  10.   
  11. int main(void)  
  12. {  
  13.     int i = 0;  
  14.       
  15.     CircleList* list = CircleList_Create();  
  16.       
  17.     Value v1,v2,v3,v4,v5,v6,v7,v8;  
  18.       
  19.     v1.v=1, v2.v=2, v3.v=3, v4.v=4;  
  20.     v5.v=5, v6.v=6, v7.v=7, v8.v=8;  
  21.       
  22.     CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));  
  23.     CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));  
  24.     CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));  
  25.     CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));  
  26.     CircleList_Insert(list, (CircleListNode*)&v5, 5);  
  27.       
  28.     CircleList_Delete(list, 0);  
  29.       
  30.     for(i=0; i<2*CircleList_Length(list); i++)  
  31.     {  
  32.         Value* p = (Value*)CircleList_Get(list, i);  
  33.           
  34.         printf("%d ", p->v);  
  35.     }  
  36.     printf("\n");  
  37.       
  38.     while(CircleList_Length(list) > 0)  
  39.     {  
  40.         Value* p = (Value*)CircleList_Delete(list, 0);  
  41.           
  42.         printf("%d ", p->v);  
  43.     }  
  44.     printf("\n");  
  45.       
  46.     CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));  
  47.     CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));  
  48.     CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));  
  49.     CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));  
  50.     CircleList_Insert(list, (CircleListNode*)&v5, CircleList_Length(list));  
  51.     CircleList_Insert(list, (CircleListNode*)&v6, CircleList_Length(list));  
  52.     CircleList_Insert(list, (CircleListNode*)&v7, CircleList_Length(list));  
  53.     CircleList_Insert(list, (CircleListNode*)&v8, CircleList_Length(list));  
  54.       
  55.     for(i=0; i<CircleList_Length(list); i++)  
  56.     {  
  57.         Value* p = (Value*)CircleList_Next(list);  
  58.           
  59.         printf("%d ", p->v);  
  60.     }  
  61.     printf("\n");  
  62.       
  63.     CircleList_Reset(list);  
  64.       
  65.     while(CircleList_Length(list) > 0)  
  66.     {  
  67.         Value* pV = NULL;  
  68.           
  69.         for(i=1; i<3; i++)  
  70.         {  
  71.             CircleList_Next(list);  
  72.         }  
  73.           
  74.         pV = (Value*)CircleList_Current(list);  
  75.         printf("%d\n", pV->v);  
  76.           
  77.         CircleList_DeleteNode(list, (CircleListNode*)pV);  
  78.     }  
  79.       
  80.     CircleList_Destroy(list);  
  81.       
  82.     return 0;  
  83. }  

你可能感兴趣的:(数据结构(16)循环链表)