亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、單鏈表的基本概念

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

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

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

我們將通過(guò)一個(gè)簡(jiǎn)單的C++類來(lái)實(shí)現(xiàn)單鏈表,該類包含基本的鏈表操作,如插入、刪除、打印鏈表等。

1. 節(jié)點(diǎn)的定義

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

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

2. 鏈表的類定義

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

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

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

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

    // 創(chuàng)建節(jié)點(diǎn)
    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 << "鏈表為空,無(wú)法進(jìn)行刪除操作!" << endl;
        else {
            Node* del = phead;
            phead = del->next;
            delete del;
            del = nullptr;
        }
    }

    // 尾刪
    void PopBack() {
        if (phead == nullptr)
            cout << "鏈表為空,無(wú)法進(jìn)行刪除操作!" << 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;
            }
        }
    }
};

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

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

四、測(cè)試與演示

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

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

    // 進(jìn)行一些操作
    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:這兩個(gè)操作的時(shí)間復(fù)雜度為 O(1),因?yàn)樗鼈儍H僅操作鏈表的頭節(jié)點(diǎn)。
  2. PushBack 和 PopBack:這兩個(gè)操作的時(shí)間復(fù)雜度為 O(n),需要遍歷整個(gè)鏈表,直到找到尾節(jié)點(diǎn)。
  3. PrintList:打印鏈表的時(shí)間復(fù)雜度為 O(n),需要遍歷所有節(jié)點(diǎn)。

六、完整代碼

#include<iostream>
using namespace std;
//節(jié)點(diǎn)類型聲明
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é)點(diǎn)
    {
        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<<"鏈表為空,無(wú)法進(jìn)行刪除操作!"<<endl;
        else
        {
            Node* del=phead;
            phead=del->next;
            delete del;
            del=NULL;
        }
    }

    void PopBack()  //尾刪
    {
        if (phead== NULL)
            cout<<"鏈表為空,無(wú)法進(jìn)行刪除操作!"<<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é)

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

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

相關(guān)文章

  • 8皇后問(wèn)題的解法實(shí)例代碼

    8皇后問(wèn)題的解法實(shí)例代碼

    8皇后問(wèn)題的解法實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • C++類與對(duì)象的詳細(xì)說(shuō)明2

    C++類與對(duì)象的詳細(xì)說(shuō)明2

    這篇文章主要為大家詳細(xì)介紹了C++的類與對(duì)象,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • VC++時(shí)鐘函數(shù)

    VC++時(shí)鐘函數(shù)

    VC中提供了很多關(guān)于時(shí)間操作的函數(shù),編寫(xiě)程序時(shí)我們可以跟據(jù)定時(shí)的不同精度要求選擇不同的時(shí)間函數(shù)來(lái)完成定時(shí)和計(jì)時(shí)操作
    2015-06-06
  • C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解

    C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • Windows消息傳遞機(jī)制詳解

    Windows消息傳遞機(jī)制詳解

    這篇文章主要介紹了Windows消息傳遞機(jī)制,有助于讀者更好的理解windows編程的消息機(jī)制,需要的朋友可以參考下
    2014-07-07
  • C++各種輸出數(shù)據(jù)類型詳解

    C++各種輸出數(shù)據(jù)類型詳解

    這篇文章主要介紹了C++各種輸出數(shù)據(jù)類型,在C++中,可以使用cout對(duì)象和插入運(yùn)算符<<輸出各種數(shù)據(jù)類型,包括整數(shù)類型、浮點(diǎn)數(shù)類型、字符類型、字符串類型和布爾類型,需要的朋友可以參考下
    2023-06-06
  • undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法

    undefined reference to `SetPduPowerConsumptionCnt''錯(cuò)誤的解決方法

    編譯時(shí)出現(xiàn)undefined reference to `SetPduPowerConsumptionCnt'錯(cuò)誤要如何解決呢?有沒(méi)有什么好的解決方法?下面小編就為大家解答吧,如果你也遇到了這種情況,可以過(guò)來(lái)參考下
    2013-07-07
  • C++?指針和對(duì)象成員訪問(wèn)的區(qū)別:`.`?與?`->`?的使用小結(jié)

    C++?指針和對(duì)象成員訪問(wèn)的區(qū)別:`.`?與?`->`?的使用小結(jié)

    在學(xué)習(xí)?C++?時(shí),常常會(huì)遇到訪問(wèn)對(duì)象成員的兩種符號(hào):.?和?->,這兩個(gè)符號(hào)看似簡(jiǎn)單,但它們的正確使用卻需要理解指針和對(duì)象的本質(zhì)差異,本文介紹C++?指針和對(duì)象成員訪問(wèn)的區(qū)別:`.`?與?`->`?的使用指南,感興趣的朋友一起看看吧
    2024-12-12
  • 關(guān)于C++出現(xiàn)Bus error問(wèn)題的排查與解決

    關(guān)于C++出現(xiàn)Bus error問(wèn)題的排查與解決

    項(xiàng)目代碼中經(jīng)常出現(xiàn)莫名其妙的Bus error問(wèn)題,并且代碼中增加很多try catch 后依然不能將錯(cuò)誤捕獲,一旦Bus erro出現(xiàn),進(jìn)程直接崩潰掉,所以本文給大家介紹了關(guān)于C++出現(xiàn)Bus error問(wèn)題的排查與解決,需要的朋友可以參考下
    2024-01-01
  • Qt學(xué)習(xí)之容器類的使用教程詳解

    Qt學(xué)習(xí)之容器類的使用教程詳解

    Qt提供了多個(gè)基于模板的容器類,這些類可以用于存儲(chǔ)指定類型的數(shù)據(jù)項(xiàng)。本文主要介紹了Qt常用容器類的使用,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12

最新評(píng)論