資料結構 迴圈鍊錶

2021-09-25 19:45:50 字數 3596 閱讀 3495

1、迴圈鍊錶的定義:迴圈鍊錶是另一種形式的表示線性表的鍊錶。

2、迴圈鍊錶的節點結構:

迴圈鍊錶的結點包括兩個部分:資料域和指標域。

(1)資料域(data),用於儲存該結點的資料元素,資料元素型別由應用問題決定。

(2)指標域(link),用於存放乙個指標,該指標指向下乙個結點的開始儲存位址。

迴圈鍊錶的結點結構示意圖:

(1)迴圈鍊錶與單鏈表一樣,可以有附加頭結點,這樣能夠簡化鍊錶操作的實現,統一空表與非空表的運算。

(2)迴圈鍊錶中表尾結點的link域中不是null,而是存放了乙個指向鍊錶開始結點的指標。因此,涉及遍歷操作時,其終止條件不再是像單鏈表那樣判別p或p->next是否為空,而是判別它們是否等於頭指標。

(3)迴圈鍊錶只要知道表中任何乙個結點的位址,就可以遍歷表中其他任一結點。

(5)單向鍊錶的迴圈帶頭結點的空鍊錶:

4、c語言實現:

(1)clist.h:

#pragma once

//帶頭節點的迴圈鍊錶

//迴圈鍊錶尾節點的next指向頭節點

//clist為一條鍊錶;cnode *乙個節點的位址

typedef struct cnode

cnode,*clist;//clist == cnode *

//初始化

void initlist(clist plist);

//頭插法

bool insert_head(clist plist,int val);

//尾插法

bool insert_tail(clist plist,int val);

//在pos下標插入資料val

bool insert_pos(clist plist,int pos,int val);

//查詢,找到返回節點位址,沒有找到返回null

cnode *search(clist plist,int key);

//刪除第乙個key對應的節點

bool delete(clist plist,int key);

//刪除第乙個資料節點,並通過rtval獲得刪除的值

bool delete_head(clist plist,int *rtval);

//刪除最後乙個資料節點,並通過rtval獲得刪除的值

bool delete_tail(clist plist,int *rtval);

//獲取長度,統計資料節點的個數

int getlength(clist plist);

//判空

bool isempty(clist plist);

//清除所有資料

void clear(clist plist);

//銷毀所有節點

void destroy(clist plist);

//列印

void show(clist plist);

(2)clist.cpp:

#include "clist.h"

#include #include #include //帶頭節點的迴圈鍊錶

//迴圈鍊錶尾節點的next指向頭節點

//clist為一條鍊錶;cnode *乙個節點的位址

//初始化

void initlist(clist plist)

plist->next = plist;//指向頭節點

}static cnode *buynode(int val)

//頭插法

bool insert_head(clist plist,int val)

//尾插法

bool insert_tail(clist plist,int val)

//在pos下標插入資料val

bool insert_pos(clist plist,int pos,int val)

cnode *p = plist;

for(int i=0;inext;

}cnode *q = buynode(val);

//將q插入在p的後面

q->next = p->next;

p->next = q;

return true;

}//查詢,找到返回節點位址,沒有找到返回null

cnode *search(clist plist,int key)

}return null;

}static cnode *searchpri(clist plist,int key)

}return null;

}//刪除第乙個key對應的節點

bool delete(clist plist,int key)

cnode *q = p->next;//刪除的節點

p->next = q->next;

free(q);

return true;

}//刪除第乙個資料節點,並通過rtval獲得刪除的值

bool delete_head(clist plist,int *rtval)

if(rtval != null)

cnode *p = plist->next;

plist->next = p->next;

free(p);

return true;

}//刪除最後乙個資料節點,並通過rtval獲得刪除的值

bool delete_tail(clist plist,int *rtval)

cnode *p;

for(p=plist;p->next->next!=plist;p=p->next)//查詢倒數第二個節點

; free(p->next);

p->next = plist;

return true;

}//獲取長度,統計資料節點的個數

int getlength(clist plist)

return count;

}//判空

bool isempty(clist plist)

//清除所有資料

void clear(clist plist)

//銷毀所有節點

void destroy(clist plist)

}//列印

void show(clist plist)

printf("\n");

}

(3)main.cpp:

#include "clist.h"

int main()

show(&list);

return 0;

}

資料結構 迴圈鍊錶

近期我在學習資料結構,於是我自己整理了單鏈表 迴圈單鏈表 雙向鍊錶 雙向迴圈鍊錶的相關 以鞏固這段時間的學習,也希望能夠幫助初學者,希望大家在閱讀以下 時發現問題糾正於我,一起 cyclinklist.h ifndef cyclinklist h define cyclinklist h inclu...

資料結構 迴圈鍊錶

迴圈鍊錶的結點 typedef struct circularnodecircularnode 迴圈鍊錶結構 typedef struct circularlinklistcircularlinklist 在迴圈鍊錶的指定位置插入元素 void insertcircularlinklist circ...

資料結構 迴圈鍊錶

start reading 在知道熟悉單鏈表的操作後,我們知道鍊錶有乙個資料域存放具體的資料,有乙個next域存放後繼的位址,如果我們將尾結點的next域指向之前的任意乙個節點,那麼就形成了乙個環。下面我們就來說說迴圈鍊錶 如圖就是乙個迴圈鍊錶 在對迴圈鍊錶進行操作時要注意尾結點的後繼不是null,...