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

使用C++實現(xiàn)單鏈表的操作與實踐

 更新時間:2025年02月10日 09:28:55   作者:平凡程序猿~  
在程序設(shè)計中,鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),特別是在動態(tài)數(shù)據(jù)管理、頻繁插入和刪除元素的場景中,鏈表相比于數(shù)組,具有更高的靈活性和高效性,尤其是在需要頻繁修改數(shù)據(jù)結(jié)構(gòu)的應(yīng)用中,本文將詳細介紹如何用C++語言實現(xiàn)一個面向?qū)ο蟮膯捂湵?并展示完整的代碼示例

一、單鏈表的基本概念

單鏈表是一種由節(jié)點組成的線性數(shù)據(jù)結(jié)構(gòu),其中每個節(jié)點包含數(shù)據(jù)部分和指向下一個節(jié)點的指針。與數(shù)組不同,鏈表的節(jié)點在內(nèi)存中不要求連續(xù)存儲,而是通過指針連接。因此,鏈表的插入和刪除操作較為靈活,不需要大量的數(shù)據(jù)移動。

在C++中,我們通過類的封裝特性來實現(xiàn)面向?qū)ο蟮逆湵恚@不僅能有效管理鏈表的內(nèi)存,還能通過封裝實現(xiàn)更易用、更安全的操作。

二、單鏈表類的設(shè)計

我們將通過一個簡單的C++類來實現(xiàn)單鏈表,該類包含基本的鏈表操作,如插入、刪除、打印鏈表等。

1. 節(jié)點的定義

首先,我們定義了一個 Node 結(jié)構(gòu)體來表示鏈表中的每個節(jié)點。每個節(jié)點包含一個數(shù)據(jù)部分 data 和一個指向下一個節(jié)點的指針 next

struct Node {
    int data;      // 數(shù)據(jù)域
    Node* next;    // 指針域,指向下一個節(jié)點
};

2. 鏈表的類定義

接下來,我們定義 List 類,它包含一個指向鏈表頭部的指針 phead,以及若干成員函數(shù)來實現(xiàn)鏈表的常見操作。

class List {
private:
    Node* phead; // 鏈表頭指針

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

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

    // 創(chuàng)建節(jié)點
    Node* CreateNode(int x) {
        Node* node = new Node;
        node->data = x;
        node->next = nullptr;
        return node;
    }

    // 打印鏈表
    void PrintList() {
        Node* cur = phead;
        while (cur) {
            cout << cur->data << "-->";
            cur = cur->next;
        }
        cout << "NULL" << endl;
    }

    // 頭插法
    void PushFront(int x) {
        Node* newNode = CreateNode(x);
        newNode->next = phead;
        phead = newNode;
    }

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

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

    // 尾刪
    void PopBack() {
        if (phead == nullptr)
            cout << "鏈表為空,無法進行刪除操作!" << endl;
        else {
            if (phead->next == nullptr) {
                delete phead;
                phead = nullptr;
            } else {
                Node* tail = phead;
                while (tail->next->next != nullptr) {
                    tail = tail->next;
                }
                delete tail->next;
                tail->next = nullptr;
            }
        }
    }
};

三、單鏈表的操作實現(xiàn)

  • PushFront: 在鏈表的頭部插入新節(jié)點。
  • PushBack: 在鏈表的尾部插入新節(jié)點。
  • PopFront: 刪除鏈表的頭節(jié)點。
  • PopBack: 刪除鏈表的尾節(jié)點。
  • PrintList: 打印鏈表中的所有節(jié)點。

四、測試與演示

下面的 main 函數(shù)展示了如何使用上述鏈表類實現(xiàn)基本操作:

int main() {
    List ls1;  // 創(chuàng)建一個鏈表對象

    // 進行一些操作
    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();

    return 0;
}

五、鏈表操作的復(fù)雜度

  1. PushFront 和 PopFront:這兩個操作的時間復(fù)雜度為 O(1),因為它們僅僅操作鏈表的頭節(jié)點。
  2. PushBack 和 PopBack:這兩個操作的時間復(fù)雜度為 O(n),需要遍歷整個鏈表,直到找到尾節(jié)點。
  3. PrintList:打印鏈表的時間復(fù)雜度為 O(n),需要遍歷所有節(jié)點。

六、完整代碼

#include<iostream>
using namespace std;
//節(jié)點類型聲明
struct Node
{
    int date;
    Node* next;
};
class List
{
private:
    //成員變量
    Node* phead;
public:
    //成員函數(shù)
    List() : phead(nullptr) {}//構(gòu)造函數(shù)
    ~List()//析構(gòu)函數(shù)
    {
        while(phead!=NULL)
        {
            PopFront();
        }
    }
    Node* CreateNode(int x)//創(chuàng)建節(jié)點
    {
        Node* node=new Node;
        node->date=x;
        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);
        newnode->next=phead;
        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;
        }

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

    void PopBack()  //尾刪
    {
        if (phead== NULL)
            cout<<"鏈表為空,無法進行刪除操作!"<<endl;
       else
        {
           if(phead->next==NULL)
           {
               delete phead;
               phead=NULL;
           }
           else
           {
               Node* tail = phead;
               while (tail->next->next != NULL)
               {
                   tail = tail->next;
               }
               delete tail->next;
               tail->next=NULL;
           }
        }
    }

};
int main()
{
    List 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();
    return 0;
}

