# 循环链表

## 循环链表

• 循环链表的原理：最后一个节点的next指向头节点，而不是NULL

## 实例代码

circle_list.h

#include <stdio.h>
#include <stdlib.h>

typedef struct CIRCLELISTNODE
{
struct  CIRCLELISTNODE* next;

}ListNode;

typedef struct CIRCLELIST {
ListNode* tail;
int size;
}ListInfo;

typedef void(*PRINT)(ListNode*);
typedef int (*COMPARE)(ListNode*,ListNode*);

ListInfo* Init_List();

void Push_Back(ListInfo* list, ListNode* data);

void Insert_list(ListInfo* list,int pos,ListNode* data);

void RemoveByPos_list(ListInfo* list,int pos);

void RemoveByValue_list(ListInfo* list,ListNode* data,COMPARE compare);

int Find_list(ListInfo* list,ListNode* data,COMPARE compare);

void Print(ListInfo* list,PRINT print);



circle_list.c

#include "../include/list.h"

ListInfo* Init_List()
{
ListInfo* clist = (ListInfo*)malloc(sizeof(ListInfo));
clist->tail=( ListNode*) malloc(sizeof(ListNode));

clist->size =0;

return clist;
}

void Push_Back(ListInfo* list, ListNode* data)
{
if(list == NULL)return;
if(data == NULL)return;

ListNode* pCurrent = list->tail;

data->next = pCurrent->next;
list->tail->next = data;
list->tail = data;

list->size++;
}

void Insert_list(ListInfo* list,int pos,ListNode* data)
{
if(list == NULL)return;
if(data == NULL)return;
if(pos<0 || pos > list->size)
{
pos = list->size;
}

for(int i=0; i<pos; i++)
{
pCurrent = pCurrent->next;
}

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

if(pos == list->size)//插入尾部，需要改变尾部指针
{
list->tail = data;
}

list->size++;
}

void RemoveByPos_list(ListInfo* list,int pos)
{
if(list == NULL)return;
if(pos < 0 || pos>=list->size)return;

for(int i=0;i<pos;i++)
{
pCurrent = pCurrent->next;
}

ListNode* pNext = pCurrent->next;
pCurrent->next = pNext->next;

if(pos == list->size)
list->tail = pCurrent;
list->size--;

}

void RemoveByValue_list(ListInfo* list,ListNode* data,COMPARE compare)
{
if(list == NULL) return;
if(data == NULL) return;
int flag=0;

for(int i=0; i<list->size; i++)
{
flag =i;
if(compare(pCurrent->next,data))
{
pCurrent->next = pCurrent->next->next;
break;
}

pCurrent =pCurrent->next;
}
if(flag == list->size -1)//删除的是最后一个，则需要改变tail值
list->tail = pCurrent;

list->size--;
}

int Find_list(ListInfo* list,ListNode* data,COMPARE compare)
{
int flag=0;

if(list == NULL) return -1;
if(data == NULL) return -1;

for(int i=0; i<list->size; i++)
{
if(compare(pCurrent,data))
{
flag=i;
break;
}
pCurrent = pCurrent->next;
}

return flag;
}

void Print(ListInfo* list,PRINT print)
{

if(list==NULL) return;

for(int i=0; i<list->size; i++)
{
{
pCurrent = pCurrent->next;
}
print(pCurrent);
pCurrent = pCurrent->next;
}

}



main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "../include/list.h"

typedef struct PERSON
{
ListNode node;
char name[64];
int age;
int score;

}Person;

void MyPrint(ListNode* data)
{
Person* p =(Person*)data;
printf("name: %s,age: %d,score: %d\n",p->name,p->age,p->score);
}

int MyCompare(ListNode* data1,ListNode* data2)
{
Person* p1 =(Person*)data1;
Person* p2 =(Person*)data2;

if(p1->age==p2->age && p1->name==p2->name && p1->score == p2->score)
{
return 1;
}

else
{
return  0;
}

}

int main(void)
{
ListInfo* list = Init_List();

Person p1,p2,p3,p4,p5;

strcpy(p1.name,"aaa");
strcpy(p2.name,"bbb");
strcpy(p3.name,"ccc");
strcpy(p4.name,"ddd");
strcpy(p5.name,"eee");

p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;

p1.score =100;
p2.score =200;
p3.score =300;
p4.score =400;
p5.score =500;

Insert_list(list, 100,(ListNode*)&p2);//在最后一位插入
Insert_list(list, 100,(ListNode*)&p3);
Insert_list(list,0,(ListNode*)&p1);//在第0位插入

Push_Back(list,(ListNode*)&p4);//插入最后
Push_Back(list,(ListNode*)&p5);
Print(list,MyPrint);

printf("----删除第一个和最后一个------\n");
RemoveByPos_list(list,0);
RemoveByPos_list(list,3);
Print(list,MyPrint);

printf("-----删除ddd-----\n");
RemoveByValue_list(list,(ListNode*)&p4,MyCompare);
Print(list,MyPrint);
printf("----------\n");

int pos=Find_list(list,(ListNode*)&p3,MyCompare);
printf("ccc pos: %d\n",pos);

return 0;
}



11-23 1332

07-20 6916
10-13 111
05-16 1413
09-20 809
01-10 2万+
07-26 1254
02-01 1794
08-02 399
01-20 2033
07-10 1万+
09-16 1万+
07-10 2744
03-01 187
01-24 4892
08-10 474
12-01 119
05-10 942