单链表实现见笔者另一篇博客
欢迎读者批评指正
类定义和函数声明
切记 在模板类中 函数定义放在类的头文件之后 ,否则会出现链接器错误 LINK2019
```csharp
#ifndef SEQLIST_H
#define SEQLIST_H
#include<iostream>
#include"LinearList.h"
#include <stdlib.h>
#include<string>
using namespace std;
template<class T>
class SeqList:public LinearList<T>
{
protected:
T * data; //存放数组
int maxSize; //最大可容纳表项的项数
int last; //当前已存表项的最后位置(从0开始),last=n-1
public:
SeqList<T>(int sz); //构造函数
SeqList<T>(SeqList<T>& L);//复制构造函数
~SeqList()
{
/*delete[] data; */
}
//析构函数
int Size() const
{
return maxSize;
} //求表最大容量
int Length() const
{
return last + 1;
} //计算表长度
void reSize(int maxSize);//改变数组空间大小
void insert(string insertdata); //插入x在最后一个表项之后
void Insert(T x);//在值为x的表项后插入(多个元素仅考虑第一个)
void Binsert(T x);//在特定元素前插入元素,考虑相同元素有多个
void remove(int i); //删除下标为i的表项
void Remove(T x);//删除值为x的元素,考虑多个元素
int getData(int i) const;//显示下标为i的元素的值,用x存储
void printData();//打印所有元素的值
void print_reverse();//逆序输出所有元素
void Clear();//清空单链表
};
template <class T>//构造函数
SeqList<T>::SeqList(int sz)
{
if (sz > 0)
{
maxSize = sz; last = -1;
data = new T[maxSize]; //创建顺序表存储数组
if (data == NULL) //动态分配失败
{
cout << "存储分配错误!" << 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) //动态分配失败
{
cout << "存储分配错误!" << endl;
exit(1);
}
for (int i = 0; i <= last; i++)//传送各个表项
{
data[i] = L.locate(i);
}
}
template <class T>
void SeqList<T>::reSize(int maxSize)
{
T *test = new T[maxSize];
//创建一个过渡的数组test
for (int i = 0; i < maxSize; i++)
{
test[i] = data[i];
}
//用test存储data所有元素的值
delete[] data;
//释放原来的data,防止内存泄漏
T *data = new T[2 * maxSize];//扩充data数组的大小
maxSize *= 2;
for (int i = 0; i < maxSize; i++)
{
data[i] = test[i];
}//还原data内的数据元素
delete[] test;//释放过渡的test,防止内存泄漏
}
template <class T>
int SeqList<T>::getData(int i) const
{
return data[i];
}
template <class T>
//打印所有元素的值
void SeqList<T>::printData()
{
for (int i = 0; i < last+1; i++)
{
cout << data[i] << " ";
}
}
//逆序输出
template <class T>
void SeqList<T>::print_reverse()
{
for(int i = last; i >= 0; i--)
cout << data[i] << " ";
}
template <class T>
//清空链表
void SeqList<T>::Clear()
{
for (int i = 0; i <= last; i++)
{
remove(0);//调用函数,永远执行删除第一个元素
//上面函数只能删除剩下两个数
remove(1);//上面 永远执行删除第一个元素
}
}
//最后一个元素后插入 将新元素x插入到最后一个表项之后
template <class T>
void SeqList<T>::insert(string insertdata)
{
//将新元素x插入到最后一个表项之后
if (last == maxSize - 1) //表满
{
SeqList<T>::reSize(maxSize);
maxSize *= 2;
int position = maxSize / 2;//表示新插入元素的下标
data[position] = stoi(insertdata);//插入在最后一个元素后
last++;
}
else//表未满
{
data[++last] = stoi(insertdata);
//插入成功
}
}
//后插 将新元素插入到值为x的表项之后
template <class T>
void SeqList<T>::Insert(T x)//在值为x的表项后插入(多个元素仅考虑第一个))
{
int insertdata;// insertdata;//表示插入的元素
if (last == maxSize - 1) //表满
{
SeqList<T>::reSize(maxSize);
cout << "请输入您想在值为x的元素后插入的整数" << endl;
int insertdata;
cin >> insertdata;
for (int i = 0; i <= last; i++)
{
if (data[i] == x)
{
for (int j = last+1 ; j >1+i; j--)
{
data[j] = data[j-1];//依次后移动
}
data[i+1] = insertdata;
last++;
}
}
cout << "插入成功" << endl;
}
else
{
cout << "请输入您想在值为x的元素后插入的整数" << endl;
int insertdata;
cin >> insertdata;
for (int i = 0; i <= last; i++)
{
if (data[i] == x)
{
for (int j = last+1; j > i+1; j--)
{
data[j] = data[j -1 ];//依次后移动
}
data[i + 1] = insertdata;
last++;
}
}
cout << "插入成功" << endl;
}
}
// 前插 在特定元素前插入元素, 考虑相同元素有多个
template <class T>
void SeqList<T>::Binsert(T x)
{
int insertdata;// insertdata表示插入的元素
if (last == maxSize - 1) //表满
{
SeqList<T>::reSize(maxSize);
cout << "请输入您想在值为x的元素前插入的整数" << endl;
cin >> insertdata;
for (int i = 0; i <= last; i++)
{
if (data[i] == x)
{
for (int j = last; j >= i; j--)//从后面开始依次往后移动
{
data[j + 1] = data[j];
}
data[i] =insertdata;
last++;
i++;//下标为i的元素是insertdata
}
}
cout << "插入成功" << endl;
}
else
{
cout << "请输入您想在值为x的元素前插入的整数" << endl;
cin >> insertdata;
for (int i = 0; i <= last; i++)
{
if (data[i] == x)
{
for (int j = last; j >= i; j--)//从后面开始依次往后移动
{
data[j + 1] = data[j];
}
data[i] = insertdata;
last++;
i++;
}
}
cout << "插入成功" << endl;
}
}
//删除下标为i的元素 从前往后
template <class T>
void SeqList<T> ::remove(int i)
{
if (i<0 || i>last + 1)
cout << "参数i不合法" << endl;
else
{
for (int j = i; j < last; j++)
data[j] = data[j+1];
last--;
}
}
//删除值为x的元素,考虑存在多个
template <class T>
void SeqList<T> ::Remove(T x)
{
int i = 0, j = 0;
while (i < last + 1)
{
if (data[i] == x)
{
j++;//记录要删除的元素的个数
}
else
{
data[i - j] = data[i];//元素前移
}
i++;
}
last -= j;//顺序表长度发生变化
}
#endif // !SEQLIST_H
源程序
```cpp
#include"pch.h"
#include"LinearList.h"
#include"SeqList.h"
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int main()
{
string insertdata;//表示输入的数据
cout << "已经为您自动创建了一个最大容量为10的顺序表" << endl;
cout << endl;
SeqList<int> a(10);
cout << "请选择您的操作" << endl << "1:在最后一个元素之后插入" << endl << "2:在特定元素值前进行插入" << endl;
cout << "3:在特定元素后插入数据" << endl << "4:删除下标为i的元素的值" << endl << "5:删除值为x的元素的值" << endl;
cout << "6:输出顺序表内元素的个数" << endl << "7.输出顺序表的最大容量" << endl;
cout << "8.打印下标为i的元素的值" << endl << "9.打印所有元素的值" << endl << "10.逆序输出" << endl;
cout<<"11.清空单链表"<<endl<<"12:退出" << endl;
cout << endl;
int choice;
while (cin >> choice)
{
//最后一个元素后插入
if (choice == 1)
{
cout << "请输入您想插入的元素的值" << endl;
cin >> insertdata;
a.insert(insertdata);
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//在特定元素前插入元素,考虑相同元素有多个
else if (choice == 2)
{
cout << "请输入您想在其前面进行插入操作的特定元素值 " << endl;
int x;//表示元素的值
cin >> x;
a.Binsert(x);
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//在特定元素值后进行插入
else if (choice == 3)
{
cout << "请输入您想在其后面进行插入操作的特定元素值 " << endl;
int x;//表示元素的值
cin >> x;
a.Insert(x);
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//删除对应下标的元素
else if (choice == 4)
{
cout << "请输入您删除的元素的下标" << endl;
int i;
while (cin >> i)
{
if (i >= 0 && i <a.Length())
{
a.remove(i);
break;
}
else
cout << "输入有误,请重新输入" << endl;
}
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//删除值为x的元素
else if (choice == 5)
{
cout << "请输入您想删除的元素值" << endl;
int x;//表示删除的元素的值
while (cin >> x)
{
for (int i = 0; i < a.Length(); i++)
{
if (a.getData(i) == x)
a.Remove(a.getData(i));//保证删除多个值为x的元素
}
break;
}
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//输出顺序表内的元素的个数
else if (choice == 6)
{
cout << a.Length() << endl;
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//输出顺序表的最大容量
else if (choice == 7)
{
cout << a.Size() << endl;
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//打印下标为i的元素的值
else if (choice == 8)//打印下标为i的元素的值
{
cout << "请输入您打印的元素的下标" << endl;
int i;
while (cin >> i)
{
if (i >= 0 && i < a.Length())
{
cout<<a.getData(i)<<endl;
break;//跳出while循环
}
else
cout << "输入有误,请重新输入" << endl;
}
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//打印所有元素的值
else if (choice == 9)
{
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//逆序输出所有元素
else if (choice == 10)
{
a.print_reverse();
cout << "请继续您的操作" << endl;
cout << endl;
}
//清空单链表
else if (choice == 11)
{
a.Clear();
a.printData();
cout << "请继续您的操作" << endl;
cout << endl;
}
//退出
else if (choice == 12)
{
break;
}
//用户输入异常的处理
else
cout << "输入有误,请重新输入" << endl;
}
return 0;
}