線性表 迴圈鍊錶

2021-09-25 07:29:08 字數 3374 閱讀 3212

迴圈鍊錶的定義

將單鏈表中最後乙個資料元素的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,要實現將結點 ...