C++模版类实现顺序表(继承自抽象基类线性表)

简单测试过一下,应该没有问题,如有疏忽,欢迎指正。

1、抽象基类——LinearList.h

#ifndef LinearList_h
#define LinearList_h
template <class T>
class LinearList{
public:
    LinearList(){}
    virtual ~LinearList(){}
    virtual int Length()const = 0;
    virtual int Search(T& x)const = 0;
    virtual T getData(int i)const = 0;
    virtual void setData(int i, T& x) = 0;
    virtual bool Insert(int i, T& x) = 0;
    virtual bool Remove(int i, T& x) = 0;
    virtual bool IsEmpty()const = 0;
    virtual void input() = 0;
    virtual void output() = 0;
};

#endif /* LinearList_h */

2、具体类——SeqList.h

#ifndef SeqList_h
#define SeqList_h
#include <iostream>
#include "LinearList.h"
const int defaultSize = 100;
template <class T>
class SeqList : public LinearList<T>{
protected:
    T *data;
    int maxSize;
    int last;
    void reSize(int newSize);
public:
    SeqList(int sz = 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 Locate(int i)const;
    T getData(int i)const{return (i > 0 && i <= last+1) ? data[i-1]:NULL;}
    void setData(int i, T& x){if(i > 0 && i <= last+1) data[i-1] = x;}
    bool Insert(int i, T& x);
    bool Remove(int i, T& x);
    bool IsEmpty()const{return (last == -1) ? true:false;}
    bool IsFull()const{return (last == maxSize-1) ? true:false;}
    void input();
    void output();
    SeqList<T>& operator=(SeqList<T>& L);
};

#endif /* SeqList_h */

3、具体类SeqList中非内联函数的实现——SeqList.cpp

#include <iostream>
#include <stdio.h>
#include "SeqList.h"
using std::cerr;
using std::endl;
using std::cout;
using std::cin;

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;
    data = new T[maxSize];
    if(data == NULL){
        cerr << "内存分配错误!" << endl;
        exit(1);
    }
    for(int i = 1; i <= last+1; i++)
        data[i - 1] = L.getData(i);
}

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-1;
    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--)
        data[j+1] = data[j];
    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){
        int a;
        cin >> a;
        last = a-1;
        if(last <= maxSize-1)
            break;
        cout << "表元素个数输入有误,范围不能超过" << maxSize <<";";
    }
    cout << "请逐个输入表元素:" << endl;
    for(int i = 0; i <= last; i++){
        cout << i+1 <<": ";
        cin >> data[i];
    }
}

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){
    if(maxSize < L.Size())
        reSize(L.Size());
    maxSize = L.Size();
    last = L.Length() - 1;
    for(int i = 0; i <= last; i++){
        data[i] = L.getData(i+1);
    }
    return *this;
}

4、主函数——main.cpp(简单测试,并实现简单的集合交并)

#include <iostream>
#include "SeqList.cpp"
void Merge(SeqList<int>& LA, SeqList<int>& LB);
void Intersection(SeqList<int>& LA, SeqList<int>& LB);

int main(){
    SeqList<int> list1(10);
    SeqList<int> list2(5);
    SeqList<int> list3(5);
    cout << "顺序表list1的最大长度为:" << list1.Size() << endl;
    list1.input();
    list2.input();
    list3.input();
    cout << "顺序表list1的长度为:" << list1.Length() << endl;
    int x = 100, y = 10;
    list1.Insert(2, x);
    list1.output();
    list1.Remove(3, y);
    list1.output();
    cout << y << endl;
    list2.output();
    list2 = list1;
    list2.output();
    Merge(list1,list3);
    list1.output();
    Intersection(list2, list3);
    list2.output();
    return 0;
}

void Merge(SeqList<int>& LA, SeqList<int>& LB){
    int n = LA.Length(), m = LB.Length(), i, k, x;
    for(i = 1; i <= m; i++){
        x = LB.getData(i);
        k = LA.Search(x);
        if(k == 0){
            LA.Insert(n,x);
            n ++;
        }
    }
}

void Intersection(SeqList<int>& LA, SeqList<int>& LB){
    int n = LA.Length(), i = 1, k, x;
    while(i <= n){
        x = LA.getData(i);
        k = LB.Search(x);
        if(k == 0){
            LA.Remove(i,x);
            n --;
        }
        else i ++;
    }
}
发布了13 篇原创文章 · 获赞 0 · 访问量 450

猜你喜欢

转载自blog.csdn.net/Nemoosi/article/details/104301600