循环链表的实现

这篇博客介绍了如何在C++中实现循环链表,包括初始化、插入、删除节点以及遍历等功能。循环链表与普通链表的区别在于最后一个节点指向头节点,方便循环输出。文中还给出了具体的代码实现,并通过示例展示了如何使用这些操作,如添加人员信息并按值删除节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

企业链表节点实现循环链表,可以给大家一个参考。关于企业链表的不同可以参考我另外一篇文章,单链表中的讲解。
循环链表和普通链表的不同,在于链表节点最后的指向问题,在单链表中最后的节点指向是NULL,但是循环链表中最后的指向又再一次的指向了头节点,好处是,要多次要循环输出链表的时候就可以不需要额外设置变量,而是直接相应的倍数。但相应的改变就是在于删除或者插入节点到某个位置时,寻找上一个节点时候的停止搜索条件就应该相应的更改为辅助节点指向头节点的时候停止搜索,而不是一直指向NULL的时候。

#include<iostream>
#pragma warning (disable:4996)
using namespace std;
//定义俩个宏
#define CIRCLELINKLIST_TRUE 1
#define CIRCLELINKLIST_FALSE 0

//链表内的节点
typedef struct CIRCLELINKNODE
{
	CIRCLELINKNODE* next;

}CircleLinkNode;
//链表的结构体
typedef struct CIRCLELINKLIST
{
	CircleLinkNode head;
	int size;
}CircleLinkList;
typedef struct PERSON
{
	CircleLinkNode node;
	char name[64];
	int age;
	int socer;
}Person;
typedef int(*COMPARE)(CircleLinkNode* c1, CircleLinkNode* c2);
typedef void(*PRINT)(CircleLinkNode* c1);

void Myprint(CircleLinkNode* n)
{
	Person* p = (Person*)n;
	cout << p->name<<" ";
	cout << p->age << " ";
	cout << p->socer << endl;


}
int Mycompare(CircleLinkNode* c1, CircleLinkNode* c2)
{
	Person * p1 = (Person*)c1;
	Person* p2 = (Person*)c2;

	if (p1->socer == p2->socer && p1->age == p2->age == strcmp(p1->name, p2->name) == 0)
		return CIRCLELINKLIST_TRUE;
	return CIRCLELINKLIST_FALSE;
}


//初始化函数
CircleLinkList* Init_CircleList();
//插入函数
void Insert_CircleList(CircleLinkList* list, int pos, CircleLinkNode* data);
//获得第一个元素
CircleLinkNode* Front_CircleLinkNode(CircleLinkList* clist);
//根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList* clist,int pos);
//根据值进行删除
void RemoveByValueCircleLinkList(CircleLinkList* clist, CircleLinkNode* data,COMPARE cmp);
//获得链表的长度
int Size_CircleList(CircleLinkList* list);
//查找元素
int Find_CircleList(CircleLinkList* list, CircleLinkNode* data, COMPARE cmp);
//打印节点
void Print_CircleList(CircleLinkList* list,PRINT prn );
//释放内存
void Free_CircleList(CircleLinkList* list);
//判断是否为空
int IsEmpty_CircleList(CircleLinkList * list);


