數(shù)據(jù)結(jié)構(gòu)(C++)之Double Linked List(type int)

只寫了int類型光督,代碼感覺還可以再優(yōu)化淑翼,至于用模板則還要學習; 簡單起見,全寫在了一個cpp文件中


//double linked list (type int)
#include <iostream>
using namespace std;

class Node
{
public:
    Node() {};
    Node(int val) {
        this->val =val;
        prior = next = nullptr;
    }
    ~Node() {};

    void setVal(int val) { this->val = val; }
    int getVal() {
        return this->val;
    }

    Node* prior;   //指向前節(jié)點指針
    Node* next;   //指向后節(jié)點指針
    
private:
    int val=0;
};


class DLlist
{
public:

    DLlist(int size) {
        this->size = size;
        head = new Node;
        head->prior = nullptr;
        head->next = nullptr;
        tail = head;
        for (int i = 0; i < this->size; i++)
        {
            int v;
            cout << "Enter the value of No. " << i +1<< " Node: ";
            cin >> v;
            if (i==0)
            {
                head->setVal(v);
            }
            else
            {
                Node* temp=new Node;
                temp->setVal(v);
                temp->next = nullptr;
                temp->prior = tail;
                tail->next = temp;
                tail = temp;
            }
        }
    }
    ~DLlist() { Clear(); }


    int getSize()
    {
        return this->size;
    }

    void insert(int num,int pos)   //在兩節(jié)點間插入,插入位置的前后節(jié)點必須都存在
    {
        Node* temp = new Node;
        Node* position;
        temp->setVal(num);
        position = GetPointer(pos);
        (position->prior)->next = temp;
        temp->next = position;
        temp->prior = position->prior;
        position->prior = temp;
        size++;
    }

    void deleteList(int pos)   //刪除節(jié)點阀溶,刪除位置的前后節(jié)點必須都存在
    {
        Node* position;
        position = GetPointer(pos);
        (position->prior)->next = position->next;
        (position->next)->prior = position->prior;
        delete position;
        size--;
    }

    void addFirst(int element)     //pushFront
    {
        
        if (head == nullptr)
        {
            head->setVal(element);
            head->prior = nullptr;
            head->next = nullptr;
            tail = head;
            size++;
        }
        else 
        {
            /*我們要在頭結(jié)點前再插入一個結(jié)點腻脏,需要先創(chuàng)建一個新的結(jié)點,將頭結(jié)點的值保存在新節(jié)點银锻,然后讓新節(jié)點的下
            個結(jié)點指向頭結(jié)點的下一個結(jié)點永品,再讓新節(jié)點的prior指向頭結(jié)點,這樣就將新節(jié)點與原來的鏈表融合了击纬,然后我  
            們將頭結(jié)點的數(shù)據(jù)換成element即可*/
            
            Node* temp=new Node;
            temp->setVal(head->getVal());
            temp->next = head->next;
            temp->prior = head;
            if (size > 1)
            {
                (head->next)->prior = temp;
            }
            head->next = temp;
            head->setVal(element);
            size++;
        }
    }

    void addLast(int element)   //pushBack
    {
        
        if (head==nullptr)
        {
            head->setVal(element);
            head->prior = nullptr;
            head->next = nullptr;
            tail = head;
            size++;
        }
        else
        {
            Node* temp = new Node;
            temp->setVal(tail->getVal());
            temp->prior = tail->prior;
            temp->next = tail;
            if (size-1!=0)
            {
                (tail->prior)->next = temp;
            }
            tail->prior = temp;
            tail->setVal(element);
            size++;
        }
    }

    int removeFirst()
    {
        int v = head->getVal();

        head = head->next;
        if (size > 1)
        {
            head->prior = nullptr;
        }

        size--;
        return v;
        
    }

    int removeLast()
    {
        int v = tail->getVal();
        
        tail =tail->prior;
        if (size>1)
        {
            tail->next = nullptr;
        }

        size--;
        return v;
    }

    int returnNth(int pos)
    {
        return GetPointer(pos)->getVal();
    }

