鏈表大概分爲有無頭指針,有無尾指針,是否循環,單向仍是雙向,spa
這些都很簡單,前提是你要把指針和單鏈表理解透徹。這些都是基於單鏈表指針
的變形,要根據實際問題,選擇鏈表的類型。code
頭指針的指針域儲存着儲存頭節點的地址,其數據域咱們不使用。blog
尾指針同理。it
循環鏈表的最後一個節點指向頭節點(若是有頭指針,則是指向頭指針),io
非循環鏈表的最後一個節點指向NUll。class
單向鏈表只有一個指針域,且指向下一個節點地址,變量
而雙向鏈表有兩個指針域,一個指向該節點的上一個節點地址,循環
另外一個指向該節點的下一個節點地址。 鏈表
構建鏈表節點:
1 #define ElemType int //鏈表元素類型 2 3 //線性表的雙向鏈表儲存結構 4 typedef struct DuLNode { 5 ElemType data; //數據域 6 struct DuLNode *prior; //前驅指針域 7 struct DuLNode *next; //後繼指針域 8 9 }DuLNode;
若是d爲指向鏈表中某一個節點的指針 則顯然知足
d->next->prior=d->prior->next=d //d->next 表示d的上一個節點 //d->next->prior 表示d的上一個節點的下一個節點 即d自己 //-_-!有點繞啊
雙向循環鏈表中有一些操做只須要一個方向的指針,好比計算鏈表長度(這裏全局變量iCount即爲長度),
查找元素,返回元素位置等等(這些我都不想寫 請原諒個人懶-_-) ,固然涉及兩個方向的指針我都會貼出來的。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define OK 1 4 #define ERROR 0 5 #define ElemType int //鏈表元素類型 6 int iCount; // 定義全局變量 表示鏈表長度 7 //線性表的雙向鏈表儲存結構 8 typedef struct DuLNode { 9 ElemType data; //數據域 10 struct DuLNode *prior; //前驅指針域 11 struct DuLNode *next; //後繼指針域 12 13 }DuLNode; 14 //建立鏈表 15 DuLNode *CreateDuLNode() { 16 DuLNode *pHead , *pEnd, *pNew; 17 //頭指針的初始化 18 pHead=(DuLNode*)malloc(sizeof(DuLNode)); 19 pHead->prior = NULL; 20 pHead->next = NULL; 21 if (!pHead) exit(0); 22 23 pNew = pEnd = (DuLNode*)malloc(sizeof(DuLNode)); 24 if (!pNew) exit(0); 25 scanf("%d", &pNew->data); 26 while (pNew->data != 0 ) //讀取到0結束 27 { 28 iCount++; 29 if (iCount == 1) 30 { 31 pNew->prior= pHead; 32 pNew->next = NULL; 33 pHead->next = pNew; 34 pEnd = pNew; 35 36 } 37 else 38 { 39 pNew->prior = pEnd; 40 pNew->next = NULL; 41 pEnd->next = pNew; 42 pEnd = pNew; 43 } 44 pNew = (DuLNode*)malloc(sizeof(DuLNode)); 45 if (!pNew) exit(0); 46 scanf("%d", &pNew->data); 47 48 } 49 free(pNew); //釋放多餘的空間 50 pHead->prior = pEnd; //造成 51 pEnd->next = pHead; // 雙循環 52 return pHead; 53 } 54 //插入節點 55 int DuLInsert(DuLNode *p, int i, DuLNode *s) { 56 /*在帶頭指針的的雙鏈循環線性表p中的第i個位置 57 以前插入節點s,i的合法值爲1<=i<=表長(頭指針不算長度)+1 58 i取最小值頭插,i取最大值尾插*/ 59 DuLNode *q; 60 if (i<1 || i>iCount + 1) //i的值不合法 61 return ERROR; 62 63 if (i == iCount + 1) //在p中肯定第i個元素的位置 指針q 64 q = p; 65 else 66 for (q = p; i > 0; i--) 67 q = q->next; 68 //先插入 後修改 防止斷鏈 69 q->prior->next = s; 70 s->prior = q->prior; 71 q->prior = s; 72 s->next = q; 73 74 return OK; 75 } 76 //刪除第i個節點,並用e返回刪除值 77 int DuLDelete(DuLNode *p, int i, ElemType *e) { 78 /*在帶頭指針的的雙鏈循環線性表p中的第i個位置 79 以前插入節點s,i的合法值爲1<=i<=表長(頭指針不算長度)+1 80 i取最小值頭刪,i取最大值尾刪*/ 81 DuLNode *q; 82 if (i<1 || i>iCount + 1) //i的值不合法 83 return ERROR; 84 85 //在p中肯定第i個元素的位置 指針q 86 for (q = p; i > 0; i--) 87 q = q->next; 88 89 90 *e = q->data; 91 q->prior->next = q->next; 92 q->next->prior = q->prior; 93 free(q); 94 95 96 return OK; 97 }