单向循环链表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//循环链表的小结点
typedef struct CIRCLELINKNODE {
struct CIRCLELINKNODE* next;
}CircleLinkNode;
//链表结构体
typedef struct CIRCLELINKLIST {
CircleLinkNode head;
int size;
}CircleLinkList;
//打印函数原型
typedef void (*CIRCLELISTPRINT)(CircleLinkNode* node);
//自定义比较原型
typedef int (*MYCOMPARELINKLIST)(CircleLinkNode* node1, CircleLinkNode* node2);
//初始化单向循环链表
CircleLinkList* init_CircleLinkList()
{
CircleLinkList* list = (CircleLinkList*)malloc(sizeof(CircleLinkList));
list->head.next = &list->head;
list->size = 0;
return list;
}
//插入数据
void insert_CircleLinkList(CircleLinkList* list, int pos, CircleLinkNode* node)
{
if (!list || !node)
{
return;
}
if (pos < 0 || pos > list->size)
{
pos = list->size;
}
//根据位置查找结点
CircleLinkNode* pCurrent = &list->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
node->next = pCurrent->next;
pCurrent->next = node;
list->size++;
}
//链表头部
CircleLinkNode* front_CircleLinkList(CircleLinkList* list)
{
return list->head.next;
}
void removeByPos_CircleLinkList(CircleLinkList* list, int pos)
{
if (!list)
{
return;
}
if (pos < 0 || pos >= list->size)
{
return;
}
CircleLinkNode* pCurrent = &list->head;
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
pCurrent->next = pCurrent->next->next;
list->size--;
}
//通过指定值删除
int removeByValue_CircleLinkList(CircleLinkList* list, CircleLinkNode* node, MYCOMPARELINKLIST compare)
{
if (!list || !node)
{
return -1;
}
CircleLinkNode* prev = &list->head;
CircleLinkNode* pCurrent = prev->next;
for (int i = 0; i < list->size; i++)
{
if (compare(pCurrent, node) == 0)
{
prev->next = pCurrent->next;
list->size--;
return 0;
}
prev = pCurrent;
pCurrent = pCurrent->next;
}
return -1;
}
void printCircleLinkList(CircleLinkList* list, CIRCLELISTPRINT print)
{
if (!list)
return;
CircleLinkNode* pCurrent = list->head.next;
for (int i = 0; i < list->size; i++)
{
print(pCurrent);
pCurrent = pCurrent->next;
}
}
typedef struct PERESON {
CircleLinkNode* node;
char name[64];
int age;
}Person;
void printCircleLinkList(CircleLinkNode* node)
{
Person* p1 = (Person*)node;
printf("name=%s and age=%d\n",p1->name, p1->age);
}
int myCompare(CircleLinkNode* node1, CircleLinkNode* node2)
{
Person* p1 = (Person*)node1;
Person* p2 = (Person*)node2;
if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age)
{
return 0;
}
else {
return -1;
}
}
void circleLinkListTest()
{
CircleLinkList* list = init_CircleLinkList();
Person p1 = {NULL, "Person1", 10};
Person p2 = { NULL, "Person2", 20 };
Person p3 = { NULL, "Person3", 30 };
Person p4 = { NULL, "Person4", 40 };
Person p5 = { NULL, "Person5", 50 };
insert_CircleLinkList(list, 100, (CircleLinkNode*)&p1);
insert_CircleLinkList(list, 100, (CircleLinkNode*)&p2);
insert_CircleLinkList(list, 100, (CircleLinkNode*)&p3);
insert_CircleLinkList(list, 100, (CircleLinkNode*)&p4);
insert_CircleLinkList(list, 100, (CircleLinkNode*)&p5);
printCircleLinkList(list, printCircleLinkList);
printf("删除指定元素后:");
Person temp = { NULL, "Person1", 10 };
int ret = removeByValue_CircleLinkList(list, (CircleLinkNode*)&temp, myCompare);
printf("ret=%d\n", ret);
printCircleLinkList(list, printCircleLinkList);
}
int main()
{
circleLinkListTest();
return 0;
}