zoukankan      html  css  js  c++  java
  • 循环链表的C风格实现(单向)

    头文件:

     1 #ifndef _CIRCLELIST_H_
     2 #define _CIRCLELIST_H_
     3 typedef void CircleList;
     4  
     5 //
     6  
     7 typedef struct _tag_CircleListNode
     8 {
     9     struct _tag_CircleListNode* next;
    10 }CircleListNode;
    11  
    12 //创建一个循环链表
    13 CircleList* CircleList_Create();
    14 //删除一个循环链表
    15 void CircleList_Destroy(CircleList* list);
    16 //清空一个循环链表
    17 void CircleList_Clear(CircleList* list);
    18 //返回链表的长度
    19 int CircleList_Length(CircleList* list);
    20 //在POS位置插入一个节点
    21 int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);
    22 //获取POS位置节点的信息
    23 CircleListNode* CircleList_Get(CircleList* list, int pos);
    24 //删除POS位置的节点
    25 CircleListNode* CircleList_Delete(CircleList* list, int pos);
    26  
    27 ////与游标相关的函数
    28 //删除游标所指的位置节点
    29 CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);
    30 //重置游标位置
    31 CircleListNode* CircleList_Reset(CircleList* list);
    32 //当前游标位置
    33 CircleListNode* CircleList_Current(CircleList* list);
    34 //游标的NEXT域
    35 CircleListNode* CircleList_Next(CircleList* list);
    36  
    37 #endif

    CPP文件:

      1 #include "circleList.h"
      2 #include <iostream>
      3  
      4 using namespace std;
      5  
      6 //这个为头链表头
      7 typedef struct _tag_CircleList
      8 {
      9     CircleListNode header;
     10     CircleListNode* slider;
     11     int length;
     12 }tagCircleList;
     13  
     14 //创建一个循环链表
     15 CircleList* CircleList_Create()
     16 {
     17     tagCircleList* ret = (tagCircleList*)malloc(sizeof(tagCircleList));  //分配内存
     18     if (ret == NULL)
     19     {
     20         return NULL;
     21     }
     22  
     23     //初始化
     24     ret->header.next = NULL;
     25     ret->length = 0;
     26     ret->slider = NULL;
     27  
     28     return ret;
     29 }
     30  
     31 //删除一个循环链表
     32 void CircleList_Destroy(CircleList* list)
     33 {
     34     if (list = NULL)
     35     {
     36         return;
     37     }
     38     //释放内存
     39     free(list);
     40     return;
     41 }
     42  
     43 //清空一个循环链表
     44 void CircleList_Clear(CircleList* list)
     45 {
     46     tagCircleList* sList = NULL;
     47     sList = (tagCircleList*)list;
     48     if (sList == NULL)
     49     {
     50         return ;
     51     }
     52     //重置为初始化状态
     53     sList->header.next = NULL;
     54     sList->length = 0;
     55     sList->slider = NULL;
     56     return;
     57 }
     58  
     59 //返回链表的长度
     60 int CircleList_Length(CircleList* list)
     61 {
     62     tagCircleList* sList = NULL;
     63     sList = (tagCircleList*)list;
     64     int ret = -1;
     65     //异常处理
     66     if (list == NULL)
     67     {
     68         return ret;
     69     }
     70     
     71     return sList->length;
     72 }
     73  
     74 //在POS位置插入一个节点
     75 int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
     76 {
     77     tagCircleList* sList = NULL;
     78     sList = (tagCircleList*)list;
     79     int ret = -1;
     80     //异常处理
     81     if(list == NULL || node == NULL || pos<0)
     82     {
     83         return ret;
     84     }
     85     //临时变量Current
     86     CircleListNode* Current = (CircleListNode*)sList;
     87  
     88     for(int i = 0; (i < pos) && (Current->next != NULL); i++)
     89     {
     90         Current = Current->next;
     91     }
     92  
     93     node->next = Current->next;
     94     Current->next = node;
     95  
     96     //当长度为0时 游标指向node
     97     if (sList->length == 0)
     98     {
     99         sList->slider = node;
    100     }
    101  
    102     sList->length++;
    103     //如果current 依旧指向链表头 证明没跳走 是从0开始插入的 需要头插法
    104     if (Current == (CircleListNode*)sList)
    105     {
    106         //定义一个辅助last 变量来获取尾部节点的信息
    107         CircleListNode* last = (CircleListNode*)CircleList_Get(sList, sList->length - 1);
    108         //将尾部节点的NEXT域存为当前节点(头节点)
    109         last->next = Current->next;
    110     }
    111     return 0;
    112 }
    113  
    114 //获取POS位置节点的信息
    115 CircleListNode* CircleList_Get(CircleList* list, int pos)
    116 {
    117  
    118     tagCircleList* sList = (tagCircleList*)list;
    119     CircleListNode* ret = NULL;
    120     int i = 0;
    121     if (list == NULL || pos < 0)
    122     {
    123         return NULL;
    124     }
    125     CircleListNode* Current = (CircleListNode*)sList;
    126     for(i = 0; i < pos; i++)
    127     {
    128         Current = Current->next;
    129     }
    130      
    131     ret = Current->next;
    132     return ret;
    133 }
    134  
    135 //删除POS位置的节点
    136 CircleListNode* CircleList_Delete(CircleList* list, int pos)
    137 {
    138     tagCircleList* sList = (tagCircleList*)list;
    139     CircleListNode* ret = NULL;
    140  
    141     if ((sList != NULL) && (pos >=0) && (sList->length > 0))
    142     {
    143         //将Current指向表头
    144         CircleListNode* Current = (CircleListNode*)(&(sList->header));
    145         //辅助节点last 进行头节点的删除使用 存取最后一个元素
    146         CircleListNode* last = NULL;
    147  
    148         for(int i = 0; i < pos; i++)
    149         {
    150             Current = Current->next;
    151         }
    152         //删除头结点
    153         if ( Current == (CircleListNode*)sList)
    154         {
    155             last = (CircleListNode*)CircleList_Get(sList, sList->length - 1);
    156         }
    157         //要删除的元素
    158         ret = Current->next;
    159         Current->next = ret->next;
    160         sList->length--;
    161  
    162         //判断链表非空
    163         if( last != NULL)
    164         {
    165             //sList->header.next = ret->next;
    166             Current->next = ret->next;
    167             last->next = ret->next;
    168         }
    169         //若删除的元素为游标所指的元素
    170         if(sList->slider = ret)
    171         {
    172             sList->slider = ret->next;
    173         }
    174         //若删除元素后 链表长度为0 做处理
    175         if (sList->length == 0)
    176         {
    177             sList->header.next = NULL;
    178             sList->slider = NULL;
    179         }
    180     }
    181     return ret;
    182 }
    183  
    184 ////与游标相关的函数
    185 //删除游标所指的位置节点
    186 CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
    187 {
    188     tagCircleList* sList = (tagCircleList*)list;
    189     CircleListNode* ret = NULL;
    190     int i = 0;
    191  
    192     if (sList != NULL)
    193     {
    194         CircleListNode* Current = (CircleListNode*)sList;
    195         //循环查找node 在链表中的位置
    196         for (i = 0; i < sList->length; i++)
    197         {
    198             if (Current->next == node)
    199             {
    200                 ret = Current->next;
    201                 break;
    202             }
    203  
    204             Current = Current->next;
    205         }
    206         //找到了 使用CircleList_Delete 删除
    207         if(ret != NULL)
    208         {
    209             CircleList_Delete(list, i);
    210         }
    211  
    212     }
    213  
    214     return ret;
    215 }
    216  
    217 //重置游标位置
    218 CircleListNode* CircleList_Reset(CircleList* list)
    219 {
    220     tagCircleList* sList = (tagCircleList*)list;
    221     CircleListNode* ret = NULL;
    222     //如果不为空
    223     if (sList != NULL)
    224     {
    225         sList->slider = sList->header.next;
    226         ret = sList->slider;
    227     }
    228  
    229     return ret;
    230 }
    231  
    232 //当前游标位置
    233 CircleListNode* CircleList_Current(CircleList* list)
    234 {
    235     tagCircleList* sList = (tagCircleList*)list;
    236     CircleListNode* ret = NULL;
    237     //如果不为空
    238     if (sList != NULL)
    239     {
    240         ret = sList->slider;
    241     }
    242  
    243     return ret;
    244 }
    245  
    246 //把游标位置返回,游标下移
    247 CircleListNode* CircleList_Next(CircleList* list)
    248 {
    249     tagCircleList* sList = (tagCircleList*)list;
    250     CircleListNode* ret = NULL;
    251     //如果不为空
    252     if((sList != NULL) && (sList->slider != NULL))
    253     {
    254         ret = sList->slider;
    255         sList->slider = ret->next;
    256     }
    257  
    258     return ret;
    259 }

    测试函数:

    #include "circleList.h"
    #include <iostream>
     
    using namespace std;
     
    typedef struct _Temp_Test
    {
        CircleListNode node;
        int temp;
        char temp2;
    }TempTast;
     
     
    int main()
    {
        CircleList* circlelist = NULL;
     
        circlelist = CircleList_Create();
        //异常处理
        if (circlelist == NULL)
        {
            cout << "Create Err "  << endl;
            return -1;
        }
     
        TempTast t1, t2, t3, t4, t5;
        t1.temp = 1;
        t2.temp = 2;
        t3.temp = 3;
        t4.temp = 4;
        t5.temp = 5;
        //插入元素
        CircleList_Insert(circlelist, (CircleListNode*)(&t1), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t2), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t3), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t4), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t5), 0);
        //测试功能
        cout << "Length: " << CircleList_Length(circlelist) << endl;
        //遍历两次
        cout << "遍历两次:" << endl;
        for(int i = 0; i < 2*CircleList_Length(circlelist); i++)
        {
            cout <<"Node:" << ((TempTast*)CircleList_Get(circlelist, i))->temp << endl;
        }
        cout << endl;
        //删除第一个节点
        cout <<"Node:" << ((TempTast*)CircleList_Delete(circlelist, 0))->temp << endl;
        //清空
        CircleList_Clear(circlelist);
        cout << "After Clear Length: " << CircleList_Length(circlelist) << endl;
     
        //插入元素
        CircleList_Insert(circlelist, (CircleListNode*)(&t1), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t2), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t3), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t4), 0);
        CircleList_Insert(circlelist, (CircleListNode*)(&t5), 0);
        //删除指定元素
        cout << "Delete Node :" << ((TempTast*)CircleList_DeleteNode(circlelist, (CircleListNode*)(&t1)))->temp << endl;
        //显示游标当前位置
        cout << "Silder Now :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
        //移动后
        CircleList_Next(circlelist);
        cout << "Silder After Next :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
        //重置后
        CircleList_Reset(circlelist);
        cout << "Silder After Reset :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
        cout << endl;
        //销毁
        CircleList_Destroy(circlelist);
        cout << "circle has been Destroied" << endl;
        system("pause");
        return 0;
    }
  • 相关阅读:
    EF fluent API如何配置主键不自动增长
    简单的自定义Session
    使用NPOI,完成数据的导入导出
    c#索引器
    MUI框架 picker日期选择器实例
    使用MUI框架,模拟手机端的下拉刷新,上拉加载操作。
    Newtonsoft.Json
    NetMQ:.NET轻量级消息队列
    C#之RabbitMQ系列(一)
    C# 核心语法-反射(反射类型、方法、构造函数、属性,实现可配置可扩展,完成数据库访问类反射封装)
  • 原文地址:https://www.cnblogs.com/Lxk0825/p/9519932.html
Copyright © 2011-2022 走看看