上次的教程中缺少了对循环链表的遍历操作。今天特意来补上。循环链表的特点就是可以通过链表中的任一元素访问到另一个元素。
实现的思路是这样的,我们要定义两个函数。一个函数负责通过元素匹配找到开始的新的寻找的结点,返回值为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);
}