数据结构——顺序表C++实现

顺序表应该是数据结构中最简单的一项,不和大佬们比划,我写在这里只是自娱自乐,希望有错误不要笑话我,但希望大佬给我提出来。

定义一个基类:

//
// Created by lenovo on 2018/4/19.
//

#ifndef UNTITLED_LINEARLIST_H
#define UNTITLED_LINEARLIST_H
//
// Created by lenovo on 2018/4/19.
//

#ifndef LINEARLIST_LINEARLIST_H
#define LINEARLIST_LINEARLIST_H

template<class T>
class linearlist{
public:
    linearlist();
    ~linearlist();
    virtual int size() const=0;//确定表的体积
    virtual int length() const=0;//确定表长度
    virtual int search(T &x) const=0;//搜寻给定的X
    virtual int locate(int i) const=0;//在表中定位第i个元素的位置
    virtual bool getdata(int i,T& x) const=0;//取表中第i个元素的值
    virtual void setdata(int i,T& x) const=0;//修改第i个表项的值
    virtual bool inseret(int i,T& x) const=0;//在表弟i项后插入值
    virtual bool remove(int i,T& x) const=0;//删除表中第i项,以x来返回
    virtual bool isempty() const=0;//判断空
    virtual bool isfull() const=0;//判断满
    virtual void sort()=0;//排序
    virtual void inout()=0;//输入
    virtual void output()=0;//输出
    virtual linearlist<T> operator=(linearlist<T>& L)=0;//复制,重载
};
#endif //LINEARLIST_LINEARLIST_H

#endif //UNTITLED_LINEARLIST_H
然后继承下:

//
// Created by lenovo on 2018/4/19.
//

#ifndef UNTITLED_SEQLIST_H
#define UNTITLED_SEQLIST_H

#include <iostream>
#include <cstdlib>
#include "linearlist.h"
const int defaultsize=100;
template <class T>
class seqlist:public linearlist<T>{
protected:
    T *data;//存放数组
    int maxsize;//数组中元素的最大个数
    int last;//当前已存表的最后位置(从0开始)
    void resize(int newsize);//重新定义数组大小
public:
    seqlist(int sa=defaultsize);//构造函数
    seqlist(seqlist<T>&L);//复制构造函数
    ~seqlist() {delete[]data;}//析构函数
    int size() const{return maxsize;}//数组的最大容量
    int length()const {return last+1;}//表的长度
    int search(T&x)const;//寻找所需的元素,并以int返回(返回该元素的位置)
    int locate(int i)const;//定位dii个项
    bool getdata(int i,T&x)//取第i个项的值,并自动检查是否成功
    {if(i>0&&i<=last+1) {x=data[i-1];return true;} else return false;}
    bool setdata(int i,T&x)//x修改第i个项的值
    {if(i>0&&i<=last+1) data[i-1]=x;}
    bool insert(int i,T&x);//在第i个项后插入x,并返回是否插入成功
    bool remove(int i,T&x);//删除第i个项,并返回是否删除成功
    bool isempty(){return (last==-1)?true:false;}//是否为空表
    bool isfull(){return (last==maxsize-1)?true:false;}//检验是否为满表
    void input();//输入
    void output();//输出
    seqlist<T> operator=(seqlist<T> &L);//重载运算符=,整体x赋值到前面的seqlist对象
};

#endif //UNTITLED_SEQLIST_H
最后小小实现下:

//
// Created by lenovo on 2018/4/19.
//

#include <iostream>
#include "seqlist.h"
using namespace std;

template<class T>
seqlist<T>::seqlist(int sz){
    if(sz>0){
        maxsize=sz;
        last=-1;
        data=new T[maxsize];
        if(data==NULL){
            cerr<<"存储分配错误!"<<endl;
            exit(1);
        }
    }
}

template<class T>
seqlist<T>::seqlist(seqlist<T> &L) {
    maxsize=L.size();
    last=L.length()-1;
    T value;//作为中间值,其作用是检测是否取值成功
    data=new T[maxsize];
    if(data==NULL){
        cerr<<"存储分配错误!"<<endl;
        exit(1);
    }
    for (int i = 1; i <=last+1 ; i++) {
        L.getdata(i,value);
        data[i-1]=value;//再辞value将值转化给data
    }
}

template <class T>
void seqlist<T>::resize(int newsize){
    if(newsize<=0){
        cerr<<"无效数组大小"<<endl;
        return ;
    }
    if(newsize!=maxsize){
        T* newarray=new T[newsize];
        if(newarray==NULL){
            cerr<<"存储分配错误"<<endl;
            exit(1);
        }
        int n=last+1;
        T*srcptr=data;//源数组首地址
        T*destptr=newarray;//目的数组首地址
        while(n--)
            *destptr++=*srcptr++;//复制
        delete[]data;//删老数组
        data=newarray;
        maxsize=newsize;//复制新数组
    }
}

template<class T>
int seqlist<T>::search(T &x) const {
    for (int i=0;i<=last;i++)
        if(data[i]==x)
            return i+1;
    return 0;
}

template <class T>
int seqlist<T>::locate(int i) const {
    if(i>=1&&i<=last+1)
        return i;
    else
        return 0;
}

template<class T>
bool seqlist<T>::insert(int i, T &x) {
    if(last==maxsize-1)//表满
        return false;
    if(i<0||i>last+1)
        return false;
    for (int j = last; j >= i; j--)//i后面插入
        data[j+1]=data[j];//i后的全部后移一格
    data[i]=x;
    last++;
    return true;
}

template <class T>
bool seqlist<T>::remove(int i, T &x) {
    if(last==-1)
        return false;
    if(i<1||i>last+1)
        return false;
    x=data[i-1];
    for (int j = i; j <= last; j++)
        data[j-1]=data[j];
    last--;
    return true;
}

template <class T>
void seqlist<T>::input(){
    cout<<"开始建立顺序表,输入表中元素个数:";
    while(1){
        cin>>last;
        if(last<=maxsize-1)
            break;
        cout<<"表示元素不能超过"<<maxsize-1<<":";
    }
    for (int i = 0; i <=last ; i++) {
        cin>>data[i];
        cout<<i+1<<endl;
    }
}

template <class T>
void seqlist<T>::output() {
    cout<<"当前数组的最后位置是:"<<last<<endl;
    for (int i = 0; i <= last; i++) {
        cout<<"#"<<i+1<<":"<<data[i]<<endl;
    }
}

template <class T>
seqlist<T>seqlist<T>::operator=(seqlist<T> &L) {
    maxsize=L.size();
    last=L.length()-1;
    T value;
    data=new T[maxsize];
    if(data==NULL){
        cerr<<"内存分配错误"<<endl;
        exit(1);
    }
    for (int i = 1; i <= last+1; i++) {
        L.getdata(i,value);
        data[i-1]=value;
    }
}

猜你喜欢

转载自blog.csdn.net/billy1900/article/details/80042603
今日推荐