亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言單循環鏈表的表示與實現實例詳解

2020-01-26 15:29:55
字體:
來源:轉載
供稿:網友

1.概述:

對于一個循環鏈表來說,其首節點和末節點被連接在一起。這種方式在單向和雙向鏈表中皆可實現。要轉換一個循環鏈表,可以選擇開始于任意一個節點然后沿著列表的任一方向直到返回開始的節點。再來看另一種方法,循環鏈表可以被視為“無頭無尾”。這種列表很利于節約數據存儲緩存, 假定你在一個列表中有一個對象并且希望所有其他對象迭代在一個非特殊的排列下。

指向整個列表的指針可以被稱作訪問指針。


用單向鏈表構建的循環鏈表

循環鏈表中第一個節點之前就是最后一個節點,反之亦然。循環鏈表的無邊界使得在這樣的鏈表上設計算法會比普通鏈表更加容易。對于新加入的節點應該是在第一個節點之前還是最后一個節點之后可以根據實際要求靈活處理,區別不大(詳見下面實例代碼)。當然,如果只會在最后插入數據(或者只會在之前),處理也是很容易的。
另外有一種模擬的循環鏈表,就是在訪問到最后一個節點之后的時候,手工的跳轉到第一個節點。訪問到第一個節點之前的時候也一樣。這樣也可以實現循環鏈表的功能,在直接用循環鏈表比較麻煩或者可能會出現問題的時候可以用。

2.程序實現:

