鏈表類的實現(xiàn)

定義鏈表的類的聲明時采用模版機制宙搬,這樣雖然繁瑣一些葫掉,但為將來對鏈表的復用提供了很大的方便裆针。同時在鏈表中增加頭結(jié)點刨摩,統(tǒng)一了空表和非空表操作的實現(xiàn)寺晌,降低了程序結(jié)構(gòu)的復雜性世吨,減少了出錯的概率。

頭文件

#ifndef LINKLIST_H
#define LINKLIST_H
#include <cstddef>
#include <iostream>

/* 單鏈表的結(jié)點定義 */
template<class T>
struct LinkNode
{
    T data;
    LinkNode<T> *next;
    LinkNode(LinkNode<T> *ptr = NULL){next = ptr;}
    LinkNode(const T &item, LinkNode<T> *ptr = NULL)    
    //函數(shù)參數(shù)表中的形參允許有默認值呻征,但是帶默認值的參數(shù)需要放后面
    {
        next = ptr;
        data = item;
    }
};

/* 帶頭結(jié)點的單鏈表定義 */
template<class T>
class LinkList
{
public:
    //無參數(shù)的構(gòu)造函數(shù)
    LinkList(){head = new LinkNode<T>;}
    //帶參數(shù)的構(gòu)造函數(shù)
    LinkList(const T &item){head = new LinkNode<T>(item);}
    //拷貝構(gòu)造函數(shù)
    LinkList(LinkList<T> &List);
    //析構(gòu)函數(shù)
    ~LinkList(){Clear();}
    //重載函數(shù):賦值
    LinkList<T>& operator=(LinkList<T> &List);
    //鏈表清空
    void Clear();
    //獲取鏈表長度
    int Length() const;
    //獲取鏈表頭結(jié)點
    LinkNode<T>* GetHead() const    {return head;}
    //查找數(shù)據(jù)的位置耘婚,返回第一個找到的滿足該數(shù)值的結(jié)點指針
    LinkNode<T>* Find(T &item);
    //定位指定的位置,返回該位置上的結(jié)點指針
    LinkNode<T>* Locate(int pos);
    //在指定位置pos插入值為item的結(jié)點陆赋,失敗返回false
    bool Insert(T &item, int pos);
    //刪除指定位置pos上的結(jié)點沐祷,item就是該結(jié)點的值,失敗返回false
    bool Remove(int pos, T &item);
    //獲取指定位置pos的結(jié)點的值攒岛,失敗返回false
    bool GetData(int pos, T &item);
    //設置指定位置pos的結(jié)點的值赖临,失敗返回false
    bool SetData(int pos, T &item);
    //判斷鏈表是否為空
    bool IsEmpty() const;
    //打印鏈表
    void Print() const;
    //鏈表排序
    void Sort();
    //鏈表逆置
    void Reverse();
private:
    LinkNode<T> *head;
};

#endif

源文件

#include "LinkList.h"

//復制構(gòu)造函數(shù)
template<class T>
LinkList<T>::LinkList(LinkList<T>& L)
{
    T value;
    LinkNode<T>* srcptr = L.GetHead();
    LinkNode<T>* destptr = head = new LinkNode<T>;
    while(srcptr->next != NULL){
        value = srcptr->next->data;
        destptr->next = new LinkNode<T>(value);
        srcptr = srcptr->next;
        destptr = destptr->next;
    }
    destptr->next = NULL;
}

//將鏈表置為空表
template<class T>
void LinkList<T>::Clear()
{
    LinkNode<T>* temp = NULL;
    while(head->next != NULL){
        temp = head->next;
        head->next = temp->next;
        delete temp;
    }
}



//計算待附加頭結(jié)點的單鏈表長度
template<class T>
int LinkList<T>::Length() const
{
    int count = 0;
    LinkNode<T>* temp = head->next;
    while(temp != NULL){
        temp = temp->next;
        ++count;
    }
    return count;
}

//在表中搜索數(shù)據(jù)item的節(jié)點,搜索成功則返回該結(jié)點地址,否則返回NULL
template<class T> 
LinkNode<T>* LinkList<T>::Find(T &item)
{
    LinkNode<T>* temp = head->next;
    while(temp != NULL){
        if(temp->data == item)  break;
        else temp = temp->next;
    }
    return temp;
}

// 返回鏈表中第pos個元素的地址灾锯,如果pos<0或pos超出鏈表最大個數(shù)返回NULL
template<class T>
LinkNode<T>* LinkList<T>::Locate(int pos)
{
    int i = 0;
    LinkNode<T> *p = head;

    if (pos < 0)
        return NULL;

    while (NULL != p && i < pos)
    {
        p = p->next;
        i++;
    }
    
    return p;
}

