資料結構--連結串列
阿新 • • 發佈:2021-01-12
連結串列
-
連結串列是一種物理儲存結構上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。
-
常用的兩種連結串列結構:無頭單向非迴圈連結串列和帶頭雙向迴圈連結串列。
-
連結串列的特點:
(1)進行插入、刪除時,不需要移動表中元素;
(2)不必事先估計儲存空間;
(3)所需空間與線性表長度成正比。 -
帶頭雙向迴圈連結串列增刪查改的實現:
// 帶頭+雙向+迴圈連結串列增刪查改實現
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);
}