泛型編程-抽象鏈表模板類

泛型編程-抽象鏈表模板類

出現(xiàn)的問(wèn)題:在增加、刪除結(jié)點(diǎn)時(shí)姑宽,僅僅delete了指針缴挖,但是delete p;并不意味著p=NULL;
例如以下代碼:

int *pp=new int(5);
    delete pp;
    
    cout << pp  <<","<<*pp<< endl;

運(yùn)行結(jié)果為:`00D9EA38,-572662307

所以delete之后只是告訴編譯器务热,這塊堆空間上的內(nèi)存可以回收繁成,但是并沒(méi)有讓它等于NULL吓笙,以后再new的時(shí)候可能還會(huì)申請(qǐng)到這塊地址。所以delete之后最好要加上p=NULL;

抽象鏈表模板類

#include <iostream>
#include <cstdlib>
using namespace std;
class EListEmpty{}; //鏈表為空異常
template<typename T> class ListNode; //表結(jié)點(diǎn)模板
template<typename T> class List; //鏈表模板


template<typename T> class ListNode
{
public:
    friend class List<T>; //需要讓List成為友元巾腕,否則List中的head無(wú)法訪問(wèn)data,next
    ListNode(const T &x) :data(x), next(NULL){}

private:
    T data;
    ListNode<T> *next;

};

template<typename T> class List
{
public:
    List() :head(NULL), tail(NULL){}
    virtual ~List ();
    void push_back(const T &x); //尾插入
    void push_front(const T &x);//頭插入
    void pop_back();       //尾刪除
    void pop_front();  //頭刪除
    int size();  //長(zhǎng)度
    void show(); //輸出
    void reverse(); //反向(通過(guò)建新鏈表观蓄,將舊鏈表依次加入頭部)
    
    bool IsEmpty()const { return head == 0; }
    



private:
    ListNode<T> *head; //頭指針
    ListNode<T> *tail; //尾指針
};


template<typename T> List<T>::~List()
{
    while (!IsEmpty())
    {
        pop_back();
    }
}



template<typename T> void List<T>::push_back(const T &x)
{
    ListNode<T> *p = new ListNode<T>(x);
    if (IsEmpty()) head = tail = p;
    else{
        tail->next = p;
        tail = p;
    }
    
}

template<typename T> void List<T>::push_front(const T &x)
{
    ListNode<T> *p = new ListNode<T>(x);
    if (IsEmpty()) head = tail = p;
    else{
        p->next = head;
        head = p;
    }
    
}

template<typename T> void List<T>::pop_back()
{
    if (IsEmpty()) throw EListEmpty();
    ListNode<T> *p=head;
    if (head == tail) {
        delete head;
        head = NULL;
        return;
    }
    while (p->next!=tail)
    {
        p = p->next;
    }
    tail = p;
    delete p->next;
    p->next = NULL;

}
template<typename T> void List<T>::pop_front()
{
    if (IsEmpty()) 
        throw EListEmpty();
    if (head == tail)
    {
        delete head; 
        head = NULL;
        return;
    }
    ListNode<T> *p = head;
    head = head->next;
    delete p;
}
template<typename T> int List<T>::size()
{
    int count=0;
    if (IsEmpty()) return 0;
    if (head == tail) return 1;
    ListNode<T> *p = head;
    while (p->next != tail)
    {
        p = p->next;
        ++count;
    }
    return count+1;
}
template<typename T> void List<T>::show()
{
    ListNode<T> *p = head;
    if (IsEmpty())
    {
        cout << "Empty List!" << endl; return;
    }
    else{}
    if (head == tail) cout << head->data << endl;
    
    else{
        while (p!=tail)
        {
            cout << p->data << ",";
            p = p->next;
        }
        cout << p->data << endl;
    }
}


template<typename T> void List<T>::reverse()
{
    if (head == 0 || head == tail) return;
    List<T> *a=new List<T>;
    
    ListNode<T> *p = head;
    ListNode<T> *temp;
    while (p != tail)
    {
        
        //a->push_front(p->data);
        temp = new ListNode<T>(p->data);
        if (a->head == NULL)
        {
            a->head = a->tail = temp;
        }
        else{
            temp->next = a->head;
            a->head = temp;
        }
        p = p->next;
        
    }
    a->push_front(tail->data);
    head = a->head;
    tail = a->tail;

}


int main()
{
    List<int> *p = new List<int>;
    cout<<p->size()<<endl;
    p->reverse();
    p->show();
    for (int i = 0; i < 10; i++)
        p->push_back(i);
    p->show();

    try{
        for (int i = 0; i < 7; i++)
        {
            p->pop_front();
            //cout << i << endl;
        }
            
    }
    catch ( EListEmpty &a)
    {
        cout << "鏈表已空!" << endl;
    }
    p->push_front(10);
    p->push_front(12);
    p->show();
    p->reverse();
    p->show();



    
    return 0;
}



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祠墅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歌径,更是在濱河造成了極大的恐慌毁嗦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件回铛,死亡現(xiàn)場(chǎng)離奇詭異狗准,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)茵肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門腔长,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人验残,你說(shuō)我怎么就攤上這事捞附。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵鸟召,是天一觀的道長(zhǎng)胆绊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)欧募,這世上最難降的妖魔是什么压状? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮跟继,結(jié)果婚禮上种冬,老公的妹妹穿的比我還像新娘。我一直安慰自己舔糖,他們只是感情好娱两,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著剩盒,像睡著了一般谷婆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辽聊,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天纪挎,我揣著相機(jī)與錄音,去河邊找鬼跟匆。 笑死异袄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玛臂。 我是一名探鬼主播烤蜕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迹冤!你這毒婦竟也來(lái)了讽营?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泡徙,失蹤者是張志新(化名)和其女友劉穎橱鹏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體堪藐,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莉兰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了礁竞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糖荒。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖模捂,靈堂內(nèi)的尸體忽然破棺而出捶朵,到底是詐尸還是另有隱情蜘矢,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布泉孩,位于F島的核電站硼端,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寓搬。R本人自食惡果不足惜珍昨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望句喷。 院中可真熱鬧镣典,春花似錦、人聲如沸唾琼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锡溯。三九已至赶舆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祭饭,已是汗流浹背芜茵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倡蝙,地道東北人九串。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像寺鸥,于是被迫代替她去往敵國(guó)和親猪钮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,254評(píng)論 0 16
  • 題目類型 a.C++與C差異(1-18) 1.C和C++中struct有什么區(qū)別笆载? C沒(méi)有Protection行為...
    阿面a閱讀 7,631評(píng)論 0 10
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法扑馁,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法宰译,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法魄懂,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,581評(píng)論 18 399
  • 呀沿侈!可愛(ài)的貓咪竟然在頭上睡覺(jué)了!它難道不會(huì)掉下來(lái)嗎市栗?趕走它還是不趕走呢缀拭?真是頑皮咳短!隨它吧,自己做自己的事去蛛淋。
    荀琉璃閱讀 140評(píng)論 0 0
  • 文/創(chuàng)業(yè)人張涵 在前面的文章里褐荷,我有分享過(guò)如何提升團(tuán)隊(duì)整體優(yōu)勢(shì)勾效,但當(dāng)你已經(jīng)按照這個(gè)方法去操作時(shí),你的團(tuán)隊(duì)依然停滯不...
    dfbc10ae5419閱讀 1,377評(píng)論 1 2