資料結構——迴圈連結串列
阿新 • • 發佈:2021-02-01
技術標籤:連結串列
文章目錄
一、迴圈單鏈表
1.定義
連結串列最後一個結點的next指標指向頭結點(注意不是指向首元結點)。這種迴圈的結構就使得我們知道連結串列中任意一個結點就可以通過遍歷訪問它的所有結點,而對於普通單鏈表來說,這種操作是不可行的,普通單鏈表訪問不了給定結點前面的結點,除非你有它的頭結點。
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, *LinkList;
2.操作
①初始化
bool InitList (LinkList &L)
{
L = new LNode; //建立一個頭結點
if (L == NULL)
return false; //記憶體不足,分配失敗
L->next = L; //頭結點next指向自己
return true;
}
②判空
bool Empty(LinkList L)
{
if (L->next == L)
return true; //如果頭指標指向自己則為空表
else
return false;
}
③判斷結點p是否為迴圈單鏈表的表尾結點
bool isTail(LinkList L, LNode* p)
{
if ( p->next == L)
return true;
else
return false;
}
二、迴圈雙鏈表
1.定義
連結串列中每個結點依然有兩個指標,區別於雙鏈表,迴圈雙鏈表的頭結點的前驅指標指向表尾結點,而表尾結點的後繼指標指向頭結點。
typedef struct LNode
{
ElemType data;
struct LNode *prior, *next;
}DNode, *DLinkList;
2.操作
①初始化
bool InitDLinkList(DLinkList &L)
{
L = new LNode; //建立一個頭結點
if ( L == NULL)
return false; //記憶體不足,分配失敗
L->prior = L //頭結點的prior指向自己
L->next = L; //頭結點的next指向自己
return true;
}
②判空
bool Empty(DLinkList L)
{
if (L->next == L) //把L->next換成L->prior也行
return true; //如果頭指標指向自己則為空表
else
return false;
}
③判斷結點p是否為迴圈單鏈表的表尾結點
bool isTail(DLinkList L, DNode* p)
{
if (p->next == L) //換成if (L->prior == p)也行
return true;
else
return false;
}
總結
寫迴圈連結串列感覺沒什麼好寫的,居然也單開了一個帖子,寫完才發現屬實沒什麼必要,迴圈連結串列和普通連結串列的操作大差不大,只需要弄清楚迴圈連結串列是首尾相接,可以方便遍歷就行了。