数据结构与算法 循环链表
 
循环链表
 
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;
}