C++實現(xiàn)雙鏈表(Double Linked List)

C++實現(xiàn)雙鏈表(Double Linked List)


語言這個東西不用真的會忘秉继, 我記得前前后后C++的基本語法我也看了好幾遍了片酝,一直沒有動手寫過什么東西京闰,所以一遍遍的看,一遍遍的忘... ...

正好最近在看數(shù)據(jù)結構廓俭,想著自己用C++來實現(xiàn)一下靠瞎,一方面是熟悉整個邏輯過程比庄,加深對數(shù)據(jù)結構的理解,另一方面乏盐,也熟悉一下C++佳窑。

雙鏈表與單鏈表相同,都是由結點(Node)組成父能,但結點結構有所不同神凑,結點中有一個數(shù)據(jù)域和兩個指針域,數(shù)據(jù)域存放結點中的數(shù)據(jù)法竞,一個指針域指向下一個結點的地址耙厚,另一個指針指向上一個結點的地址强挫。同單鏈表一樣岔霸,我們所實現(xiàn)的雙鏈表是帶有頭結點的。下圖是結點和雙鏈表結構的示意圖俯渤。

結點示意圖:

Node.png

雙鏈表示意圖:

Double Linked List.png
  • 需要說明的是呆细,我的這個程序中的索引是從0開始的,而且默認數(shù)據(jù)都是正的int類型八匠。
  • 雙鏈表是從單鏈表中擴充出來的絮爷,除了刪除結點(deleteByIndex)和增加結點(insertByIndex)以及雙鏈表的初始化創(chuàng)建(create)以外很多操作和單鏈表是相同的,這里就不再給出實現(xiàn)代碼了梨树。

單鏈表的類定義:

class List {
private:
    class Node {
    public:
        int data;
        Node *prior;
        Node *next;
    };
    Node *head;
    int length = 0;
public:
    List();

    void print();

    void create(int n);

    int getLength() const;

    void insertByIndex(int index, int data);//在索引為index之前的位置插入數(shù)據(jù)為data的結點

    void deleteByIndex(int index);//刪除索引為index的結點
};

類中的函數(shù)實現(xiàn):

List::List() {
    head = new Node;
    head->data = 0;
    head->next = nullptr;
    head->prior = nullptr;
}

void List::print() {
    Node *cur = head->next;
    if (!length) {
        cout << "鏈表為空坑夯!" << endl;
        return;
    }
    cout << endl;
    cout << "*******************" << endl;
    cout << "鏈表中的元素為:" << endl;
    while (cur) {
        cout << cur->data << " ";
        cur = cur->next;
    }
    cout << endl;
    cout << "*******************" << endl;
}

void List::create(int n) {
    Node *pre = head;
    length = n;
    int i = 1;
    while (i <= n) {
        cout << "請輸入第" << i << "個結點的數(shù)據(jù):";
        Node *cur = new Node;
        cin >> cur->data;
        ++i;
        pre->next = cur;
        cur->prior = pre;
        pre = cur;
        cur->next = nullptr;
    }
}

int List::getLength() const {
    cout << "鏈表中的元素個數(shù)為:" << length << endl;
    return length;
}

void List::insertByIndex(int index, int data) {
    if (index < 0 || index >= length) {
        cout << "索引位置不合法" << endl;
    } else {
        Node *cur = head;
        int pos = 0;
        while (pos != index) {
            cur = cur->next;
            ++pos;
        }
        Node *temp = new Node;
        temp->data = data;
        temp->next = cur->next;
        temp->prior = cur;
        cur->next->prior = temp;
        cur->next = temp;
        ++length;
        cout << data << "插入成功!" << endl;
    }
}

void List::deleteByIndex(int index) {
    if (index < 0 || index >= length) {
        cout << "索引輸入錯誤抡四!" << endl;
    } else {
        Node *cur = head;
        int pos = 0;
        while (pos != index) {
            cur = cur->next;
            ++pos;
        }
        Node *temp = cur->next;
        temp->next->prior = temp->prior;
        temp->prior->next = temp->next;
        delete temp;
        --length;
        cout << "刪除成功!" << endl;
    }
}

測試代碼:

/*
 * Software:Jetbrains clion 2022.1
 * Created by xiaoxin_zh@foxmail.com
 * Implementing Double Linked List with C++
 */

#include <iostram>

using std::cin;
using std::cout;
using std::endl;

int main() {
    List list;
    int n;
    cout << "請輸入鏈表中的結點的個數(shù):";
    cin >> n;
    list.create(n);
    list.print();
    list.getLength();
    int index, data;
    cout << "請輸入需要插入結點的位置索引和數(shù)值:";
    cin >> index >> data;
    list.insertByIndex(index, data);
    list.print();
    list.getLength();
    int deleteIndex;
    cout << "請輸入需要刪除結點的索引值:";
    cin >> deleteIndex;
    list.deleteByIndex(deleteIndex);
    list.print();
    list.getLength();
    return 0;
}

注意:一定要注意在刪除和插入結點時的順序柜蜈,否則會發(fā)生“斷鏈”!

假設實現(xiàn)的原始單鏈表有3個結點指巡,數(shù)值分別為12淑履、23、34結構如圖所示:

create.png

在索引為2的前面插入一個數(shù)值為88的結點藻雪,其步驟如圖所示:

insert.png

刪除索引為1的結點秘噪,其步驟如圖所示:

delete.png

測試代碼執(zhí)行:


EXE.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勉耀,隨后出現(xiàn)的幾起案子指煎,更是在濱河造成了極大的恐慌蹋偏,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件至壤,死亡現(xiàn)場離奇詭異暖侨,居然都是意外死亡,警方通過查閱死者的電腦和手機崇渗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門字逗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宅广,你說我怎么就攤上這事葫掉。” “怎么了跟狱?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵俭厚,是天一觀的道長。 經(jīng)常有香客問我驶臊,道長挪挤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任关翎,我火速辦了婚禮扛门,結果婚禮上,老公的妹妹穿的比我還像新娘纵寝。我一直安慰自己论寨,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布爽茴。 她就那樣靜靜地躺著葬凳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪室奏。 梳的紋絲不亂的頭發(fā)上火焰,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音胧沫,去河邊找鬼昌简。 笑死,一個胖子當著我的面吹牛琳袄,可吹牛的內(nèi)容都是我干的江场。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼窖逗,長吁一口氣:“原來是場噩夢啊……” “哼址否!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤佑附,失蹤者是張志新(化名)和其女友劉穎樊诺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體音同,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡词爬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了权均。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顿膨。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叽赊,靈堂內(nèi)的尸體忽然破棺而出恋沃,到底是詐尸還是另有隱情,我是刑警寧澤必指,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布囊咏,位于F島的核電站,受9級特大地震影響塔橡,放射性物質(zhì)發(fā)生泄漏梅割。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一葛家、第九天 我趴在偏房一處隱蔽的房頂上張望户辞。 院中可真熱鬧,春花似錦惦银、人聲如沸咆课。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喇澡,卻和暖如春迅栅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晴玖。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工读存, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呕屎。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓让簿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秀睛。 傳聞我的和親對象是個殘疾皇子尔当,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361