一、特點
讓鏈表的最後一個結點的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;
}