c++實現簡單的鏈表


注:我是一個編程菜鳥,哪個大神看出來缺陷提點一下,感激不盡。

鏈表由一個個的節點串聯而成,同一由first頭指針管理,屬於線性表中相比於數組,添加刪除方便,但訪問又有點慢的數據結構。

第一步:節點 Node的類。

class Node
{
    friend class List;//把List聲明為友類,好在List類中容易訪問Node的私有成員。
private:
    char Data;
    Node* next;
} ;//節點有兩個數據成員,數據域的字符類型的 Data,以及指向下一個節點的指針域 next。

第二步: 鏈表List的類。

class List
{
    Node* first;//第一個節點的指針
    Node* end;//最后一個節點的指針。。。這一個數據成員可有可無,我用來記錄最后一個節點的指針,添加新元素將會很快。
public:
    //構造函數
    List()
    {
        first=nullptr;
        end=nullptr;
    }
    /*添加元素*/
    Node* push_back(char p_back)
    {
        Node* a=new Node;
        a->Data=p_back;
        a->next=nullptr;
        if(a!=nullptr)
        {
          if (!first) //添加時是第一個節點的情況
          {
              first=a;
              end=a;
           }
            end->next=a;//已添加的最后一個節點的next指針賦值新添加的節點地址
            end=a;//end賦新的節點的地址。
         
            return end;
        }
        else
        {
            cout<<"節點分配空間失敗"<<endl;
            return nullptr;
        }
        }
    /*顯示鏈表中的各個元素*/
    void print()
    {
        Node* h=first;
        if (!h)
        {
            cout<<"空鏈表"<<endl;
        }
        else
        {
            while (h)
            {
               cout<<h->Data<<" ";
                h=h->next;
            }
        }
    }
    /*鏈表元素計數*/
    long count()
    {
        long acount=0;
        Node* start=first;
        while (start) {
            acount++;
            start=start->next;
        }
        return acount;
    }
    /*鏈表逆序*/
    void reverse()
    {
      //尾指針指向first
        end=first;
     //第一個節點指針域設為Null ,為逆序鏈表的尾節點,在這之前需要找到下一個節點
        Node* behind=first;//這個指針要做為下一個節點的next域。
        Node* pre=first->next;//當前第一個節點的的next域,靠它尋找第二個節點
        first->next=nullptr;//第一個節點變為尾節點
        first=pre;//first指向第二個節點
        while (first->next!=nullptr)
         {
            pre=first->next;//用於對first賦值
            first->next=behind;
            behind=first;
            first=pre;//first指向第二個節點
         }
        //還得執行最后一步
        first->next=behind;
    }
};

驗證:

#include <iostream>
#include "List.h"
using namespace std;
int main(int argc, const char * argv[])
{
    
    List  a;
    a.push_back('h');
    a.push_back('e');
    a.push_back('l');
    a.print();
    cout<<endl;
    cout<<"該鏈表有:"<<a.count()<<"個元素。"<<endl;
    cout<<endl;
    cout<<"鏈表逆序之后輸出:"<<endl;
    a.reverse();
    a.print();
    cout<<endl;
    cout<<"該鏈表有:"<<a.count()<<"個元素。"<<endl;
    return 0;
}
結果:

h e l
該鏈表有:3個元素。

鏈表逆序之后輸出:
l e h
該鏈表有:3個元素。
Program ended with exit code: 0

 注:我沒有寫析構函數,這會造成該程序運行時它的內存空間泄露,不過程序結束后,內存會被全部回收的。所有便於演示就沒有寫析構,不過大家千萬不要學我呀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM