判断是否是结尾
第一方式:判断next是否是头结点
第二方式:size();
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0
//比较回调
typedef int(*COMPARENODE)(CircleLinkNode*,CircleLinkNode*);
//打印回调
//链表的小结点
typedef struct CIRCLELISTNODE
{
struct CIRCLELISTNODE *next;
}CircleListNode;
//链表结构体:所有操作针对结构体操作,这个结构体包含了需要的信息;维护了链表的信息:大小
typedef struct tag_CircleList
{
//循环链表头结点
CircleListNode head;
//循环链表长度
int size;
}CircleLinkList;
//初始化函数
CircleLinkList* Init_CircleLinkList()
{
CircleLinkList* clist = (CircleLinkList*)malloc(sizeof(CircleLinkList));
Clist->head.next = &(clist->head);
Clist->size = 0 ;
return clist;
}
//插入函数
void Insert_CircleLink(CircleLinkList* clist,int pos,CircleLinkList *data){
if(clist ==NULL){return;}
if(data ==NULL){return;}
if(pos<0||pos>clist->size){pos = clist->size;}
//根据位置查找结点
//辅助指针变量
LinkNode* pCurrent = &(clist->head);
for(int i = 0;i<pos;i++){
pCurrent = pCurrent ->next;
}
//插入新节点
data ->next = pCurrent->next;
pCurrent->next = data;
clist->size =0;
}
//获得第一个元素
CircleLinkList* Front_CircleLinkList(CircleLinkList* clist){
return clist->head.next;
}
//根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList* clist,int pos){
if(clist ==NULL){return;}
if(pos<0||pos>=clist->size){
return;
}
//根据pos找结点
//辅助指针变量
LinkNode* pCurrent = &(clist->head);
for(int i = 0;i<pos;i++){
pCurrent = pCurrent ->next;
}
//缓存当前节点的下一个结点
CircleLinkList* pNext = pCurrent->next;
pCurrent->next = pNext ->next;
clist->size--;
}
//根据值删除
void RemoveByValue_CircleLinkList(CircleLinkList* clist,CircleLinkNode* data,COMPARENODE compare)
]{
if(clist ==NULL){return;}
if(data ==NULL){return;}
//循环链表
LinkNode* pPrev = &(clist->head);
LinkNode* pCurrent = pPrev->next;
for(int i=0;i<clist->size;i++){
if(compare(pCurrent,data)==CIRCLELINKLIST_TRUE){
nPrev ->next = pCurrent->next;//删除结点
break;
}
pPrev = pCurrent;
pCurrent = pPrev->next;
}
}
//获得链表的长度
int Size_RemoveByValue_CircleLinkList(CircleLinkList* clist){
return clist->size;}
//判断是否为空
int ieEmpty(CircleLinkList* clist){
if(clist->size== 0){return CIRCLELINKLIST_TRUE;}
return CIRCLELINKLIST_FALSE;
}
//查找
int Find_CircleLinkList(CircleLinkList* clist,CircleLinkNode* data,COMPARENODE compare)
{
if(clist ==NULL){return;}
if(data ==NULL){return;}
//辅助指针变量
LinkNode* pCurrent = clist->head.next;
for(int i=0;i<clist->size;i++){
if(compare(pCurrent,data)==CIRCLELINKLIST_TRUE){
flag = i;
break;}
pCurrent = pCurrent->next;
}
return flag;
}
//打印节点
void print_CircleLinkList(CircleLinkList* clist,PRINTNODE print)
{
if(clist ==NULL){return;}
//辅助指针变量
LinkNode* pCurrent = clist->head.next;
for(int i=0;i<clist->size*2;i++){//打印两遍
if(pCurrent == &(clist->head)){pCurrent = pCurrent->next;}
print(pCurrent);
pCurrent = pCurrent->next;
}
}
//释放内存
void FreeSpace_print_CircleLinkList(CircleLinkList* clist){
if(clist ==NULL){return;}
free(clist);
}