最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)一個(gè)封裝的雙鏈表的完整代碼

 更新時(shí)間:2025年07月08日 10:47:17   作者:平凡程序猿~  
雙鏈表是鏈表的一種變種,除了每個(gè)節(jié)點(diǎn)指向下一個(gè)節(jié)點(diǎn)外,還多了一個(gè)指向前一個(gè)節(jié)點(diǎn)的指針,由于雙鏈表可以從兩端進(jìn)行遍歷,它的插入和刪除操作更為靈活,本文將詳細(xì)介紹如何使用 C++ 語言實(shí)現(xiàn)一個(gè)封裝的雙鏈表類,需要的朋友可以參考下

一、雙鏈表的基本概念

雙鏈表是一種由一組節(jié)點(diǎn)構(gòu)成的線性數(shù)據(jù)結(jié)構(gòu),其中每個(gè)節(jié)點(diǎn)包含三部分:

  1. 數(shù)據(jù)域:存儲(chǔ)節(jié)點(diǎn)的數(shù)據(jù)。
  2. 前驅(qū)指針:指向前一個(gè)節(jié)點(diǎn)。
  3. 后繼指針:指向下一個(gè)節(jié)點(diǎn)。

與單鏈表相比,雙鏈表中的每個(gè)節(jié)點(diǎn)有兩個(gè)指針,可以雙向遍歷,方便插入和刪除操作。

在 C++ 中,我們通過類的封裝特性來實(shí)現(xiàn)雙鏈表,利用指針來動(dòng)態(tài)管理節(jié)點(diǎn)的內(nèi)存空間,保證數(shù)據(jù)的靈活性和高效性。

二、雙鏈表類的設(shè)計(jì)

我們將通過一個(gè)簡(jiǎn)單的 C++ 類來實(shí)現(xiàn)雙鏈表,該類包含基本的雙鏈表操作,如插入、刪除、查找、修改等。

1. 雙鏈表類的成員變量

我們定義了一個(gè) DList 類,包含以下成員變量:

  • phead:指向雙鏈表頭節(jié)點(diǎn)的指針。

2. 構(gòu)造函數(shù)和析構(gòu)函數(shù)

雙鏈表類的構(gòu)造函數(shù)負(fù)責(zé)初始化成員變量,析構(gòu)函數(shù)負(fù)責(zé)釋放動(dòng)態(tài)分配的內(nèi)存。

#include<iostream>
using namespace std;

// 節(jié)點(diǎn)類型聲明
struct Node
{
    int date;
    Node* last;  // 前驅(qū)節(jié)點(diǎn)
    Node* next;  // 后繼節(jié)點(diǎn)
};

class DList
{
private:
    // 成員變量
    Node* phead;

public:
    // 構(gòu)造函數(shù)
    DList() : phead(nullptr) {}

    // 析構(gòu)函數(shù)
    ~DList()
    {
        while (phead != NULL)
        {
            PopFront();
        }
    }

    // 創(chuàng)建節(jié)點(diǎn)
    Node* CreateNode(int x)
    {
        Node* node = new Node;
        node->date = x;
        node->last = NULL;
        node->next = NULL;
        return node;
    }

    // 打印鏈表
    void PrintList()
    {
        Node* cur = phead;
        while (cur)
        {
            cout << cur->date << "<-->";  // 雙向箭頭表示雙鏈表
            cur = cur->next;
        }
        cout << "NULL" << endl;
    }

    // 頭插法
    void PushFront(int x)
    {
        Node* newnode = CreateNode(x);
        if (phead == NULL)
        {
            phead = newnode;
        }
        else
        {
            newnode->next = phead;
            phead->last = newnode;
            phead = newnode;
        }
    }

    // 尾插法
    void PushBack(int x)
    {
        Node* newnode = CreateNode(x);
        if (phead == NULL)
        {
            phead = newnode;
        }
        else
        {
            Node* tail = phead;
            while (tail->next != NULL)
            {
                tail = tail->next;
            }
            tail->next = newnode;
            newnode->last = tail;
        }
    }

    // 頭刪法
    void PopFront()
    {
        if (phead == NULL)
        {
            cout << "鏈表為空,無法進(jìn)行刪除操作!" << endl;
        }
        else
        {
            Node* del = phead;
            phead = del->next;
            if (phead != NULL)
            {
                phead->last = NULL;
            }
            delete del;
            del = NULL;
        }
    }