//初始化函数
CircleLinkList* Init_CircleList()
{
	CircleLinkList* list = new CircleLinkList;
	list->head.next = &(list->head);
	list->size = 0;
	return list;
}
//插入函数
void Insert_CircleList(CircleLinkList* list, int pos, CircleLinkNode* data)
{
	if (list == NULL||data==NULL)
		return;
	if (pos<0 || pos>list->size)
		pos = list->size;
	//辅助指针变量
	CircleLinkNode* Pcurrent = &list->head;
	for (int i = 0; i < pos; i++)
	{
		Pcurrent = Pcurrent->next;
	}
	data->next = Pcurrent->next;
	Pcurrent->next = data;
	list->size++;


}
//获得第一个元素
CircleLinkNode* Front_CircleLinkNode(CircleLinkList* clist)
{
	return clist->head.next;
}
//根据位置删除
void RemoveByPos_CircleLinkList(CircleLinkList* clist, int pos)
{
	if (clist == NULL)
		return;
	if (pos < 0 || pos >= clist->size)
		return;
	//辅助指针变量
	CircleLinkNode* Pcurrent = &clist->head;
	for (int i = 0; i < pos; i++)
	{
		Pcurrent = Pcurrent->next;
	}
	Pcurrent->next = Pcurrent->next->next;
	clist->size--;
}
//根据值进行删除
void RemoveByValueCircleLinkList(CircleLinkList* clist, CircleLinkNode* data, COMPARE cmp)
{
	if (clist == NULL)
		return;
	if (data == NULL)
		return;
	//循环列表中,要避免一直循环。
	CircleLinkNode* Pcurrent = &clist->head;
	while (Pcurrent->next != &clist->head)
	{
		if (cmp(Pcurrent->next, data) == CIRCLELINKLIST_TRUE)
			break;
		Pcurrent = Pcurrent->next;
	}
	Pcurrent->next = Pcurrent->next->next;
	clist->size--;


}
//获得链表的长度
int Size_CircleList(CircleLinkList* list)
{
	return list->size;
}
//查找元素
int Find_CircleList(CircleLinkList* list, CircleLinkNode* data, COMPARE cmp)
{
	if (list == NULL || data == NULL)
		return -1;
	CircleLinkNode* Pcurrent = list->head.next;
	for (int i = 0; i < list->size; i++)
	{
		if (cmp(data, Pcurrent) == CIRCLELINKLIST_TRUE)
		{
			return i;
		}
		Pcurrent = Pcurrent->next;
	}
	return -1;

}
//打印节点
void Print_CircleList(CircleLinkList* list, PRINT prn)
{
	if (list == NULL )
		return;
	CircleLinkNode* Pcurrent = list->head.next;
	for (int i = 0; i < list->size*2; i++)
	{
		//if (Pcurrent->next == &list->head)多次循环时防止一直打印
		//	break;
		if (Pcurrent == &list->head)//多次打印时,防止打印头节点。
			Pcurrent = Pcurrent->next;
		prn(Pcurrent);
		Pcurrent = Pcurrent->next;
	}
}
//释放内存
void Free_CircleList(CircleLinkList* list)
{
	if (list == NULL)
		return;
	delete list;
}
//判断是否为空
int IsEmpty_CircleList(CircleLinkList* list)
{
	if (list->size == 0)
		return CIRCLELINKLIST_TRUE;
	return CIRCLELINKLIST_FALSE;

}

int main(void)
{
	//创建一个循环链表
	CircleLinkList* list = Init_CircleList();
	//创建数据
	Person p1,p2, p3, p4, p5;
	strcpy(p1.name, "zyf");
	strcpy(p2.name, "z");
	strcpy(p3.name, "y");
	strcpy(p4.name, "y");
	strcpy(p5.name, "zzz");
	
	p1.age = 11;
	p2.age = 12;
	p3.age = 13;
	p4.age = 14;
	p5.age = 15;
	p1.socer = 10;
	p2.socer = 20;
	p3.socer = 30;
	p4.socer = 40;
	p5.socer = 50;
	//数据进入链表
	Insert_CircleList(list, 100, (CircleLinkNode*)&p1);
	Insert_CircleList(list, 100, (CircleLinkNode*)&p2);
	Insert_CircleList(list, 100, (CircleLinkNode*)&p3);
	Insert_CircleList(list, 100, (CircleLinkNode*)&p4);
	Insert_CircleList(list, 100, (CircleLinkNode*)&p5);

	//打印链表
	Print_CircleList(list, Myprint);

	Person pdel;
	strcpy(pdel.name, "zyf");
	pdel.socer = 10;
	pdel.age = 11;
	RemoveByValueCircleLinkList(list, (CircleLinkNode*)&pdel, Mycompare);

	cout << "删除后" << endl;
	Print_CircleList(list, Myprint);

	//释放内存
	Free_CircleList(list);


}




在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值