C語言類的雙向鏈表詳解
前言
鏈表(linked list)是一種這樣的數(shù)據(jù)結構,其中的各對象按線性排列。數(shù)組的線性順序是由數(shù)組下標決定的,然而于數(shù)組不同的是,鏈表的各順序是由鏈表中的指針決定的。
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。一般我們都構造雙向循環(huán)鏈表。
雙向鏈表的定義
雙鏈表(doubly linked list)的每一個元素都是一個對象,每一個對象都有一個數(shù)據(jù)域和兩個指針front和tail。對象中還可以包含其他輔助數(shù)據(jù)。設L為鏈表的一個元素,L.front指向他在鏈表中的后繼元素,L.tail指向他的前繼元素。


我們可以定義一個結構體封裝這些數(shù)據(jù)
typedef struct Node
{
int data;
struct Node* front;
struct Node* tail;
}NODE, * LPNODE;雙向鏈表的創(chuàng)建
在C++中,我們以類的形式封裝了雙向鏈表。在類中,我們定義了兩個指針,一個是指向鏈表的頭部 frontNode,一個是指向了鏈表的尾部 tailNode,另外我們還加入了 curSize屬性,記錄節(jié)點的個數(shù)。在對象創(chuàng)建的過程就是鏈表創(chuàng)建的過程,我們只需要在類的構造函數(shù)中初始化參數(shù)即可。
class duplexHead {
public:
duplexHead() {
frontNode = NULL;
tailNode = NULL;
curSize = 0;
}
LPNODE createNode(int data);
LPNODE seachNode(int data);
void push_front(int data);
void push_back(int data);
void push_appoin(int posData, int data);
void pop_front();
void pop_back();
void pop_appoin(int posData);
void printByFront();
void printByTail();
protected:
LPNODE frontNode;
LPNODE tailNode;
int curSize;
};節(jié)點的創(chuàng)建
在上面,我們已經知道雙向鏈表的單體長啥樣了,我們只需要給他的單體分配空間然后初始化他的參數(shù)即可。
LPNODE duplexHead::createNode(int data)
{
LPNODE newNode = new NODE;
assert(newNode);
newNode->front = nullptr;
newNode->tail = nullptr;
newNode->data = data;
return newNode;
}雙向鏈表節(jié)點查找
鏈表的查找我們可以定義一個函數(shù)LPNODE seachNode(int data),當滿足查找條件時,我們就返回當前節(jié)點的鏈表。在實際操作過程中,鏈表的數(shù)據(jù)域可能會有多個數(shù)據(jù),可能要比較int 類型,可能要比較string類型等多種變化,這是我們可以在參數(shù)列表預留一個函數(shù)指針 (int) (*comparData)(LPNODE data),以應對多種需求。當然,在這里為了演示方便,我們就用一個int 類型的數(shù)據(jù)代替了。
LPNODE duplexHead::seachNode(int data)
{
if (!curSize)
{
printf("鏈表為空,無法查找");
return;
}
LPNODE preNode = frontNode;
LPNODE curNode = frontNode;
while (curNode != NULL && curNode->data != data)
{
preNode = curNode;
curNode = preNode->tail;
}
if (curNode == nullptr)
{
printf("鏈表中沒有該數(shù)據(jù)");
return nullptr;
}
return curNode;
}雙向鏈表的插入
插入節(jié)點,我們分為頭部插入和尾部插入以及指定位置插入。而這三種插入,都可分為3步。
(1)創(chuàng)建新節(jié)點
(2)找到插入位置
(3)插入
我們就以制定位置插入為例,如圖所示,我們只需把原來相連的兩個節(jié)點斷開,然后再分別用指針拼接起來,當然我們也可以調用我們的seachNode來查找位置,這樣就更方便一些了。

void duplexHead::push_appoin(int posData, int data)
{
if (curSize == 0)
return;
if (frontNode->data == posData)
{
push_front(data);
}
else
{
LPNODE preNode = frontNode;
LPNODE curNode = frontNode;
while (curNode != NULL && curNode->data != posData)
{
preNode = curNode;
curNode = preNode->tail;
}
if (curNode == NULL)
{
printf("未找到指定位置,無法插入!\n");
}
else
{
LPNODE newNode = createNode(data);
preNode->tail = newNode;
newNode->tail = curNode;
curNode->front = newNode;
newNode->front = preNode;
curSize++;
}
}
}雙向鏈表的節(jié)點刪除
刪除節(jié)點我們也可以分為頭部刪除,尾部刪除,指定數(shù)據(jù)刪除。他與插入節(jié)點幾乎是一樣的
(1)找到刪除位置
(2)刪除
我們就以指定數(shù)據(jù)刪除為例,我們通過while或者seachNode來查找到要刪除的節(jié)點,然后把他的front 指向的位置和tail指向的位置記住,就可以直接刪除節(jié)點了。刪除完了節(jié)點要記得把前后段的鏈表連接上即可。

void duplexHead::pop_appoin(int posData)
{
if (frontNode == NULL || curSize == 0)
{
printf("鏈表為空無法刪除!");
return;
}
if (frontNode->data == posData)
{
pop_front();
return;
}
LPNODE preNode = frontNode;
LPNODE curNode = frontNode;
while (curNode != NULL && curNode->data != posData)
{
preNode = curNode;
curNode = preNode->tail;
}
if (curNode == NULL)
{
printf("未找到指定位置無法刪除!\n");
}
else
{
if (tailNode == curNode)
{
pop_back();
}
else
{
preNode->tail = curNode->tail;
//curNode->tail是不是不空
//當刪除的表尾時候,curNode->tail等于空
curNode->tail->front = preNode;
free(curNode);
curNode = NULL;
curSize--;
}
}
}雙向鏈表的刪除
于雙向鏈表的創(chuàng)建一樣,我們可以把雙向鏈表的刪除放在析構函數(shù)中,實現(xiàn)創(chuàng)建和刪除自動化,當對象被創(chuàng)建,雙向鏈表就被創(chuàng)建,當對象消亡,雙向鏈表就刪除了。
duplexHead::~duplexHead()
{
if (!frontNode)return;
LPNODE pmove ;
while (!pmove)
{
pmove = frontNode->tail;
delete frontNode->tail;
frontNode = pmove;
}
}總結
到此這篇關于C語言類的雙向鏈表詳解的文章就介紹到這了,更多相關C語言雙向鏈表內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解C++虛函數(shù)中多態(tài)性的實現(xiàn)原理
C++是一種面向對象的編程語言,在C++中,虛函數(shù)是實現(xiàn)多態(tài)性的關鍵。本文就來探討一下C++虛函數(shù)中多態(tài)性的實現(xiàn)原理及其在面向對象編程中的應用吧2023-05-05
Qt數(shù)據(jù)庫應用之實現(xiàn)數(shù)據(jù)的導入與導出
QT中涉及到數(shù)據(jù)庫相關的項目,幾乎都需要將少量的信息數(shù)據(jù)導出到文件保存好,然后用戶可以打開該表格進行編輯,編輯完成后保存,再重新導入到軟件中。所以本文將具體為大家介紹一下這一功能如何實現(xiàn),感興趣的可以跟隨小編一起試一試2022-01-01
詳解C語言用malloc函數(shù)申請二維動態(tài)數(shù)組的實例
這篇文章主要介紹了詳解C語言用malloc函數(shù)申請二維動態(tài)數(shù)組的實例的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10

