数据结构-顺序表-c++语言-模板类实现代码(附详细解释) _清风明月

#include<iostream>
#include<new>
#define MAXSIZE 1000
#define REALLOC 10
using namespace std;
template<typename T>
class sqlist{
public:
//构造函数初始化成员变量。
//析构函数释放空间。
sqlist(); //构造函数与类名字必须一样。
~sqlist(){ cout << "Destroy sqlist!\n" << endl; } //使用析构函数还得写拷贝构造函数和拷贝(重载)赋值(=)运算符。
//成员函数可以有返回值but构造函数不可以有。
void establishlist(T a[],int sizea);
void getlength();
T getelem(int xiabiao);
//T locelem(T e); //取满足条件的元素。白开水实现教程。
int locelem(T e, int compare(T s, T e)); //橙汁实现教程。
int listinsert(int weizhi, T yuansu); //插入操作返回位序。
void listdelete(int weizhi); //删除给定值元素。
void kuorong();
void clearlist();
void show();
private:
unsigned int length; // = 0;length代表的是元素个数,而非长度,对于数组元素进行修改操作的时候,都要对这个变量注意注意再注意。
//unsigned int 是无符号整形,从0开始的。而元素的个数是有意义的,所以大可直接设置无符号整型。
unsigned int capacity = 0; // = MAXSIZE;如果capacity=0,则线性表不存在!
T *data; //不知道什么类型的指针,因为T
};
template<typename T>
sqlist<T>::sqlist() //通过调用类的构造函数初始化成员变量。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值
{
length = 0;
capacity = MAXSIZE;
data = new T[capacity];//指针。
}
template<typename T>
void sqlist<T>::establishlist(T a[], int sizea)
{
length = sizea / sizeof(T);
unsigned int i;
for (i = 0; i < length; ++i) //因为sizeof出来的是无符号,单纯用int是为有符号,会报出来一个warning:有符号与无符号不匹配。
{
data[i] = a[i];
cout << i << " " << data[i] << endl;
}
}
template<typename T> //如果没有template这一串的话,就不用写<T>
void sqlist<T>::getlength() //返回类型需要写在类名的前面。
{
cout << length << endl;
}
template<typename T>
T sqlist<T>::getelem(int xiabiao)
{
return data[xiabiao];
}
/*template<typename T>
T sqlist<T>::locelem(T e){
for (i = 0; i < length; ++i)
{
if (data[i] == e)
return i;
}
}*///白开水。
template<typename T>
int sqlist<T>::locelem(T e, int compare(T s, T e)) //寻找与e满足compare关系的元素!返回该元素位序。
{
unsigned int i;
for (i = 0; i < length; ++i)
{
if (compare(data[i], e) == 1)
return i;
}
return 0;
}
template<typename T>
int compare(T s, T e)
{
return s == e;
}
template<typename T>
void sqlist<T>::kuorong()
{
capacity += REALLOC;
T *now = new T[capacity];
unsigned int i;
for (i = 0; i < capacity; ++i)
{
now[i] = data[i];
}
delete[](data);
data = now;
now = NULL;
}
template<typename T>
int sqlist<T>::listinsert(int weizhi, T yuansu)
{
++length; //涉及元素个数的变动。
//首先检查顺序表是不是满的,如果是满的则要新增空间。
if (length >= capacity)
kuorong();//调用扩容函数。
int i;
for (i = length - 1; i >= weizhi; --i)
data[i + 1] = data[i];
data[i + 1] = yuansu;
return i;
}
template<typename T>
void sqlist<T>::listdelete(int weizhi)
{
if (length >= capacity)
kuorong(); //调用扩容函数。
cout << data[weizhi] << endl; //输出将被删除元素的内容。
unsigned int i;
for (i = weizhi; i <= length - 1; ++i)
{
data[i] = data[i + 1];
}
--length;
}
template<typename T>
void  sqlist<T>::clearlist()
{
length = 0;
delete[]data;
}
template<typename T>
void sqlist<T>::show()
{
unsigned int i;
for (i = 0; i <= length - 1; ++i)
cout << data[i] << endl;
}
int main()
{
//在创建空表时,函数把容量扩充好了,所以容量在之后可不进行赋值,只在需要扩容的时候一般才有capacity出现。
int a[] = { 1, 2, 3434, 43, 5, 5, 5, 5, 6 }; //在这里通过创建数组,预备初始顺序表。
//(未实现)这一步也可以设置为char和int型分成两种进行创建选择生成数组。
int sizea = sizeof(a);
sqlist<int> sq; //创建该顺序表的对象。
printf("请选择:\n");
printf("0.显示当前顺序表\n");
printf("1.创建一个顺序表\n");
printf("2.获取此表的长度\n");
printf("3.查找下标定元素\n");
printf("4.元素是否在表中\n");
printf("5.于定点插入元素\n");
printf("6.于定点删除元素\n");
printf("7.清除数据表数据\n");
printf("8.--退出&&程序--\n");
int flag = 1;
char j;
while (flag)
{
cin >> j;
switch (j){
case '0':{
sq.show(); 
break;
}
case '1':{
sq.establishlist(a, sizea); //创建顺序表。
break;
}
case '2':{
sq.getlength(); 
break;
}
case '3':{
int xiabiao;
cin >> xiabiao;
cout << sq.getelem(xiabiao) << endl;
break;
}
case '4':{
int elem;
cin >> elem;
cout << sq.locelem(elem, compare) << endl;
break;
}
case '5':{
int weizhi, yuansu;
cin >> weizhi >> yuansu;
cout << sq.listinsert(weizhi, yuansu) << endl;
//sq.show();
break;
}
case '6':{
int weizhi;
cin >> weizhi;
sq.listdelete(weizhi);
//sq.show();
break;
}
case '7':{
sq.clearlist();
break;
}
case '8':{
cout << "---------退出程序---------" << endl;
flag = 0;
}
}
}
return 0;
}
//如何使用模板函数。
// sqlist<int>sq;
// sq.list();

发布了39 篇原创文章 · 获赞 16 · 访问量 3167

猜你喜欢

转载自blog.csdn.net/HDZ1821/article/details/78303824