七、總結(jié)

通過面向?qū)ο蟮姆绞綄崿F(xiàn)單鏈表,我們可以更加方便和安全地進行鏈表操作。封裝了節(jié)點管理、內(nèi)存管理以及鏈表操作函數(shù)的類,讓鏈表操作更加直觀并且容易維護。在實際開發(fā)中,鏈表結(jié)構(gòu)廣泛應(yīng)用于各種算法和數(shù)據(jù)管理系統(tǒng),掌握鏈表的使用可以幫助我們高效地解決許多動態(tài)數(shù)據(jù)管理的問題。

以上就是使用C++實現(xiàn)單鏈表的操作與實踐的詳細內(nèi)容,更多關(guān)于C++實現(xiàn)單鏈表的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)之矩陣行列和相等的實例

    數(shù)據(jù)結(jié)構(gòu)之矩陣行列和相等的實例

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之矩陣行列和相等的實例的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C++歸并排序算法詳解

    C++歸并排序算法詳解

    大家好,本篇文章主要講的是C++歸并排序算法詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C語言實現(xiàn)用?*?打印X形圖案

    C語言實現(xiàn)用?*?打印X形圖案

    這篇文章主要介紹了C語言實現(xiàn)用?*?打印X形圖案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實例講解四種類型轉(zhuǎn)換的使用

    C++實例講解四種類型轉(zhuǎn)換的使用

    在C++語言中新增了四個關(guān)鍵字static_cast、const_cast、reinterpret_cast和dynamic_cast。這四個關(guān)鍵字都是用于類型轉(zhuǎn)換的,類型轉(zhuǎn)換(type cast),是高級語言的一個基本語法。它被實現(xiàn)為一個特殊的運算符,以小括號內(nèi)加上類型名來表示,接下來讓我們一起來詳細了解
    2022-06-06
  • c++使用正則表達式提取關(guān)鍵字的方法

    c++使用正則表達式提取關(guān)鍵字的方法

    這篇文章給大家介紹了c++使用正則表達式提取關(guān)鍵字的方法,相對來說比較簡單,同時給大家提到了c++通過正則表達式提取匹配到的字符串的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08
  • C語言數(shù)獨游戲的求解方法

    C語言數(shù)獨游戲的求解方法

    這篇文章主要為大家詳細介紹了C語言數(shù)獨游戲的求解方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++求四個正整數(shù)最大公約數(shù)的方法

    C++求四個正整數(shù)最大公約數(shù)的方法

    這篇文章主要介紹了C++求四個正整數(shù)最大公約數(shù)的方法,涉及C++求余算法的運用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-05-05
  • C++ 繼承從語法陷阱到內(nèi)存底層的終極復(fù)習(xí)

    C++ 繼承從語法陷阱到內(nèi)存底層的終極復(fù)習(xí)

    本文深入解析C++繼承,從基礎(chǔ)語法到對象模型暗坑,涵蓋訪問控制、內(nèi)存布局、菱形繼承等難題,教你如何規(guī)避對象切片、名字隱藏、虛基表等常見陷阱,助你寫出健壯高效代碼,感興趣的朋友一起看看吧
    2026-05-05
  • C語言中main函數(shù)兩個參數(shù)的作用

    C語言中main函數(shù)兩個參數(shù)的作用

    這篇文章主要介紹了C語言中main函數(shù)兩個參數(shù)的作用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • c語言 sscanf,scanf,fscanf正則表達式用法

    c語言 sscanf,scanf,fscanf正則表達式用法

    每種語言都對正則表達式有著不同程度的支持,在C語言中,有輸入功能的這三個函數(shù)對正則表達式的支持并不強大,但是我們還是有必要了解一下
    2018-04-04

最新評論

英山县| 静海县| 武宣县| 光泽县| 永定县| 海晏县| 黄浦区| 聂荣县| 阳曲县| 弋阳县| 如东县| 钟祥市| 治县。| 保靖县| 苏尼特右旗| 枣庄市| 肥西县| 拉萨市| 澄江县| 玉溪市| 新宁县| 金乡县| 广安市| 曲阜市| 盖州市| 黑山县| 仁怀市| 铁岭县| 思南县| 永丰县| 昌宁县| 阳曲县| 惠州市| 屏南县| 临城县| 若尔盖县| 烟台市| 磐安县| 富川| 昭苏县| 田林县|