(头冷)番外篇——循环链表的遍历(补)

本文详细介绍了如何在循环链表中通过特定元素定位并遍历整个链表,包括两个关键函数的实现:通过元素查找结点(GetCircularLinkListNode)和从指定结点开始打印链表(PrintCircularListByNode)。

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

上次的教程中缺少了对循环链表的遍历操作。今天特意来补上。循环链表的特点就是可以通过链表中的任一元素访问到另一个元素。
实现的思路是这样的,我们要定义两个函数。一个函数负责通过元素匹配找到开始的新的寻找的结点,返回值为CircularNode * 型,另一个函数负责打印结果,通过结点的顺序来打印新的循环链表的顺序。好啦,我们来实现一下。

1.声明两个函数

在之前的CircelLinkList.h里声明两个函数

/**访问循环元素通过元素返回结点
 *参数1:需要操作的循环链表
 *参数2:需要查找的元素
 */
CircularNode* GetCircularLinkListNode(CircularLinkList * cList, DataType element);

/**根据循环链表的结点开始打印
 *参数1:需要打印的循环链表
 *参数2:开始打印的结点
 */
void PrintCircularListByNode(CircularLinkList * cList, CircularNode * node);

2.实现主要算法

在CircleLinkList.cpp里实现刚才定义的两个函数

/**访问循环元素通过元素返回结点
 *参数1:需要操作的循环链表
 *参数2:需要查找的元素
 */
CircularNode* GetCircularLinkListNode(CircularLinkList * cList, DataType element)
{
	CircularNode * node = cList->next;
	if (!node)
	{
		cout << "无法找到结点" << endl;
		return NULL;
	}
		
	do
	{
		if (node->data.id == element.id && (strcmp(node->data.name, element.name) == 0))
			return node;
		node = node->next;
	} while (node != cList->next);

}

/**根据循环链表的结点开始打印
 *参数1:需要打印的循环链表
 *参数2:开始打印的结点
 */
void PrintCircularListByNode(CircularLinkList * cList, CircularNode * node)
{
	if (!node)
	{
		cout << "无法找到结点,无法打印!!" << endl;
		return;
	}
	CircularNode *  origNode = node;
	do {
		cout << node->data.id << "\t" << node->data.name << endl;
		node = node->next;
	} while (node != origNode);

}

3.最后的测试代码

void TestCircularList()
{
	CircularLinkList * cList = new CircularLinkList;
	cList->length = 0;
	cList->next = NULL;
	InitCircleList(cList, dataElements, 5);
	PrintCircleList(cList);
	DataType insData = {9, "小象"};
	InsertCircleList(cList, 6, insData);
	PrintCircleList(cList);
	DeleteCircularElem(cList, 3);
	PrintCircleList(cList);
	DataType elem = {4, "小狗"};
	CircularNode * startNode = GetCircularLinkListNode(cList, elem);
	PrintCircularListByNode(cList, startNode);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值