    // 尾刪法
    void PopBack()
    {
        if (phead == NULL)
        {
            cout << "鏈表為空,無法進(jìn)行刪除操作!" << endl;
        }
        else
        {
            if (phead->next == NULL)  // 只有一個(gè)節(jié)點(diǎn)
            {
                delete phead;
                phead = NULL;
            }
            else
            {
                Node* tail = phead;
                while (tail->next != NULL)
                {
                    tail = tail->next;
                }
                tail->last->next = NULL;
                delete tail;
                tail = NULL;
            }
        }
    }
     //指定元素后插入
    void InsertAfter(int v, int x)
    {
        Node* node = phead;
        while (node != NULL && node->date != v)
        {
            node = node->next;
        }

        if (node == NULL)
        {
            cout << "未找到值為 " << v << " 的節(jié)點(diǎn),無法插入!" << endl;
            return;
        }

        Node* newnode = CreateNode(x);
        newnode->last = node;
        newnode->next = node->next;

        if (node->next != NULL)
        {
            node->next->last = newnode;
        }

        node->next = newnode;
    }

    // 根據(jù)值刪除節(jié)點(diǎn)
    void PopValue(int value)
    {
        if (phead == NULL)
        {
            cout << "鏈表為空,無法進(jìn)行刪除操作!" << endl;
            return;
        }
        Node* cur = phead;
        while (cur != NULL)
        {
            if (cur->date == value)
            {
                // 刪除節(jié)點(diǎn)
                if (cur->last != NULL)
                {
                    cur->last->next = cur->next;
                }
                else
                {
                    // 刪除的是頭節(jié)點(diǎn)
                    phead = cur->next;
                }

                if (cur->next != NULL)
                {
                    cur->next->last = cur->last;
                }
                delete cur;
                cur = NULL;
                cout << "刪除節(jié)點(diǎn) " << value << " 成功!" << endl;
                return;
            }
            cur = cur->next;
        }
        cout << "未找到值為 " << value << " 的節(jié)點(diǎn)!" << endl;
    }
};

int main()
{
    DList ls1;
    ls1.PushBack(1);
    ls1.PushBack(2);
    ls1.PushBack(3);
    ls1.PushBack(4);
    ls1.PushBack(5);
    ls1.PrintList();

    ls1.PopFront();
    ls1.PopBack();
    ls1.PushFront(9);
    ls1.PrintList();

    ls1.InsertAfter(9,7);
    ls1.PrintList();

    ls1.PopValue(4);
    ls1.PrintList();
    return 0;
}

三、雙鏈表操作實(shí)現(xiàn)

  1. PushFront:在鏈表的頭部插入新元素。
  2. PushBack:在鏈表的尾部插入新元素。
  3. PopFront:刪除鏈表的頭元素。
  4. PopBack:刪除鏈表的尾元素。
  5. InsertAfter:在指定節(jié)點(diǎn)之后插入新節(jié)點(diǎn)。
  6. PopValue:根據(jù)節(jié)點(diǎn)值刪除該節(jié)點(diǎn)。

四、總結(jié)

通過面向?qū)ο蟮姆绞綄?shí)現(xiàn)雙鏈表,我們能夠更加方便和安全地進(jìn)行雙鏈表操作。封裝了內(nèi)存管理、節(jié)點(diǎn)操作等的類,使得雙鏈表的使用更加直觀并且易于維護(hù)。雙鏈表的優(yōu)勢(shì)在于其靈活的插入和刪除操作,特別適合需要頻繁變更數(shù)據(jù)結(jié)構(gòu)的場(chǎng)景。

以上就是C++實(shí)現(xiàn)一個(gè)封裝的雙鏈表的完整代碼的詳細(xì)內(nèi)容,更多關(guān)于C++封裝的雙鏈表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

沂水县| 丰台区| 嘉禾县| 宁晋县| 响水县| 古田县| 思茅市| 普格县| 当阳市| 龙游县| 莱州市| 清流县| 大余县| 南康市| 颍上县| 西丰县| 延庆县| 浦北县| 宁海县| 昌江| 永川市| 左权县| 班玛县| 织金县| 池州市| 湟源县| 越西县| 定兴县| 汕尾市| 新巴尔虎左旗| 锡林浩特市| 怀仁县| 惠水县| 新乡县| 陕西省| 永修县| 刚察县| 沛县| 开阳县| 积石山| 长海县|