zoukankan      html  css  js  c++  java
  • 循环链表总结

    基本数据结构之-循环链表

    参考资料:https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%8E%AF%E9%93%BE%E8%A1%A8

      循环链表就像一个圆一样首尾相连,只要在初始化的时候把首尾链接起来,后面的操作和单链表什么差别,差别在于判断最后一个节点的条件变了,原来是判断最后一个结点的下一个节点是不是为空,现在判断的是下一个结点是不是首节点,这点需要特注意。

      为了偷懒这次直接没有单独用结构体封装一个size值,其实封装size值只是把一个O(1) 变成了O(n) 对于我们平时的学习没有什么影响,只要你不是使用随机函数,随机很大的数据没什么影响

      基本结构很简单,就是一个结构体,结构体里面嵌套了自己的一个一级指针

    typedef struct _LISTNODE

    {

        struct _LISTNODE *next;

    }ListNode, CircularList;

    // 初始化,提别要主要,一定要让它们首尾相互咬合在一起

    int Init_CircularList(CircularList **circularlist)

    { /* 操作结果:构造一个空的线性表circularlist */

        if (circularlist == NULL)

        {

            exit(-1);

        }

        *circularlist = (CircularList *)malloc(sizeof(CircularList)); /* 产生头结点,并使circularlist指向此头结点 */

        if (!*circularlist) /* 存储分配失败 */

            exit(-2);

    // 首尾咬合在一起

        (*circularlist)->next = *circularlist; /* 指针域指向头结点 */

        return 0;

    }

    接下来的操作和单链表很相似了,这儿就不过多的赘述,直接代码吧!

    特别需要注意的地方就是,结尾的判断条件!!!!!

    特别需要注意的地方就是,结尾的判断条件!!!!!

    特别需要注意的地方就是,结尾的判断条件!!!!!

    (我已经复制了三次了!!!!)

    void Destroy_CircularList(CircularList *circularlist)

    { /* 操作结果:销毁线性表circularlist */

        if (circularlist == NULL)

        {

            return;

        }

        if(circularlist!=NULL)

        free(circularlist);

        circularlist = NULL;

    }

     

    void Clear_CircularList(CircularList *circularlist) /* 改变circularlist */

    { /* 初始条件:线性表circularlist已存在。操作结果:将circularlist重置为空表 */

        if (circularlist == NULL)

        {

            return;

        }

        if(circularlist!=NULL)

        circularlist->next = circularlist;

    }

     

    int Empty_CircularList(CircularList *circularlist)

    { /* 初始条件:线性表circularlist已存在。操作结果:若circularlist为空表,则返回TRUE,否则返回FALSE */

        if (circularlist == NULL)

        {

            return 0;

        }

        if (circularlist->next == circularlist) /* 空 */

            return 1;

        else

            return 0;

    }

     

    int Length_CircularList(CircularList *circularlist)

    { /* 初始条件:circularlist已存在。操作结果:返回circularlist中数据元素个数 */

        if (circularlist == NULL)

        {

            return -1;

        }

        int i = 0;

        ListNode *pCurrent = circularlist->next; /* p指向头结点 */

        while (pCurrent != circularlist) /* 没到表尾 */

        {

            i++;

            pCurrent = pCurrent->next;

        }

        return i;

    }

     

    void * GetElem_CircularList(CircularList *circularlist, int Pos)

    { /* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */

     

        if (circularlist == NULL)

        {

            return NULL;

        }

        int j = 0; /* 初始化,j为计数器 */

        ListNode *pCurrent = circularlist->next; /* p指向第一个结点 */

        if (Pos < 0 || Pos > Length_CircularList(circularlist)) /* 第i个元素不存在 */

            return NULL;

        while (j < Pos)

        { /* 顺指针向后查找,直到p指向第i个元素 */

            pCurrent = pCurrent->next;

            j++;

        }

        return (void *)pCurrent;

    }

     

    int  LocateElem_CircularList(CircularList *circularlist, void* data, int(*compare)(void *data1, void *data2))

    { /* 初始条件:线性表circularlist已存在,compare()是数据元素判定函数 */

      /* 操作结果:返回circularlist中第1个与e满足关系compare()的数据元素的位序。*/

      /*           若这样的数据元素不存在,则返回值为0 */

     

        if (circularlist == NULL)

        {

            return -1;

        }

        if (data == NULL)

        {

            return -2;

        }

        if (compare == NULL)

        {

            return -3;

        }

        int i = 0;

        ListNode *pCurrent = circularlist->next; /* p指向第一个结点 */

        while (pCurrent != circularlist)

        {

           

            if (compare(pCurrent, data)) /* 满足关系 */

                return i;

            pCurrent = pCurrent->next;

            ++ i;

        }

        return -1;

    }

     

    void *PriorElem_CircularList(CircularList *circularlist, void *data,int(*compare)(void *data1, void *data2))

    { /* 初始条件:线性表circularlist已存在 */

      /* 操作结果:若cur_e是circularlist的数据元素,且不是第一个,则用pre_e返回它的前驱,*/

      /*           否则操作失败,pre_e无定义 */

     

     

        if (circularlist == NULL)

        {

            return NULL;

        }

        if (data == NULL)

        {

            return NULL;

        }

        if (compare == NULL)

        {

            return NULL;

        }

     

        ListNode *pCurrent = circularlist->next; /* p指向第一个结点 */

     

        while (pCurrent!= circularlist) /* p没到表尾 */

        {

            if (compare(pCurrent->next,data))

            {

                return pCurrent;

            }

            pCurrent = pCurrent->next;

        }

        return NULL; /* 操作失败 */

    }

     

    void* NextElem_CircularList(CircularList *circularlist,void *data,int(*compare)(void *data1, void *data2))

    { /* 初始条件:线性表circularlist已存在 */

      /* 操作结果:若cur_e是circularlist的数据元素,且不是最后一个,则用next_e返回它的后继,*/

      /*           否则操作失败,next_e无定义 */

     

        if (circularlist == NULL)

        {

            return NULL;

        }

        if (data == NULL)

        {

            return NULL;

        }

        if (compare == NULL)

        {

            return NULL;

        }

     

        ListNode *pCurrent = circularlist->next; /* p指向第一个结点 */

        while (pCurrent != circularlist) /* p没到表尾 */

        {

            if (compare(pCurrent,data))

            {

                return pCurrent->next;

            }

            pCurrent = pCurrent->next;

        }

        return NULL; /* 操作失败 */

    }

     

    int Insert_CircularList(CircularList *circularlist, int Pos, void * data) /* 改变circularlist */

    { /* 在circularlist的第i个位置之前插入元素e */

     

        if (circularlist == NULL)

        {

            return -1;

        }

        if (data == NULL)

        {

            return -2;

        }

       

     

        ListNode *pCurrent = circularlist; /* p指向头结点 */

        int j = 0;

        if (Pos < 0 || Pos > Length_CircularList(circularlist)) /* 无法在第i个元素之前插入 */

        {

            return -3;

        }

        while (j < Pos) /* 寻找第i-1个结点 */

        {

            pCurrent = pCurrent->next;

            j++;

        }

        ((ListNode *)data)->next = pCurrent->next;

        pCurrent->next = data;

     

        return 0;

    }

     

    int  DeleteByPos_CircularList(CircularList *circularlist, int Pos) /* 改变circularlist */

    { /* 删除circularlist的第i个元素,并由e返回其值 */

     

        if (circularlist == NULL)

        {

            return -1;

        }

       

        ListNode *pCurrent = circularlist; /* p指向头结点 */

        int j = 0;

        if (Pos < 0 || Pos > Length_CircularList(circularlist)-1) /* 第i个元素不存在 */

            return -1;

        // 找到被删除结点的前驱

        while (j < Pos) /* 寻找第i-1个结点 */

        {

            pCurrent = pCurrent->next;

            j++;

        }

        pCurrent->next = pCurrent->next->next;

        return 0;

    }

     

    int  DeleteByVal_CircularList(CircularList *circularlist, void* data) /* 改变circularlist */

    { /* 删除circularlist的第i个元素,并由e返回其值 */

     

        if (circularlist == NULL)

        {

            return -1;

        }

        if (data == NULL)

        {

            return -2;

        }

     

        ListNode *pCurrent = circularlist; /* p指向头结点 */

        while (pCurrent->next != circularlist)

        {

            // 找到被删除结点的前驱

            if (pCurrent->next==data)

            {

                pCurrent->next = pCurrent->next->next;

                break;

            }

            pCurrent = pCurrent->next;

     

        }

        pCurrent = pCurrent->next;

        return 0;

    }

     

     

     

     

     

    void Traverse_CircularList(CircularList *circularlist, void(*Traverse)(void *data))

    { /* 初始条件:circularlist已存在。操作结果:依次对circularlist的每个数据元素调用函数vi() */

     

        if (circularlist == NULL)

        {

            return;

        }

        if (Traverse == NULL)

        {

            return;

        }

     

        ListNode *pCurrent = circularlist->next; /* p指向首元结点 */

        while (pCurrent != circularlist) /* p不指向头结点 */

        {

            Traverse(pCurrent);

            pCurrent = pCurrent->next;

        }

        printf(" ");

    }

  • 相关阅读:
    面试准备(集合部分)
    面试准备(算法部分)
    面试准备(sql部分 索引、常用语句 、)
    破解idea软件教程
    40个Java多线程问题详解复习
    面向对象(2)
    开发中容易造成内存泄露的操作
    面向对象(1)
    vue-cli中找不到jquery的原因,以使用ztree为例
    Django中整合Vue-cli,并解决各种路径引用错误和跨域的问题
  • 原文地址:https://www.cnblogs.com/bkcarlos/p/5932264.html
Copyright © 2011-2022 走看看