链表

#include 
#include 
using namespace std;
template <class T>
class SeqList
{
protected:
    T *data;
    int last;//从零开始
    int maxsize;
    void resize(int newsize);
public:
    SeqList(int sz = defaultsize);
    SeqList(SeqList& L);
    ~SeqList() { delete[]data; }
    int Size()const { return maxsize; }// 返回顺序表的能够容纳的项数
    int Length()const { return last + 1; }
    int Search(T &x)const;
    bool insert(int i, T &x);//插入函数
    T Remove(int i, T &x);
    void input();
    void output()const;
};
/*template
SeqList::SeqList(SeqList &L)
{
    maxsize = L.Size();
    last = L.Length() - 1;
    T value;
    data = new T[maxsize];
    if (data == NULL)
    {
        cout << "内存分配错误" << endl;
    }
    for (int i = 1; i <= last + 1; i++)
    {
        L.getData(i, value);
        data[i - 1] = value;
    }
}*/
template <class T>
T SeqList::Remove(int i, T &x)
{
    if (i < 0 || i>last + 1)
    {
        cout << "删除数据错误" << endl;
        return 0;
    }
    else
    {
        x = data[i - 1];
        for (int j = i; j <= last; j++)
            data[j - 1] = data[j];
        last--;
        return true;
    }
}
template <class T>
bool SeqList::insert(int i, T &x)
{
    if (last == maxsize - 1)
    {
        cout << "列表已满,不能插入" << endl;
        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>
void SeqList::output()const
{
    for (int i = 0; i cout << "第" << i + 1 << "个:" << data[i] << endl;
}
template <class T>
void SeqList::input()
{
    cout << "请输入列表的长度 " << endl;
    cin >> last;
    for (int i = 0; i < last; i++)
    {
        cout << "第" << i + 1 << "个:";
        cin >> data[i];
        cout << endl;
    }
}
template <class T>
void SeqList::resize(int newsize)
{
    if (newsize <= 0 || newsize <= maxsize)
        cout << " 无效的数组大小" << endl;
    if (newsize != maxsize)
    {
        T *newarry = new T[newsize];
        if (newarry != NULL)
            cout << "分配内存错误" << endl;
        int n = last + 1;
        while (n--)*newsize++ = *data++;
        delete[] data;
        data = newarry;
        maxsize = newsize;
    }
}
template <class T>
SeqList ::SeqList(int sz)
{
    maxsize = sz;
    last = -1;
    data = new T[maxsize];
    if (data == NULL)
    {
        cout << "内存分配错误";
    }
}
template <class T>
int SeqList::Search(T &x)const
{
    for (i = 0; i <= last; i++0)
    {
        if (x == data[i])
            return i + 1;
    }
    return 0;
}
void main()
{
    SeqList<int> Seq1(100);
    Seq1.input();
    cout << "建表成功" << endl;
    Seq1.output();
}
//顺序表关键操作
/*
1.如何构建一张顺序表
1.1顺序表中需要哪些变量
T *data(代表表头) int max(最大表项数) int last;当前已存表象的最后位置(在数组的位置包括位置0)
1.2表需要的构造函数
template 
SeqList ::SeqList(int sz)
{
    maxsize = sz;
    last = -1;
    data = new T[maxsize];
    if (data == NULL)
    {
    cout << "内存分配错误";
}
1.3是否需要拷贝函数
template
SeqList::SeqList(SeqList &L)
{
    maxsize = L.Size();
    last = L.Length() - 1;
    T value;
    data = new T[maxsize];
    if (data == NULL)
    {
        cout << "内存分配错误" << endl;
    }
    for (int i = 1; i <= last + 1; i++)
    {
        L.getData(i, value);
        data[i - 1] = value;
    }
}
1.4在顺序表中需要对数组进行更改,因此需要resize函数
template 
void SeqList::resize(int newsize)
{
    if (newsize <= 0 || newsize <= maxsize)
        cout << " 无效的数组大小" << endl;
    if (newsize != maxsize)
    {
        T *newarry = new T[newsize];
        if (newarry != NULL)
        cout << "分配内存错误" << endl;
        int n = last + 1;
        while (n--)*newsize++ = *data++;
        delete[] data;
        data = newarry;
        maxsize = newsize;
    }
}
2.对于线性表中最重要的操作,插入操作删除操作
2.1插入操作
{
    1在之后插入,首先判断插入位置是否超过线性表范围
    2然后进行后移
    列如插入位置为i
    for(int j = last;j >= i;j--)
    {
        data[j+1]=data[j];
    }
    data[i]=x;
    last++;
}
在各种操作之后要注意更新各个变量的状态
2.2删除操作
{
    1.在删除时要注意判断删除位置是否超过线性表范围
    2.直接进行前移
    for(int j = i;j<=last;j++)
    {
        data[j-1]=data[j];
    }
    3.对变量进行更新
}
*/

你可能感兴趣的:(数据结构)