数据结构与算法 循环链表
循环链表
1.初始化循环链表
结构体定义链表与单链表一样,初始化循环链表,不同之处在于循环链表就是在单链表的基础上,把最后一个节点的指针指向头节点的地址。
typedef struct _LinkNode
{
int data
;
struct _LinkNode
* next
;
}LinkNode
, LinkList
;
bool InitLoopList(LinkList
*& L
) {
L
= new LinkNode
;
if (!L
) return false;
L
->next
= L
;
L
->data
= -1;
return true;
}
2.尾插法
通过循环找出最后一个节点,该节点指针域肯定会指向头节点地址,以此为条件可方便找出;后将新节点的指针指向头节点地址,最后一个节点的指针指向新节点地址。
bool ListInsert_back(LinkList
*& L
, LinkNode
* node
) {
LinkNode
* last
= NULL;
if (!L
|| !node
) return false;
if (L
== L
->next
) {
node
->next
= L
;
L
->next
= node
;
}else {
last
= L
->next
;
while (last
->next
!= L
) last
= last
->next
;
node
->next
= L
;
last
->next
= node
;
}
return true;
}
3.打印循环链表
void LinkPrint(LinkList
* L
) {
LinkList
* p
;
if (!L
|| L
== L
->next
) {
cout
<< "链表为空!" << endl
;
return;
}
p
= L
->next
;
while (p
!= L
) {
cout
<< p
->data
<< "\t";
p
= p
->next
;
}
cout
<< endl
;
}
其他方法都与单链表大体相同,就不写一一入了!
完整代码
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std
;
typedef struct _LinkNode
{
int data
;
struct _LinkNode
* next
;
}LinkNode
, LinkList
;
bool InitLoopList(LinkList
*& L
) {
L
= new LinkNode
;
if (!L
) return false;
L
->next
= L
;
L
->data
= -1;
return true;
}
bool ListInsert_back(LinkList
*& L
, LinkNode
* node
) {
LinkNode
* last
= NULL;
if (!L
|| !node
) return false;
if (L
== L
->next
) {
node
->next
= L
;
L
->next
= node
;
}else {
last
= L
->next
;
while (last
->next
!= L
) last
= last
->next
;
node
->next
= L
;
last
->next
= node
;
}
return true;
}
void LinkPrint(LinkList
* L
) {
LinkList
* p
;
if (!L
|| L
== L
->next
) {
cout
<< "链表为空!" << endl
;
return;
}
p
= L
->next
;
while (p
!= L
) {
cout
<< p
->data
<< "\t";
p
= p
->next
;
}
cout
<< endl
;
}
int main(void) {
LinkList
* L
;
LinkList
* s
;
if (InitLoopList(L
)) {
cout
<< "初始化链表成功!" << endl
;
}
else {
cout
<< "初始化链表失败!" << endl
;
exit(-1);
}
int n
= 0;
int i
= 0;
int num
= 0;
cout
<< "输入你插入的元素个数:";
cin
>> n
;
while ((++i
) <= n
) {
cout
<< "请输入第"<<i
<<"个元素:";
cin
>> num
;
s
= new LinkList
;
s
->data
= num
;
s
->next
= NULL;
if (ListInsert_back(L
, s
)) {
cout
<< "插入成功!" << endl
;
}else {
cout
<< "插入失败!" << endl
;
}
}
LinkPrint(L
);
system("pause");
return 0;
}