所谓循环链表,实质上与单向链表不同的是,尾结点的下一指向不再为NULL,而是指向了链表头,形成了一个串烧;当你检测是否到尾结点的时候,只需要检测尾结点的下一指向是否是头结点,如果是,则终止循环条件即可。
下面是我实现的一个循环链表:
#include <iostream>
using namespace std;
struct MyLink
{
int Volue;
MyLink *next;
};
typedef struct MyLink LinkStruct;
typedef LinkStruct* pLinkStruct;
//生成链表
pLinkStruct CreateLink()
{
pLinkStruct pHead,pMiddle,pTail;
int _Volue;
pHead = new (LinkStruct);
if (pHead == NULL)
{
cout << "分配存储单元失败" << endl;
}
else
{
cout << "请您任意输入自然值" << endl;
cin >> _Volue;
pHead->Volue = _Volue;
}
pTail = pHead;
cout << "请您输入除0以外的自然值" << endl;
cin >> _Volue;
while (_Volue != 0)
{
pMiddle = new(LinkStruct);
if (pMiddle == NULL)
{
cout << "分配中间存储单元失败" << endl;
}
pMiddle->Volue = _Volue;
pMiddle->next = NULL;
pTail->next = pMiddle;
pTail = pMiddle;
cin >> _Volue;
}
pTail->next = pHead;
return pHead;
}
//遍历链表
void printCout(pLinkStruct pHead)
{
cout << "下面展示循环链表的输出过程" << endl;
pLinkStruct pTail;
int _Volue = 30;
while(_Volue!=0)
{
pTail = pHead;
pHead = pHead->next;
cout << pTail->Volue << endl;
--_Volue;
}
//getchar();
}
//删除链表
void DelLinkStruct(pLinkStruct pHead)
{
pLinkStruct pTail,pTemp;
pTemp = pHead;
int _volue = 1;
do
{
pTail = pHead;
pHead = pHead->next;
_volue++;
free(pTail);
} while (pHead != pTemp);
cout << "***********************#####--------->" << _volue << endl;
getchar();
}
int main()
{
pLinkStruct pHead;
pHead = CreateLink();
printCout(pHead);
DelLinkStruct(pHead);
getchar();
return 0;
}