雙向循環鏈表涉及雙向指針的基本操做(C語言)

  鏈表大概分爲有無頭指針,有無尾指針,是否循環,單向仍是雙向,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 }
相關文章
相關標籤/搜索