1. 程式人生 > 其它 >資料結構--連結串列

資料結構--連結串列

技術標籤:資料結構筆記資料結構

連結串列

  1. 連結串列是一種物理儲存結構上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。

  2. 常用的兩種連結串列結構:無頭單向非迴圈連結串列和帶頭雙向迴圈連結串列。
    在這裡插入圖片描述
    在這裡插入圖片描述

  3. 連結串列的特點:
    (1)進行插入、刪除時,不需要移動表中元素;
    (2)不必事先估計儲存空間;
    (3)所需空間與線性表長度成正比。

  4. 帶頭雙向迴圈連結串列增刪查改的實現:

// 帶頭+雙向+迴圈連結串列增刪查改實現
typedef int LTDataType;
typedef struct ListNode
{
	LTDataType _data;
	struct
ListNode* _next; struct ListNode* _prev; }ListNode; // 建立返回連結串列的頭結點. ListNode* ListCreate(LTDataType x) { struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); head->_data = x; head->_next = head->_prev = NULL; return head; } // 雙向連結串列銷燬 void ListDestory(ListNode* pHead)
{ struct ListNode* cur = pHead->_next; while (cur != pHead) { struct ListNode* next = cur->_next; free(cur); cur = cur->_next; } free(pHead); pHead = NULL; } // 雙向連結串列列印 void ListPrint(ListNode* pHead) { struct ListNode* cur = pHead->_next; while (cur!=pHead) { printf("%d "
, cur->_data); cur = cur->_next; } printf("\n"); } // 雙向連結串列尾插 //tail node pHead void ListPushBack(ListNode* pHead, LTDataType x) { struct ListNode* tail = pHead->_prev; struct ListNode* node = ListCreate(x); tail->_next = node; node->_prev = tail; pHead->_prev = node; node->_next = pHead; } // 雙向連結串列尾刪 //prev tail pHead void ListPopBack(ListNode* pHead) { if (pHead->_prev == pHead) return; struct ListNode* tail = pHead->_prev; struct ListNode* prev = tail->_prev; free(tail); prev->_next = pHead; pHead->_prev = prev; } // 雙向連結串列頭插 // pHead node next void ListPushFront(ListNode* pHead, LTDataType x) { struct ListNode* node = ListCreate(x); struct ListNode* next = pHead->_next; pHead->_next = node; node->_prev = pHead; next->_prev = node; node->_next = next; } // 雙向連結串列頭刪 //pHead prev next void ListPopFront(ListNode* pHead) { if (pHead->_prev == pHead) return; struct ListNode* prev = pHead->_next; struct ListNode* next = prev->_next; free(prev); pHead->_next = next; next->_prev = pHead; } // 雙向連結串列查詢 ListNode* ListFind(ListNode* pHead, LTDataType x) { if (pHead->_prev == pHead) return NULL; struct ListNode* head = pHead; while (pHead->_data != x) { pHead = pHead->_next; if (pHead->_next = head) return NULL; } return pHead; } // 雙向連結串列在pos的前面進行插入 //prev node pos void ListInsert(ListNode* pos, LTDataType x) { struct ListNode* node = ListCreate(x); struct ListNode* prev = pos->_prev; prev->_next = node; node->_prev = prev; node->_next = pos; pos->_prev = node; } // 雙向連結串列刪除pos位置的節點 //prev pos next void ListErase(ListNode* pos) { struct ListNode* prev = pos->_prev; struct ListNode* next = pos->_next; prev->_next = next; next->_prev = prev; free(pos); }