头文件SeqList.h
#include <iostream>
# define DEFAULT_SIZE 30
using namespace std;
template<typename DataType>
class SeqList
{
protected:
int current_length;
int max_length;
DataType *p;
public:
SeqList(int size);//创建一个空间为size大小的空表
SeqList(const DataType data_[],int n ,int size=DEFAULT_SIZE);//创建一个空间为size大小的含有数据的表
void Insert(const DataType data_, int pos);//增————向某个位置pos之前插入一个数据data_
void Delete(int pos);//删————删除某个位置pos处的结点
void Change(const DataType data_, int pos);//改————改动某个位置pos处的结点
DataType Search1(int pos);//查————根据下标查数据
int Search2(const DataType &e);//查————根据数据查下标
void Clear();//清空
int GetLength();//得到长度
void PrintAll();//遍历链表输出各节点数值
~SeqList();//析构————删除所有结点
};
template<typename DataType>
SeqList<DataType>::SeqList(int size)//注意虽然为空 但是还是要申请一块最大长度的空间
{
p = new DataType[size];
current_length = 0;
max_length = size;
}
template<typename DataType>
SeqList<DataType>::SeqList(const DataType data_[],int n ,int size)
{
current_length = n;
max_length = size;
p = new DataType[size];
for (int i = 0; i < current_length;i++)
{
p[i] = data_[i];
}
}
template<typename DataType>
void SeqList<DataType>::Insert(const DataType data_, int pos)
{
//step1 :判断是否可以插入
if (current_length > max_length)
{
cout << "顺序表已满" << endl;
}
else if(pos<1||pos>max_length)
{
cout << "插入位置不对" << endl;
}
else
{
//step2:将pos位置后部分的元素后移一位
for (int j = current_length; j != pos; j--)
{
p[j] = p[j - 1];
}
//step3:将pos位置处的元素指定为data_
p[pos] = data_;
//step4:将顺序表长度加1
current_length++;
}
}
template<typename DataType>
void SeqList<DataType>::Delete(int pos)
{
//step1 :判断是否可以插入
if (pos<1 || pos>current_length)
{
cout << "删除位置不对" << endl;
}
else
//step2:将pos位置后部分的元素前移一位
{
for (int j = pos; j != current_length; j++)
{
p[j-1] = p[j];
}
//step3:将顺序表长度减1
current_length--;
}
}
template<typename DataType>
void SeqList<DataType>::Change(const DataType data_, int pos)
{
//step1 :判断是否可以更改
if (pos<1 || pos>current_length)
{
cout << "更改位置不对" << endl;
}
else
{
p[pos - 1] = data_;
}
}
template<typename DataType>
DataType SeqList<DataType>::Search1(int pos)
{
//step1 :判断是否可以查询
if (pos<1 || pos>current_length)
{
cout << "查询位置不对" << endl;
return 0;
}
else
{
return p[pos - 1];
}
}
template<typename DataType>
int SeqList<DataType>::Search2(const DataType & e)
{
int i = 0;
while ((i < current_length - 1)&&(p[i]!=e))
{
i++;
}
retuen i + 1;
}
template<typename DataType>
void SeqList<DataType>::Clear()
{
current_length = 0;
}
template<typename DataType>
int SeqList<DataType>::GetLength()
{
return current_length;
}
template<typename DataType>
void SeqList<DataType>::PrintAll()
{
cout << "当前顺序表的数据有" << endl;
for (int i = 0;i < current_length - 1; i++)
{
cout << p[i] << " ";
}
}
template<typename DataType>
SeqList<DataType>::~SeqList()
{
//注意current_length 和max_length不用清空
delete[] p;
cout << "析构函数已调用" << endl;
}
测试源文件main.cpp
#include "SeqList.h"
#include<iostream>
#include"stdlib.h"
int main()
{
int data[6] = { 2, 3, 4, 12,14,73 };
SeqList<int> list(data, 6);//初始化
list.PrintAll();
cout << "线性表的长度为" << list.GetLength() << endl;//获取链表的长度
list.Insert(62, 4);//增
list.PrintAll();
list.Delete(3);//删
list.Change(35, 1);//改
list.PrintAll();
int data1 = list.Search1(3);
cout << "链表中位置3处的数据为 " << data1;//查
system("pause");
return 0;
}