迴圈鍊錶的定義
將單鏈表中最後乙個資料元素的next指標指向第乙個元素,即把鍊錶的兩頭連線,形成了乙個環狀鍊錶,稱為迴圈鍊錶
在迴圈鍊錶中可以定義乙個「當前」指標,稱為游標,通過游標來遍歷鍊錶中所有元素;
迴圈鍊錶和動態鍊錶相比,唯一的不同就是迴圈鍊錶首尾相連,其他都完全一樣
可以用兩次列印迴圈鍊錶,直**下是否為迴圈鍊錶
迴圈鍊錶的應用-約瑟夫環問題
約瑟夫環問題,是乙個經典的迴圈鍊錶問題,題意是:已知 n 個人(以編號1,2,3,…,n分別表示)圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那個人出列;他的下乙個人又從 1 還是順時針開始報數,數到 m 的那個人又出列;依次重複下去,要求找到最後出列的那個人。
例如:n=7;從k=1開始順時針報數,數到m=3的那個人出列 ->3出列
#include#includetypedef struct nodeperson;
迴圈鍊錶初始化
person *initlink(int n)
cyclic->next = head; //首尾相連
return head;
}
找打該元素並出列
void findandout(person *head,int k, int m)
person *p =head;
//找到編號為k的人
while(p->number !=k)
//從編號為k的人開始,只要符合條件p->next == p時,說明鍊錶中除了p結點,所有編號都出列了
while(p->next !=p)
tail ->next = p->next; //從鍊錶上將p結點摘下來
printf("出列人的編號為:%d\n",p->number);
free(p);
p = tail->next;//繼續使用p指標指向列出編號的下乙個編號,遊戲繼續
} printf("出列人的編號為:%d\n",p->number);
free(p);
}
完整**
#include#includetypedef struct nodeperson;
person *initlink();
void findandout();
void display();
int main()
person *initlink(int n)
printf("cyclic:%d \n", cyclic->number);
cyclic->next = head; //首尾相連
return head;
}//鍊錶顯示
void display(person *p)
printf("\n");
}void findandout(person *head,int k, int m)
person *p =head;
//找到編號為k的人
while(p->number !=k)
//從編號為k的人開始,只要符合條件p->next == p時,說明鍊錶中除了p結點,所有編號都出列了
while(p->next !=p)
tail ->next = p->next; //從鍊錶上將p結點摘下來
printf("出列人的編號為:%d\n",p->number);
free(p);
p = tail->next;//繼續使用p指標指向列出編號的下乙個編號,遊戲繼續
} printf("出列人的編號為:%d\n",p->number);
free(p);
}
迴圈鍊錶插入元素
1)普通插入元素(和單鏈表一樣)
2)尾插法:(和單鏈表一樣,單鏈表寫法支援尾插法;因為輔助指標後跳length次,指向最後面那個元素)
在尾部插入結點,將新增結點的next域指標指向頭結點;
3)頭插法
(要進行頭插法,需要求出尾結點,與單鏈表不一樣,保證是迴圈鍊錶)
第一次插入元素是,讓游標指向0號結點
新增結點a插入在頭結點之後,頭結點的next指標指向新增結點a,a指向「首元結點」,表尾結點指向新增結點a;
完成插入操作之後,新增結點a變成了新的首元結點;
4)第一次插入元素
此時鍊錶為空,只有乙個頭結點(一般頭結點不輔助),新增結點為首元結點;
頭結點next域指標指向首元結點,
line *head =null;
head = (line *)malloc(sizeof(line));
head->next = null;
line *temp =head; //遍歷結點
迴圈鍊錶刪除元素
1)刪除普通結點
2)刪除頭結點(刪除0號位置處元素),需要求出尾結點
迴圈鍊錶優缺點:
優點:功能增強,在單鏈表的基礎做了乙個加強,可以取代單鏈表使用;其next和current操作能高效的遍歷鍊錶中所有元素;
缺點:**複雜度變高;(有嗎,相比於單鏈表,迴圈鍊錶是把單鏈表首尾相連了。。)
線性表 迴圈鍊錶
迴圈鍊錶解決的是如何從當前的乙個結點出發,訪問到鍊錶的全部結點。在單鏈表中,有了頭結點,可以用o 1 的時間訪問第乙個結點,但對於最後乙個結點訪問需要o n 時間,就是相當於將單鏈表全部掃瞄一遍。對於迴圈列表不用頭指標,而是用指向終端結點的尾指標來表示迴圈鍊錶,也就是最後乙個結點就是尾指標作為返回,...
迴圈鍊錶 線性表(5 15)
練習 建立乙個n個節點環形鍊錶 不包含頭節點 然後輸出這個環形鍊錶 例如 linknode create loop linklist int n int printf loop linklist linknode p 如下 include include typedef int datatype t...
線性表 雙向迴圈鍊錶
雙向鍊錶 double liked list 就是在單向鍊錶的每個結點中,新增乙個指向前驅結點的指標域。class doublenode 雙向鍊錶迴圈帶頭結點的空鍊錶,如圖 非空的迴圈帶頭結點的雙向鍊錶,如圖 插入操作不複雜,不過順序很重要,不要寫反了。假設儲存元素 e 的結點為 s,要實現將結點 ...