    bool isEmpty()
    {
        if (size==0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    void printList()
    {
        for (int i = 0; i < size; i++)
        {
            cout << "No. " << i +1<< " = " << GetPointer(i)->getVal() << endl;
        }
    }

    
    void Clear()
    {
        while (head != nullptr)
        {
            Node * temp = head->next;
            delete head;
            head = temp;
        }
        tail = nullptr;
        size = 0;
    }

private:
    int size = 0;
    Node* head;  //指向頭節(jié)點的指針
    Node* tail;     //指向尾節(jié)點的指針

    Node* GetPointer(int pos)   //查找節(jié)點
    {
        Node* pNode = nullptr;
        if (pos<0 || pos>size-1)
        {
            cout << "Out of range! " << endl;
        }
        else
        {
            pNode = head;
            for (int i = 0; i < pos; i++)
            {
                pNode = pNode->next;
            }
            return pNode;
        }
    }
};

int main()
{
    DLlist d(3);
    cout << endl;
    cout << "Size: " << d.getSize() << endl;
    d.printList();
    cout << endl;

    cout << "Insert 10 at position 1" << endl;
    d.insert(10, 1);
    cout << "Size: " << d.getSize() << endl;
    d.printList();

    cout << endl;
    cout << "Addfirst 100" << endl;
    d.addFirst(100);
    cout << "Now No.1's value= " << d.returnNth(0) << endl;

    cout << endl;
    cout << "Remove first" << endl;
    d.removeFirst();
    d.printList();

    cout << endl;
    cout << "Remove last" << endl;
    d.removeLast();
    d.printList();

    cout << endl;
    d.~DLlist();
    cout << "Empty: " <<boolalpha<< d.isEmpty() << endl;

    system("pause");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鼎姐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炕桨,老刑警劉巖饭尝,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異献宫,居然都是意外死亡钥平,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門姊途,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涉瘾,“玉大人,你說我怎么就攤上這事吭净。” “怎么了肴甸?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵寂殉,是天一觀的道長。 經(jīng)常有香客問我原在,道長友扰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任庶柿,我火速辦了婚禮村怪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浮庐。我一直安慰自己甚负,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布审残。 她就那樣靜靜地躺著梭域,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搅轿。 梳的紋絲不亂的頭發(fā)上病涨,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音璧坟,去河邊找鬼既穆。 笑死,一個胖子當著我的面吹牛雀鹃,可吹牛的內(nèi)容都是我干的幻工。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼黎茎,長吁一口氣:“原來是場噩夢啊……” “哼会钝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤迁酸,失蹤者是張志新(化名)和其女友劉穎先鱼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奸鬓,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡焙畔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了串远。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏多。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖澡罚,靈堂內(nèi)的尸體忽然破棺而出伸但,到底是詐尸還是另有隱情,我是刑警寧澤留搔,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布更胖,位于F島的核電站,受9級特大地震影響隔显,放射性物質(zhì)發(fā)生泄漏却妨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一括眠、第九天 我趴在偏房一處隱蔽的房頂上張望彪标。 院中可真熱鬧,春花似錦掷豺、人聲如沸捞烟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坷襟。三九已至,卻和暖如春生年,著一層夾襖步出監(jiān)牢的瞬間婴程,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工抱婉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留档叔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓蒸绩,卻偏偏與公主長得像衙四,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子患亿,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,874評論 25 707
  • ^函數(shù)重載的匹配: 當函數(shù)名被重載后传蹈,函數(shù)的匹配過程:首先尋找能精確匹配的函數(shù)押逼,如果未能精確匹配,則嘗試...
    魯大帥閱讀 1,009評論 0 1
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,135評論 30 470
  • 網(wǎng)上各種流傳著階層越來越固化惦界,一個人越來越難以獲得成功挑格。但是,內(nèi)心中總有那么一種小小的吶喊與沖動沾歪,難道我們一個沒有...
    黯然楓雪閱讀 671評論 0 1
  • 最近忙灾搏,因為忙而忙挫望,從明天起更從容地去活,追求內(nèi)心的平靜狂窑。
    自分少年閱讀 133評論 0 0