注意:
在插入和刪除的操作中,一定要把鍊錶的頭和尾拿出來單獨分析!
由於鍊錶在第一次完整連線後(比如下面程式中的pushback函式),每個節點在鍊錶中的記憶體位址已經固定了下來,比如上圖中,b裡儲存的指標始終就是指向c的next的位址,c中儲存的指標始終就是指向d的next的位址,d中儲存的指標始終是指向head的位址,所以即使在a,b間插入乙個元素e,也不會影響b,c,d節點指標的指向。所以只要不是有關處理頭尾元素的操作,都不需要從頭到尾地把鍊錶重新連線一遍!因為位置在第一次連線的時候就已經固定了!
1#pragma once
45 #include 6 #include 7
8 typedef struct
node
9node;
1314 typedef struct circlelist //
單向迴圈鍊錶
15circlelist;
1920
void initlist(circlelist *cir); //
建立迴圈鍊錶
2122 node* getprev(circlelist *cir, node* q); //
獲取節點q前驅元素的指標
2324 node* getback(circlelist *cir, node* q); //
獲取節點q後繼元素的指標
2526 node* backelem(circlelist *cir); //
返回指向尾節點的指標
2728
void pushback(circlelist *cir, int elem); //
向鍊錶尾部新增元素
2930
void insertelem(circlelist *cir, int position, int elem); //在position的前乙個位置處插入元素
3132
void deleteelem(circlelist *cir, int position); //
刪除position位置處的元素
3334
void clearlist(circlelist *cir); //
清空迴圈鍊錶
3536
void printlistfromfirst(circlelist *cir); //
從第乙個元素開始遍歷迴圈鍊錶
3738
void printlistfromposition(circlelist *cir, int position); //
從第position處的元素開始迴圈遍歷整個鍊錶
123 #include 4 #include 5 #include "
circlelist.h"6
7void initlist(circlelist *cir) //
建立迴圈鍊錶813
14 node* getprev(circlelist *cir, node* q) //
獲取節點q前驅元素的指標
1521 node *p = cir->head;
22for (int i = 1; i <= cir->length; ++i)
2328}29
30 node* getback(circlelist *cir, node* q) //
獲取節點q後繼元素的指標
3137 node *p = cir->head;
38for (int i = 1; i <= cir->length; ++i)
3944}45
46 node* backelem(circlelist *cir) //
返回指向尾節點的指標
4755
56void pushback(circlelist *cir, int elem) //
向鍊錶尾部新增元素
5765
66void insertelem(circlelist *cir, int position, int elem) //在position的前乙個位置處
插入元素(head的position為0)
6773
if (position == cir->length + 1 || position == 1)74
85 node *p = cir->head;
86for (int i = 1; i <= position - 1; ++i)
87 p = p->next; //
獲取position前乙個位置處的指標p
88 node *newnode = (node*)malloc(sizeof
(node));
89 newnode->element =elem;
90 newnode->next = p->next;
91 p->next =newnode;
92 ++cir->length;
93return;94
}959697
void deleteelem(circlelist *cir, int position) //
刪除position位置處的元素
98110
if (position == cir->length)
111119
for (int i = 1; i <= position - 1; ++i)
120 p = p->next; //
獲取position前乙個位置處的指標p
121 node *q = p->next;
122 p->next = q->next;
123free(q);
124 --cir->length;
125return
;126
}127
128129
void clearlist(circlelist *cir) //
清空迴圈鍊錶
130 //
刪除過程中length已經在一直自減,所以不需要新增額外的length自減語句
136}
137138
void printlistfromfirst(circlelist *cir) //
從第乙個元素開始遍歷迴圈鍊錶
139146
}147
148void printlistfromposition(circlelist *cir, int position) //
從第position處的元素開始迴圈遍歷整個鍊錶
149 while (p !=org);
160 }
123 #include 4 #include 5 #include "
circlelist.h"6
7int
main()
8
單向迴圈鍊錶
單向迴圈鍊錶.cpp 定義控制台應用程式的入口點。include stdafx.h include include clinklist.h using namespace std int tmain int argc,tchar argv int n 5 測試空鍊錶 clinklistclist a...
迴圈單向鍊錶
typedef struct list list 初始化乙個迴圈單向鍊錶 void list init list head 判斷鍊錶是否為空 int is list empty list head 往迴圈單向鍊錶中插入乙個元素 prev 在prev元素後面插入 void list insert li...
單向鍊錶迴圈
include include include include includetypedef struct looplink looplink,plooplink 設定結點物件,包含兩個成員,nvalue和指向下乙個物件的指標pnext plooplink create phead nvalue 9...