//取出鏈表中第i個元素的值
template<class T>
bool LinkList<T>::GetData(int pos,T &item)
{
    if(pos<=0)  return false;
    LinkNode<T>* temp = Locate(pos);
    if(temp == NULL)    return false;
    else{
        item = temp->data;
        return true;
    }
} 

//給鏈表中第i個元素的賦值
template<class T>
bool LinkList<T>::SetData(int pos,T &item)
{
    if(pos<=0)  return false;
    LinkNode<T>* temp = Locate(pos);
    if(temp == NULL)    return false;
    else{
        temp->data = item;
        return true;
    }
}

//判斷鏈表是否為空
template<class T>
bool LinkList<T>::IsEmpty() const
{
    return (head->next == NULL)?true:false;
}

template<class T>
bool LinkList<T>::Insert(T &item, int pos)
{
    LinkNode<T> *p = Locate(pos);
    if (NULL == p)
        return false;

    LinkNode<T> *node = new LinkNode<T>(item);
    if (NULL == node)
    {
        std::cerr << "分配內(nèi)存失敗!" << std::endl;
        exit(1);
    }
    node->next = p->next;
    p->next = node;
    return true;
}

template<class T>
bool LinkList<T>::Remove(int pos, T &item)
{
    LinkNode<T> *p = Locate(pos);
    if (NULL == p || NULL == p->next)
        return false;

    LinkNode<T> *del = p->next;
    p->next = del->next;
    item = del->data;
    delete del;
    return true;
}


template<class T>
void LinkList<T>::Print() const
{
    int count = 0;
    LinkNode<T> *p = head;
    while (NULL != p->next)
    {
        p = p->next;
        std::cout << p->data <<std::endl;
    }
}


template<class T>
void LinkList<T>::Reverse()
{
    LinkNode<T> *pre = head->next;
    LinkNode<T> *curr = pre->next;
    LinkNode<T> *next = NULL;

    head->next->next = NULL;
    while (curr)
    {
        next = curr->next;
        curr->next = pre;
        pre = curr;
        curr = next;
    }
    head->next = pre;
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兢榨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顺饮,更是在濱河造成了極大的恐慌吵聪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兼雄,死亡現(xiàn)場離奇詭異吟逝,居然都是意外死亡,警方通過查閱死者的電腦和手機赦肋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門块攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佃乘,你說我怎么就攤上這事囱井。” “怎么了恕稠?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵琅绅,是天一觀的道長。 經(jīng)常有香客問我鹅巍,道長千扶,這世上最難降的妖魔是什么料祠? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮澎羞,結(jié)果婚禮上髓绽,老公的妹妹穿的比我還像新娘。我一直安慰自己妆绞,他們只是感情好顺呕,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著括饶,像睡著了一般株茶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上图焰,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天启盛,我揣著相機與錄音,去河邊找鬼技羔。 笑死僵闯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的藤滥。 我是一名探鬼主播鳖粟,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拙绊!你這毒婦竟也來了向图?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤时呀,失蹤者是張志新(化名)和其女友劉穎张漂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谨娜,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡航攒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趴梢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漠畜。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坞靶,靈堂內(nèi)的尸體忽然破棺而出憔狞,到底是詐尸還是另有隱情,我是刑警寧澤彰阴,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布瘾敢,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏簇抵。R本人自食惡果不足惜庆杜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碟摆。 院中可真熱鬧晃财,春花似錦、人聲如沸典蜕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愉舔。三九已至钢猛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屑宠,已是汗流浹背厢洞。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工仇让, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留典奉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓丧叽,卻偏偏與公主長得像卫玖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子踊淳,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子假瞬。 除根結(jié)點和葉子結(jié)點外,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,240評論 0 25
  • 本文內(nèi)容取自于小甲魚的數(shù)據(jù)結(jié)構(gòu)與算法迂尝。http://www.reibang.com/p/230e6fde9c75 ...
    阿阿阿阿毛閱讀 2,901評論 0 7
  • 作為一個資深的新手程序員??,鏈表這些既基礎又深奧的東西是日常工作中并不常見,但是卻非常重要,所以就總結(jié)一下鏈表的簡...
    Clark_new閱讀 4,255評論 4 12
  • 大學的時候不好好學習脱茉,老師在講臺上講課,自己在以為老師看不到的座位看小說垄开,現(xiàn)在用到了老師講的知識琴许,只能自己看書查資...
    和玨貓閱讀 1,447評論 1 3
  • 還記得饒平二中下操場的大臺階旁那幾棵楊桃樹嗎?樹上開滿了楊桃花溉躲。二十幾年前榜田,我摘下了它,夾在我的書里也夾在了記憶里...
    敏Yang閱讀 680評論 9 3