/* c2-2.h 線性表的單鏈表存儲結構 */ struct LNode {  ElemType data;  struct LNode *next; }; typedef struct LNode *LinkList; /* 另一種定義LinkList的方法 */
/* bo2-4.c 設立尾指針的單循環鏈表(存儲結構由c2-2.h定義)的12個基本操作 */ Status InitList_CL(LinkList *L) { /* 操作結果:構造一個空的線性表L */  *L=(LinkList)malloc(sizeof(struct LNode)); /* 產生頭結點,并使L指向此頭結點 */  if(!*L) /* 存儲分配失敗 */   exit(OVERFLOW);  (*L)->next=*L; /* 指針域指向頭結點 */  return OK; } Status DestroyList_CL(LinkList *L) { /* 操作結果:銷毀線性表L */  LinkList q,p=(*L)->next; /* p指向頭結點 */  while(p!=*L) /* 沒到表尾 */  {   q=p->next;   free(p);   p=q;  }  free(*L);  *L=NULL;  return OK; } Status ClearList_CL(LinkList *L) /* 改變L */ { /* 初始條件:線性表L已存在。操作結果:將L重置為空表 */  LinkList p,q;  *L=(*L)->next; /* L指向頭結點 */  p=(*L)->next; /* p指向第一個結點 */  while(p!=*L) /* 沒到表尾 */  {   q=p->next;   free(p);   p=q;  }  (*L)->next=*L; /* 頭結點指針域指向自身 */  return OK; } Status ListEmpty_CL(LinkList L) { /* 初始條件:線性表L已存在。操作結果:若L為空表,則返回TRUE,否則返回FALSE */  if(L->next==L) /* 空 */   return TRUE;  else   return FALSE; } int ListLength_CL(LinkList L) { /* 初始條件:L已存在。操作結果:返回L中數據元素個數 */  int i=0;  LinkList p=L->next; /* p指向頭結點 */  while(p!=L) /* 沒到表尾 */  {   i++;   p=p->next;  }  return i; } Status GetElem_CL(LinkList L,int i,ElemType *e) { /* 當第i個元素存在時,其值賦給e并返回OK,否則返回ERROR */  int j=1; /* 初始化,j為計數器 */  LinkList p=L->next->next; /* p指向第一個結點 */  if(i<=0||i>ListLength_CL(L)) /* 第i個元素不存在 */   return ERROR;  while(j<i)  { /* 順指針向后查找,直到p指向第i個元素 */   p=p->next;   j++;  }  *e=p->data; /* 取第i個元素 */  return OK; } int LocateElem_CL(LinkList L,ElemType e,Status(*compare)(ElemType,ElemType)) { /* 初始條件:線性表L已存在,compare()是數據元素判定函數 */  /* 操作結果:返回L中第1個與e滿足關系compare()的數據元素的位序。 */  /*      若這樣的數據元素不存在,則返回值為0 */  int i=0;  LinkList p=L->next->next; /* p指向第一個結點 */  while(p!=L->next)  {   i++;   if(compare(p->data,e)) /* 滿足關系 */    return i;   p=p->next;  }  return 0; } Status PriorElem_CL(LinkList L,ElemType cur_e,ElemType *pre_e) { /* 初始條件:線性表L已存在 */  /* 操作結果:若cur_e是L的數據元素,且不是第一個,則用pre_e返回它的前驅, */  /*      否則操作失敗,pre_e無定義 */  LinkList q,p=L->next->next; /* p指向第一個結點 */  q=p->next;  while(q!=L->next) /* p沒到表尾 */  {   if(q->data==cur_e)   {    *pre_e=p->data;    return TRUE;   }   p=q;   q=q->next;  }  return FALSE; } Status NextElem_CL(LinkList L,ElemType cur_e,ElemType *next_e) { /* 初始條件:線性表L已存在 */  /* 操作結果:若cur_e是L的數據元素,且不是最后一個,則用next_e返回它的后繼, */  /*      否則操作失敗,next_e無定義 */  LinkList p=L->next->next; /* p指向第一個結點 */  while(p!=L) /* p沒到表尾 */  {   if(p->data==cur_e)   {    *next_e=p->next->data;    return TRUE;   }   p=p->next;  }  return FALSE; } Status ListInsert_CL(LinkList *L,int i,ElemType e) /* 改變L */ { /* 在L的第i個位置之前插入元素e */  LinkList p=(*L)->next,s; /* p指向頭結點 */  int j=0;  if(i<=0||i>ListLength_CL(*L)+1) /* 無法在第i個元素之前插入 */   return ERROR;  while(j<i-1) /* 尋找第i-1個結點 */  {   p=p->next;   j++;  }  s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新結點 */  s->data=e; /* 插入L中 */  s->next=p->next;  p->next=s;  if(p==*L) /* 改變尾結點 */   *L=s;  return OK; } Status ListDelete_CL(LinkList *L,int i,ElemType *e) /* 改變L */ { /* 刪除L的第i個元素,并由e返回其值 */  LinkList p=(*L)->next,q; /* p指向頭結點 */  int j=0;  if(i<=0||i>ListLength_CL(*L)) /* 第i個元素不存在 */   return ERROR;  while(j<i-1) /* 尋找第i-1個結點 */  {   p=p->next;   j++;  }  q=p->next; /* q指向待刪除結點 */  p->next=q->next;  *e=q->data;  if(*L==q) /* 刪除的是表尾元素 */   *L=p;  free(q); /* 釋放待刪除結點 */  return OK; } Status ListTraverse_CL(LinkList L,void(*vi)(ElemType)) { /* 初始條件:L已存在。操作結果:依次對L的每個數據元素調用函數vi()。一旦vi()失敗,則操作失敗 */  LinkList p=L->next->next;  while(p!=L->next)  {   vi(p->data);   p=p->next;  }  printf("/n");  return OK; }
/* main2-4.c 單循環鏈表,檢驗bo2-4.c的主程序 */ #include"c1.h" typedef int ElemType; #include"c2-2.h" #include"bo2-4.c" Status compare(ElemType c1,ElemType c2) {  if(c1==c2)   return TRUE;  else   return FALSE; } void visit(ElemType c) {  printf("%d ",c); } void main() {  LinkList L;  ElemType e;  int j;  Status i;  i=InitList_CL(&L); /* 初始化單循環鏈表L */  printf("初始化單循環鏈表L i=%d (1:初始化成功)/n",i);  i=ListEmpty_CL(L);  printf("L是否空 i=%d(1:空 0:否)/n",i);  ListInsert_CL(&L,1,3); /* 在L中依次插入3,5 */  ListInsert_CL(&L,2,5);  i=GetElem_CL(L,1,&e);  j=ListLength_CL(L);  printf("L中數據元素個數=%d,第1個元素的值為%d。/n",j,e);  printf("L中的數據元素依次為:");  ListTraverse_CL(L,visit);  PriorElem_CL(L,5,&e); /* 求元素5的前驅 */  printf("5前面的元素的值為%d。/n",e);  NextElem_CL(L,3,&e); /* 求元素3的后繼 */  printf("3后面的元素的值為%d。/n",e);  printf("L是否空 %d(1:空 0:否)/n",ListEmpty_CL(L));  j=LocateElem_CL(L,5,compare);  if(j)   printf("L的第%d個元素為5。/n",j);  else   printf("不存在值為5的元素/n");  i=ListDelete_CL(&L,2,&e);  printf("刪除L的第2個元素:/n");  if(i)  {   printf("刪除的元素值為%d,現在L中的數據元素依次為:",e);   ListTraverse_CL(L,visit);  }  else   printf("刪除不成功!/n");  printf("清空L:%d(1: 成功)/n",ClearList_CL(&L));  printf("清空L后,L是否空:%d(1:空 0:否)/n",ListEmpty_CL(L));  printf("銷毀L:%d(1: 成功)/n",DestroyList_CL(&L)); }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产精品久久久久久久| 亚洲激情小视频| 色琪琪综合男人的天堂aⅴ视频| 亚洲人成网站999久久久综合| 欧美洲成人男女午夜视频| 日韩在线观看av| 韩国福利视频一区| 国产精品久久99久久| 美女av一区二区三区| 国产精品成人v| 亚洲视频在线免费观看| 国产男人精品视频| 国内外成人免费激情在线视频网站| 美女999久久久精品视频| 全亚洲最色的网站在线观看| 久久久久久久久久久久av| 亚洲美女性视频| 欧美一级黑人aaaaaaa做受| 精品国产一区二区在线| 久久久国产精品免费| 亚洲系列中文字幕| 欧美激情手机在线视频| 精品国产自在精品国产浪潮| 国产成人精品一区二区三区| 久久久中文字幕| 国产免费一区二区三区香蕉精| 国产成人精品av在线| 欧美黄色片在线观看| 久久伊人91精品综合网站| 国产欧美精品日韩精品| 欧美日韩一区二区三区| 国产日韩欧美另类| 国产精品综合网站| 中文字幕亚洲欧美一区二区三区| 日韩高清有码在线| 亚洲韩国日本中文字幕| 欧美激情亚洲激情| 亚洲最大av在线| 国产福利精品av综合导导航| 欧美精品在线第一页| 欧美丝袜第一区| 日韩中文字幕在线播放| 中文亚洲视频在线| 北条麻妃一区二区在线观看| 亚洲第一精品夜夜躁人人爽| 日韩亚洲综合在线| 青青在线视频一区二区三区| 精品国产欧美一区二区五十路| 色婷婷成人综合| 久久久99久久精品女同性| 日韩视频在线观看免费| 国产精品大片wwwwww| 国产精品视频最多的网站| 91在线观看免费观看| 国产啪精品视频| 欧美性猛交xxxx| 亚洲精品视频免费| 国产精品欧美激情| 日韩在线激情视频| 91国产视频在线播放| 久久久久久久久国产精品| 中文字幕久久精品| 亚洲аv电影天堂网| 国产精品免费小视频| 亚洲精品永久免费| 欧美激情啊啊啊| 国产精品日韩精品| 亚洲91精品在线观看| 狠狠操狠狠色综合网| 成人精品久久av网站| 国产一区二区三区在线免费观看| 精品自拍视频在线观看| 在线视频一区二区| 国产噜噜噜噜噜久久久久久久久| 韩国欧美亚洲国产| 欧美综合激情网| 91精品久久久久久综合乱菊| 国产精品极品在线| 欧美裸身视频免费观看| 91免费人成网站在线观看18| 国产日韩视频在线观看| 亚洲色图第三页| 精品国产乱码久久久久久虫虫漫画| 亚洲自拍欧美色图| 欧美床上激情在线观看| 久久中国妇女中文字幕| 国产精品v片在线观看不卡| 欧美日韩ab片| 青草热久免费精品视频| 国产亚洲欧美日韩精品| 欧美性感美女h网站在线观看免费| 欧美与欧洲交xxxx免费观看| 亚洲男人第一av网站| 久久久精品网站| 国产免费一区二区三区在线能观看| 欧美日韩激情网| 亚洲国产精品女人久久久| 精品女厕一区二区三区| 91在线精品播放| 中文字幕国产亚洲2019| 日韩经典中文字幕在线观看| 日韩一区在线视频| 欧美黄色小视频| 日韩少妇与小伙激情| 久久av资源网站| 国产精品久久久久免费a∨大胸| 久99九色视频在线观看| 欧美激情女人20p| 九九精品视频在线观看| 久久婷婷国产麻豆91天堂| 欧美日韩国产麻豆| 中文字幕久热精品视频在线| 欧美在线影院在线视频| 久久久亚洲影院| 日韩精品免费在线播放| 亚洲深夜福利在线| 91中文字幕一区| 久久福利网址导航| 97国产精品久久| 国产精品99久久久久久久久久久久| 中文字幕日韩av| 亚洲第一av网站| 国产视频福利一区| 久久久久久欧美| 日韩成人黄色av| 欧美性猛交xxxxx免费看| 97av在线视频| 国产亚洲一区精品| 国产激情综合五月久久| 精品小视频在线| 97精品视频在线| 亚洲最大激情中文字幕| 国产视频观看一区| 日韩在线视频中文字幕| 丝袜亚洲欧美日韩综合| 亚洲色图在线观看| 国产成人鲁鲁免费视频a| 日韩高清免费观看| 性欧美办公室18xxxxhd| 国产精品自拍网| 欧美亚洲成人网| 日韩精品久久久久久久玫瑰园| 亚洲自拍偷拍色片视频| 高清欧美性猛交xxxx黑人猛交| 欧美性猛交xxxx乱大交极品| 亚洲电影免费观看高清完整版在线观看| 欧美亚洲国产精品| 91久久久久久久一区二区| 色天天综合狠狠色| 精品亚洲aⅴ在线观看| 久久久久国产视频| 日韩av第一页| 在线免费看av不卡| 国产精品高潮在线| 欧美巨猛xxxx猛交黑人97人| 欧美日韩亚洲视频| 综合国产在线观看| 日韩电影免费观看在线观看| 性欧美在线看片a免费观看| 日韩亚洲欧美中文高清在线| 51久久精品夜色国产麻豆| 亚洲人成电影网站| 久久久久久久久久av| 日韩欧美中文在线|