循環鏈表就是將尾結點的指針指向頭結點形成一個循環的鏈表。循環單鏈表的初始化就是使頭結點自己指向自己,而循環雙鏈表的初始化是頭結點的前後驅結點都是指向自己。循環鏈表的好處就是可以在插入或者刪除表尾元素的操作時,不用再判斷結點爲空的可能,大大的減少了代碼的複雜性。詳情請看代碼:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//定義循環單鏈表
typedef struct Node{
int data;
struct Node *next;
}Node,*RepeatSimpleList;
//定義循環雙鏈表
typedef struct DNode{
int data;
struct DNode *prior,*next;
}DNode,*RepeatDoubleList;
//初始化一個循環雙鏈表
bool InitRepeatDoubleList(RepeatDoubleList &L){
L = (DNode*)malloc(sizeof(DNode));
if(L==NULL){
return false;
}
L->prior = L;//頭結點的前驅指針指向頭結點
L->next = L;//頭結點的後驅指針指向頭結點
}
//初始化一個循環單鏈表
bool InitRepeatSimpleList(RepeatSimpleList &L){
L = (Node*)malloc(sizeof(Node));
if(L==NULL){
return false;
}
L->next = L;//頭結點指向頭結點
return true;
}
//判斷循環雙鏈表是否爲空
bool Empty(RepeatDoubleList L){
if(L->next==L){
return true;
}else{
return false;
}
}
//判斷循環單鏈表是否爲空
bool isEmpty(RepeatSimpleList L){
if(L->next==L){
return true;
}else{
return false;
}
}
//在p結點之後插入s結點(循環雙鏈表)
bool InsertNextDNode(DNode *p,DNode *s){
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
}
//刪除p結點後的後繼結點(循環雙鏈表)
bool DeleteNextDNode(DNode *p){
DNode *q = p->next;//q指針指向目標結點
p->next = q->next;
q->next->prior = p;
free(q);//釋放目標結點
}
//判斷結點p是否爲循環雙鏈表尾結點
bool Finish(RepeatDoubleList L,DNode *p){
if(p->next==L){
return true;
}else{
return false;
}
}
//判斷結點p是否爲循環單鏈表尾結點
bool isFinish(RepeatSimpleList L,Node *p){
if(p->next==L){
return true;
}else{
return false;
}
}
int main(int argc, char** argv) {
RepeatSimpleList L;//聲明一個循環單鏈表
RepeatDoubleList L;//聲明一個循環雙鏈表
InitRepeatSimpleList(L);//初始化循環單鏈表
InitRepeatDoubleList(L);//初始化循環雙鏈表
return 0;
}