循環鏈表就是將尾結點的指針指向頭結點造成一個循環的鏈表。循環單鏈表的初始化就是使頭結點本身指向本身,而循環雙鏈表的初始化是頭結點的先後驅結點都是指向本身。循環鏈表的好處就是能夠在插入或者刪除表尾元素的操做時,不用再判斷結點爲空的可能,大大的減小了代碼的複雜性。詳情請看代碼:ios
#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; }