1. 程式人生 > >資料結構與演算法分析 - 1 - 連結串列ADT

資料結構與演算法分析 - 1 - 連結串列ADT

1.描述:不連續儲存的表,可以把連結串列看成一個數組,陣列元素是一個個結構體,這些結構體之間通過指標連線

 

 

2.優點:

  利用不連續的儲存空間,提高記憶體使用效率

  避免刪除和插入的線性開銷 

  對比陣列,大小不固定,可以擴充套件   

 

3. 缺點:查詢效率低

 

4. 定義一個單向連結串列

1 struct Node 
2 {
3     ElementType value;
4     Node *next;        //next指標,指向下一個節點
5 };

 

5.檢測連結串列是否為空

對於一個單向連結串列,連結串列為空即頭節點為空

1 int IsEmpty(Node *head)      //將連結串列傳入函式,傳入頭指標即可
2 {
3     return head->next == NULL;  //若為空編譯器將提示異常
4 }

 

6.測試當前位置是否為連結串列末尾

1 int IsLast(Node *Pos)
2 {
3     return Pos->next == NULL;
4 }

 

7.遍歷並列印連結串列

 1 void Print(Node *head)
 2 {
 3     Node *p = head;      //類似範圍for迴圈
4 while (p != NULL) 5 { 6 cout << p->value << " "; 7 p = p->next; 8 } 9 cout << endl; 10 }

 

8.檢索連結串列,找出匹配的節點

1 Node* Find(ElementType x, Node *head)
2 {
3     Node *Pos;
4     Pos = head->next;
5     while (Pos != NULL && Pos->value != x)
6 Pos = Pos->next; 7 8 return Pos; 9 }

 

9.檢索匹配節點的前驅元

1 Node* FindPrevious(ElementType x, Node *head)
2 {
3     Node *Pos;
4     Pos = head;
5     while (Pos->next != NULL && Pos->next->value != x)
6         Pos = Pos->next;
7 
8     return Pos;
9 }

 

10.刪除節點

 1 void Delete(ElementType x, Node *head)
 2 {
 3     Node *Pos, *temp;
 4     Pos = FindPrevious(x, head);  //對於單向連結串列來說,獲取前驅元需要額外遍歷一次,這裡使用上面編寫的(9)FindPrevious函式
 5     if (!IsLast(Pos))         //(6)測試是否為連結串列末尾
 6     {
 7         temp = Pos->next;
 8         Pos->next = temp->next;
 9         //free(temp);         //C語言釋放記憶體
10         delete temp;
11     }
12 }

 

11.在連結串列任意位置插入節點

注意,如果當前連結串列為空,則需要先手動新建頭節點

1 void Insert(ElementType x, Node *head, Node *Pos)
2 {
3     Node *temp = new Node;
4     temp->value = x;
5     temp->next = Pos->next;
6     Pos->next = temp;
7 }

 

12.刪除連結串列

 1 void DeleteNode(Node *head)
 2 {
 3     Node *Pos, *temp;    //用臨時變數temp儲存被刪除前的Pos
 4     Pos = head->next;
 5     head->next = NULL;
 6     while (Pos != NULL)
 7     {
 8         temp = Pos->next;
 9         delete Pos;
10         Pos = temp;
11     }
12 }

 

13.雙向連結串列

1 struct Node 
2 {
3     int value;
4     Node *next;
5     Node *pre;    //新增一個pre指標指向上一個節點
6 };

 

14.迴圈連結串列

可以有表頭,也可以沒有表頭

若有表頭,則最後一個節點的next指向表頭

迴圈連結串列可以與雙向連結串列結合使用

 

15.連結串列的遊標實現(freelist)

全域性的結構體陣列,用陣列下標來代表地址

挖坑待填

 

參考資料:《資料結構與演算法分析——C語言描述》    Mark Allen Weiss