数据结构系列--循环链表

慧子和她的3D慧子和她的3D今天

数据结构系列--循环链表

文章插图
前面留的一个问题,后文更跟新回答
单链表可以表示任意的线性关系,有些线性关系是循环的,既没有队尾元素 。
将单链表中的终端结点指针端由空指针改为指向头结点,这时的单链表形成国恒一个环,改为循环链表 。
数据结构系列--循环链表

文章插图

数据结构系列--循环链表

文章插图
插入与删除与单链表的原理甚至一模一样,工程,将单链表改成循环链表 。
.h文件
ifndef _CIRCLELIST_H_#define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNote;struct _tag_CircleListNode{CircleListNode* next;}CircleList* CircleList_Creat(int capacity);void CircleList_Destory(CircleList* list);void CircleList_Clear(CircleList* list);int CircleList_Length(CircleList* list);int CircleList_Insert(CircleList* list,CircleListNode* node,int pos);CircleListNode* CircleList_Get(CircleList* list,int pos);CircleListNode* CircleList_Delete(CircleList* list,int pos);#endif
CiecleList.c
#include #include #include "CircleList.h"#define AVAILABLE -1//空闲位置的宏//静态链表结构体定义typedef struct _tag_CircleList{CircleListNode header;//链表头int length;}TCircleList;CircleList* CircleList_Create()//o(1){TCircleList* ret = (TCircleList*)malloc(sizeof(TCircleList));if(ret != NULL)//指针不为0时可以继续赋值操作{ret->length = 0;ret->header.next = NULL;}return ret;}void CircleList_Destory(CircleList* list){free(list);}void CircleList_Clear(CircleList* list) //o(1){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 if(sList != NULL)//链表不为空是合法的,可以继续清空操作{sList->length = 0;sList->header.next= NULL;//第一个元素下标没有了}}int CircleList_Length(CircleList* list)//o(1){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 int ret = -1;//定义一个返回值if(sList !=NULL)//链表不为空是合法的,可以继续清空操作{ret = sList->length;}return ret;}// 插入时,如果表头是空的指向NULL,元素是空的,进行单链表元素插入时,现将插入元素// 尾结点与NULL相连,再把插入元素数据与前结点相连,再把该节点next与自己相连,去除原来NULL,构成循环链表int CircleList_Insert(CircleList* list,CircleListNode* node,int pos)//o(n)n是插入元素的位置·{TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 int ret =(sList !=NULL)&& (pos >=0) && (node != NULL);//单链表方法完成判断int i=0;if(ret)//在数组中找空闲位置index{CircleListNode* current = (CircleListNode*)sList;for(i = 0;(inext != NULL); i++){current = current->next;}node->next = current->next;current->next = node;if(sList->length == 0)// 插入的元素是第一个,length的值为0{node->next =node;// 新元素node的next指针指向自己}sList->length++ ;}return ret;}CircleListNode* CircleList_Get(CircleList* list,int pos)// o(n){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 CircleListNode* ret = NULL;//定义一个返回值int i = 0;if((sList != NULL) &&(0 <= pos)//链表不为空是合法的,长度正常,与单链表不同的是不需要posnext;}return ret;}//获取第pos个元素,将第pos个元素从链表里删除//特殊的删除第一个元素,除了将表头next移到第二个元素之外,还要将最后一个next移到第二个nextCircleListNode* CircleList_Delete(CircleList* list,int pos)//o(n){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 CircleListNode* ret = NULL;//定义一个返回值int i = 0;if( (sList !=NULL) && (0