线性表(顺序表,单链表)

线性表是一种动态的数据结构,它的表长可以变化。线性表的功能主要是对存储在线性表中的数据进行检索,插入,删除等操作。主要有顺序表,链表两种形式。

顺序表是在一组连续地址的存储单元中存储数据,这样可以保证这些在逻辑上相邻的数据在物理上也相邻。

链表通过节点指针将数据串联起来,可以保证数据逻辑上的相邻性,但是无法保证数据物理上的相邻性。

实现方法如下:

1.建立线性表的抽象类 linearlist.h

//线性表抽象类
template <class T>
class LinearList
{
protected:  //继承后派生类成员函数有访问权限
    int n;  //线性表长度
public:
    virtual bool isEmpty() const=0; //线性表是否为空
    virtual int length() const=0;   //线性表长度
    virtual bool find(int i,T &x) const=0;  //寻找下标为i的元素,找到函数返回true,元素赋值给x
    virtual int search(T x) const=0;    //搜索元素x,返回该元素下标
    virtual bool insert(int i,T x)=0;   //在下标i出插入元素x
    virtual bool del(int i)=0;      //删除下标i处的元素
    virtual void print() const=0;   //输出线性表
};

2.顺序表的建立 seqlist.h,该顺序表public继承了上文的线性表抽象类

#include "linearlist.h"
 
template <class T>
class SeqList:public LinearList<T>
{
private:
    T *elements;
    int maxLength;
public:
    SeqList(int maxLength);
    ~SeqList();
    bool isEmpty() const;
    int length() const;
    bool find(int i,T &x) const;
    int search(T x) const;
    bool insert(int i,T x);
    bool del(int i);
    void print() const;
};

具体成员函数实现在 seqlist.cpp 中

#include "seqlist.h"
template <class T>
SeqList<T>::SeqList(int maxSize)
{
   maxLength=maxSize;
   elements=new T[maxLength];
   n=0;
}
template <class T>
SeqList<T>::~SeqList()
{
   delete [] elements;
}
template <class T>
bool SeqList<T>::isEmpty() const
{
   return n==0;
}
template <class T>
int SeqList<T>::length() const
{
   return n;
}
template <class T>
bool SeqList<T>::find(int i,T &x) const
{
   if(i<0||i>n-1)
   {
       cout<<"寻找下标越界"<<endl;
       return false;
   }
   x=elements[i];
   return true;
}
template <class T>
int SeqList<T>::search(T x) const
{
   for(int j=0;j<n;j++)
   {
       if(elements[j]==x)
       {
           return j;
       }
   }
   return -1;
}
template <class T>
bool SeqList<T>::insert(int i,T x)
{
   if(i<0||i>n)
   {
       cout<<"插入下标越界"<<endl;
       return false;
   }
   if(n==maxLength)
   {
       cout<<"内存不足"<<endl;
       return false;
   }
   for(int j=n-1;j>i-1;j--)
   {
       elements[j+1]=elements[j];
   }
   elements[i]=x;
   n++;
   return true;
}
template <class T>
bool SeqList<T>::del(int i)
{
   if(!n)
   {
       cout<<"无可删除的元素"<<endl;
       return false;
   }
   if(i<0||i>n-1)
   {
       cout<<"删除下标越界"<<endl;
       return false;
   }
   for(int j=i+1;j<n;j++)
   {
       elements[j-1]=elements[j];
   }
   n--;
   return true;
}

template <class T>
void SeqList<T>::print() const
{
   for(int j=0;j<n;j++)
   {
       cout<<elements[j]<<'\t';
   }
   cout<<endl;
}

总结:
1.要注意判断下标是否越界

2.顺序表插入删除的效率较链表要低,但检索效率较链表要高

3.单链表的建立 singlelist.h ,同样也继承了第1节中的linearlist抽象类

#include "linearlist.h"
 
template <class T> class SingleList;
template <class T> 
class Node
{
private:
    Node<T> *link;
    T element;
    friend class SingleList<T>;
};
 
template <class T>
class SingleList:public LinearList<T>
{
private:
    Node<T> *first;
public:
    SingleList();
    ~SingleList();
    bool isEmpty() const;
    int length() const;
    bool find(int i,T &x) const;
    int search(T x) const;
    bool insert(int i,T x);
    bool del(int i);
    void print() const;
};

具体成员函数实现在 singlelist.cpp 中

#include "singlelist.h"
 
template <class T>
SingleList<T>::SingleList()
{
    first=new Node<T>;
    n=0;
    first->link=NULL;
}
 
template <class T>
SingleList<T>::~SingleList()
{
    Node<T> *p;
    while(first)
    {
        p=first;
        first=first->link;
        delete p;
    }
}
 
template <class T>
bool SingleList<T>::isEmpty() const
{
    return n==0;
}
 
template <class T>
int SingleList<T>::length() const
{
    return n;
}
 
template <class T>
bool SingleList<T>::find(int i,T &x) const
{
    if(i<0||i>n-1)
    {
        cout<<"find越界"<<endl;
        return false;
    }
    Node<T> *p=first->link;
    for(int j=0;j<i;j++)
    {
        p=p->link;
    }
    x=p->element;
    return true;
}
 
template <class T>
int SingleList<T>::search(T x) const
{
    int j;
    Node<T> *p=first->link;
    for(j=0;p&&p->element!=x;j++)
    {
        p=p->link;
    }
    if(p)
        return j;
    return -1;
}
 
template <class T>
bool SingleList<T>::insert(int i,T x)
{
    if(i<0||i>n)
    {
        cout<<"插入元素越界"<<endl;
        return false;
    }
    Node<T> *q=new Node<T>;
    q->element=x;
    Node<T> *p=first;
    for(int j=0;j<i;j++)
    {
        p=p->link;
    }
    q->link=p->link;
    p->link=q;
    
    n++;
    return true;
}
 
template <class T>
bool SingleList<T>::del(int i)
{
    if(i<0||i>n-1)
    {
        cout<<"删除元素越界"<<endl;
        return false;
    }
    Node<T> *q=first->link;
    Node<T> *p=first;
    for(int j=0;j<i;j++)
    {
        q=q->link;
        p=p->link;
    }
    p->link=q->link;
    delete q;
    n--;
    return true;
}
 
template <class T>
void SingleList<T>::print() const
{
    Node<T> *p=first->link;
    for(int j=0;j<n;j++)
    {
        cout<<p->element<<' ';
        p=p->link;
    }
    cout<<endl;
}

总结:

1.该单链表的实现是带表头的单链表,在带表头的单链表中的插入删除操作可以不用考虑是否在表头插入删除的情况。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容