1. 程式人生 > >02循環單鏈表

02循環單鏈表

條件 刪除 銷毀 線性 listt tro 失敗 exit ima

循環單鏈表定義:將單鏈表中終端結點的指針端由空指針改為指向頭結點,就使整個單鏈表形成了

        一個環,這種頭尾相接的單鏈表成為單循環鏈表。

技術分享

循環鏈表的數據結構:

1 /* c2-2.h 線性表的單鏈表存儲結構 */
2 struct LNode
3 {
4     ElemType data;
5     struct LNode *next;
6 };
7 typedef struct LNode *LinkList; /* 另一種定義LinkList的方法 */

代碼實現:

  1  
  2 
  3 /* bo2-4.c 設立尾指針的單循環鏈表(存儲結構由c2-2.h定義)的12個基本操作 
*/ 4 Status InitList_CL(LinkList *L) 5 { 6 /* 操作結果:構造一個空的線性表L */ 7 *L=(LinkList)malloc(sizeof(struct LNode)); /* 產生頭結點,並使L指向此頭結點 */ 8 if(!*L) /* 存儲分配失敗 */ 9 exit(OVERFLOW); 10 (*L)->next=*L; /* 指針域指向頭結點 */ 11 return OK; 12 } 13 14 Status DestroyList_CL(LinkList *L)
15 { 16 /* 操作結果:銷毀線性表L */ 17 LinkList q,p=(*L)->next; /* p指向頭結點 */ 18 while(p!=*L) /* 沒到表尾 */ 19 { 20 q=p->next; 21 free(p); 22 p=q; 23 } 24 free(*L); 25 *L=NULL; 26 return OK; 27 } 28 29 Status ClearList_CL(LinkList *L) /* 改變L */ 30 { 31 /*
初始條件:線性表L已存在。操作結果:將L重置為空表 */ 32 LinkList p,q; 33 *L=(*L)->next; /* L指向頭結點 */ 34 p=(*L)->next; /* p指向第一個結點 */ 35 while(p!=*L) /* 沒到表尾 */ 36 { 37 q=p->next; 38 free(p); 39 p=q; 40 } 41 (*L)->next=*L; /* 頭結點指針域指向自身 */ 42 return OK; 43 } 44 45 Status ListEmpty_CL(LinkList L) 46 { 47 /* 初始條件:線性表L已存在。操作結果:若L為空表,則返回TRUE,否則返回FALSE */ 48 if(L->next==L) /**/ 49 return TRUE; 50 else 51 return FALSE; 52 } 53 54 int ListLength_CL(LinkList L) 55 { 56 /* 初始條件:L已存在。操作結果:返回L中數據元素個數 */ 57 int i=0; 58 LinkList p=L->next; /* p指向頭結點 */ 59 while(p!=L) /* 沒到表尾 */ 60 { 61 i++; 62 p=p->next; 63 } 64 return i; 65 } 66 67 Status GetElem_CL(LinkList L,int i,ElemType *e) 68 { 69 /* 當第i個元素存在時,其值賦給e並返回OK,否則返回ERROR */ 70 int j=1; /* 初始化,j為計數器 */ 71 LinkList p=L->next->next; /* p指向第一個結點 */ 72 if(i<=0||i>ListLength_CL(L)) /* 第i個元素不存在 */ 73 return ERROR; 74 while(j<i) 75 { 76 /* 順指針向後查找,直到p指向第i個元素 */ 77 p=p->next; 78 j++; 79 } 80 *e=p->data; /* 取第i個元素 */ 81 return OK; 82 } 83 84 int LocateElem_CL(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType)) 85 { 86 /* 初始條件:線性表L已存在,compare()是數據元素判定函數 */ 87 /* 操作結果:返回L中第1個與e滿足關系compare()的數據元素的位序。 */ 88 /* 若這樣的數據元素不存在,則返回值為0 */ 89 int i=0; 90 LinkList p=L->next->next; /* p指向第一個結點 */ 91 while(p!=L->next) 92 { 93 i++; 94 if(compare(p->data,e)) /* 滿足關系 */ 95 return i; 96 p=p->next; 97 } 98 return 0; 99 } 100 101 Status PriorElem_CL(LinkList L,ElemType cur_e,ElemType *pre_e) 102 { 103 /* 初始條件:線性表L已存在 */ 104 /* 操作結果:若cur_e是L的數據元素,且不是第一個,則用pre_e返回它的前驅, */ 105 /* 否則操作失敗,pre_e無定義 */ 106 LinkList q,p=L->next->next; /* p指向第一個結點 */ 107 q=p->next; 108 while(q!=L->next) /* p沒到表尾 */ 109 { 110 if(q->data==cur_e) 111 { 112 *pre_e=p->data; 113 return TRUE; 114 } 115 p=q; 116 q=q->next; 117 } 118 return FALSE; 119 } 120 121 Status NextElem_CL(LinkList L,ElemType cur_e,ElemType *next_e) 122 { 123 /* 初始條件:線性表L已存在 */ 124 /* 操作結果:若cur_e是L的數據元素,且不是最後一個,則用next_e返回它的後繼, */ 125 /* 否則操作失敗,next_e無定義 */ 126 LinkList p=L->next->next; /* p指向第一個結點 */ 127 while(p!=L) /* p沒到表尾 */ 128 { 129 if(p->data==cur_e) 130 { 131 *next_e=p->next->data; 132 return TRUE; 133 } 134 p=p->next; 135 } 136 return FALSE; 137 } 138 139 Status ListInsert_CL(LinkList *L,int i,ElemType e) /* 改變L */ 140 { 141 /* 在L的第i個位置之前插入元素e */ 142 LinkList p=(*L)->next,s; /* p指向頭結點 */ 143 int j=0; 144 if(i<=0||i>ListLength_CL(*L)+1) /* 無法在第i個元素之前插入 */ 145 return ERROR; 146 while(j<i-1) /* 尋找第i-1個結點 */ 147 { 148 p=p->next; 149 j++; 150 } 151 s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新結點 */ 152 s->data=e; /* 插入L中 */ 153 s->next=p->next; 154 p->next=s; 155 if(p==*L) /* 改變尾結點 */ 156 *L=s; 157 return OK; 158 } 159 160 Status ListDelete_CL(LinkList *L,int i,ElemType *e) /* 改變L */ 161 { 162 /* 刪除L的第i個元素,並由e返回其值 */ 163 LinkList p=(*L)->next,q; /* p指向頭結點 */ 164 int j=0; 165 if(i<=0||i>ListLength_CL(*L)) /* 第i個元素不存在 */ 166 return ERROR; 167 while(j<i-1) /* 尋找第i-1個結點 */ 168 { 169 p=p->next; 170 j++; 171 } 172 q=p->next; /* q指向待刪除結點 */ 173 p->next=q->next; 174 *e=q->data; 175 if(*L==q) /* 刪除的是表尾元素 */ 176 *L=p; 177 free(q); /* 釋放待刪除結點 */ 178 return OK; 179 } 180 181 Status ListTraverse_CL(LinkList L,void(*vi)(ElemType)) 182 { 183 /* 初始條件:L已存在。操作結果:依次對L的每個數據元素調用函數vi()。一旦vi()失敗,則操作失敗 */ 184 LinkList p=L->next->next; 185 while(p!=L->next) 186 { 187 vi(p->data); 188 p=p->next; 189 } 190 printf("\n"); 191 return OK; 192 }

02循環單鏈表