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,...