循环链表总结

Posted 菜鸟沃土

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环链表总结相关的知识,希望对你有一定的参考价值。

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

参考资料: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("\n");

}

 

以上是关于循环链表总结的主要内容,如果未能解决你的问题,请参考以下文章

单向循环链表

双向循环链表

双向循环链表

数据结构——循环链表

(java实现)双向循环链表

数据结构c语言篇 《二》带头双向循环链表实现以及链表相关面试题(下)