一、特点
让链表的最后一个结点的next指针指向头结点。初始化小节点时直接让next指针指向链表的头结点。
二、代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//小结点
typedef struct LISTNODE
{
LISTNODE *next;
}ListNode;
//链表结点
typedef struct CIRCULARLIST
{
ListNode head;
int size;
}CircularList;
//数据
typedef struct PERSON
{
ListNode node;
char name[20];
int age;
}person;
//输出函数指针
typedef void(*PRINT)(ListNode*);
void MyPrint(ListNode* data)
{
person* p = (person*)data;
printf("name: %s , age: %d \n",p->name,p->age);
}
//比较函数指针
typedef int(*COMPARED)(ListNode*,ListNode*);
int mycompared(ListNode* data1 ,ListNode* data2)
{
person* p1 = (person*)data1;
person* p2 = (person*)data2;
if(p1->age == p2->age && strcmp(p1->name,p2->name) == 0)
{
return 0;
}
else
return -1;
}
//循环链表初始化
CircularList* Init_CircularList()
{
CircularList* list = (CircularList*)malloc(sizeof(CircularList));
list->head.next = &(list->head); //让头结点的next指向自己
list->size = 0;
return list;
}
//循环链表的插入
void insert_circularList(CircularList* list , int pos ,ListNode* data)
{
//判断
if(list==NULL)
{
return;
}
if(pos<0||pos>list->size)
{
pos = list->size; //优化处理
}
//插入
data->next = &(list->head);
ListNode* pcur1 = &(list->head);
for(int i = 0 ; i < pos ; i++)
{
pcur1 = pcur1->next;
}
data->next = pcur1->next;
pcur1->next = data;
list->size++;
}
//循环链表的值删除
void valuedelete(CircularList* list,ListNode* data,COMPARED mycompared)
{
//判断
if(list == NULL)
{
return;
}
if(data == NULL)
{
return;
}
//删除
ListNode* pcur1 = &(list->head);
ListNode* pcur2 = NULL;
int flag = -1;
for(int i=0; i<list->size; i++)
{
pcur2 = pcur1->next;
flag = mycompared(pcur2,data);
if(flag == 0)
{
break;
}
else
pcur1=pcur1->next;
}
if(flag == -1)
{
printf("该数据不存在\n");
}
else
{
pcur1->next = pcur2->next;
list->size--;
}
}
//循环链表的位置删除
void posdelete(CircularList* list , int pos)
{
//判断
if(list == NULL)
{
return;
}
if(pos<0||pos>list->size)
{
printf("pos有误,请重新输入");
return;
}
//删除
ListNode* pcur = &(list->head);
for(int i = 1;i<pos;i++)
{
pcur = pcur->next;
}
pcur->next = pcur->next->next;
list->size--;
}
//循环链表的打印
void print_circularList(CircularList* list , PRINT MyPrintf)
{
//判断
if(list == NULL)
{
return;
}
//打印
ListNode* pcur = list->head.next;
for(int i = 0 ; i < (list->size)*2 ; i++) //循环的次数 (list->size)*2
{
MyPrintf(pcur);
pcur = pcur->next;
if(pcur == &(list->head))
{
pcur = pcur->next;
}
}
}
//循环链表的长度
int size_circular(CircularList* list)
{
printf("size: %d\n",list->size);
return 0;
}
//两个循环链表的合并
void twolist(CircularList* list1 ,CircularList* list2)
{
//判断
if(list1 == NULL || list2 == NULL)
{
return;
}
//合并
ListNode* list1_lastNode = list1->head.next; //list1的最后一个结点
for(int i = 1 ; i<list1->size ; i++)
{
list1_lastNode = list1_lastNode->next;
}
ListNode* list2_lastNode = list2->head.next; //list2的最后一个结点
for(int i = 1 ; i<list2->size ; i++)
{
list2_lastNode = list2_lastNode->next;
}
list1_lastNode->next = list2->head.next; //将list1的最后一个结点指向list2第一个结点
list2_lastNode->next = &(list1->head); //将list2最后一个结点指向list1的头结点
list1->size = list1->size + list2->size; //长度
}
//循环链表的清空
void emptyList(CircularList* list)
{
//判断
if(list ==NULL)
{
return;
}
list->size = 0;
}
//循环链表的内存释放
void FreeSpace(CircularList* list)
{
if(list == NULL)
{
return;
}
free(list);
}
int main()
{
//创建循环链表
CircularList* list = Init_CircularList();
CircularList* list2 = Init_CircularList();
//创建数据
person p1, p2, p3;
strcpy_s(p1.name,"aaa");
strcpy_s(p2.name,"bbb");
strcpy_s(p3.name,"ccc");
p1.age = 21;
p2.age = 22;
p3.age = 23;
person p4, p5, p6;
strcpy_s(p4.name,"ddd");
strcpy_s(p5.name,"eee");
strcpy_s(p6.name,"fff");
p4.age = 21;
p5.age = 22;
p6.age = 23;
//插入
insert_circularList(list,1,(ListNode*)&p1);
insert_circularList(list,1,(ListNode*)&p2);
insert_circularList(list,1,(ListNode*)&p3);
insert_circularList(list2,1,(ListNode*)&p4);
insert_circularList(list2,1,(ListNode*)&p5);
insert_circularList(list2,1,(ListNode*)&p6);
//打印
print_circularList(list,MyPrint);
//循环链表的长度
size_circular(list);
print_circularList(list2,MyPrint);
size_circular(list);
twolist(list,list2);
print_circularList(list,MyPrint);
size_circular(list);
//位置删除
//posdelete(list,2);
//print_circularList(list,MyPrint);
//值删除
//person p4;
//strcpy_s(p4.name,"bbb");
//p4.age = 22;
//valuedelete(list,(ListNode*)&p4,mycompared);
//print_circularList(list,MyPrint);
//size_circular(list);
//释放内存
FreeSpace(list);
return 0;
}