4.循环链表思路

 

判断是否是结尾

第一方式:判断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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值