数据结构之单向循环链表

单向循环链表

#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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值