学完数据结构一个学期了,很久没写几乎全都忘了。最近抽点时间把学过的东西都给回顾一下。
首先是顺序表。即用数组实现的线性结构。这里用的是C++实现,感觉要比C好点,封装成了一个类。使用了类模板,所以只需要在创建类对象的时候将模板的类型写出来就行,不用做过多的修改。我只是简单地在main函数里测试了一下,数值都是给定的,其实这些可以通过控制台手动输入,实现也不会很难。
没有任何问题。直接贴上代码
/*
* 顺序表的实现
*/
#include<iostream>
using namespace std;
const int MaxSize = 100; //定义数组长度100
template <class DataType> // 定义模板类SeqList
class SeqList
{
public:
SeqList() //无参的构造函数,构造一个空的顺序表
{
length = 0;
}
SeqList(DataType a[],int n); //有参构造函数,建立一个长度为n的顺序表
~SeqList(){}; //析构函数为空。因为没有使用到指针,不需要释放资源
int Getlength() //求线性表的长度
{
return length;
}
DataType Get(int i ); //按位查找,在线性表中查找第i个元素
int Locate(DataType x); //按值查找,查找线性表中值为x的元素序号
void Insert(int i ,DataType x); //插入操作,在线性表中第i个位置插入值为x的元素
DataType Delete(int i); //删除操作,删除线性表中的第i个元素
void PrintList(); //遍历操作,按序号输入各个元素
private:
DataType data[MaxSize]; //存放数据元素的数组
int length; //线性表的长度
} ;
template <class DataType>
SeqList<DataType>::SeqList(DataType a[],int n)
{
if(n > MaxSize) //判断是不是溢出
throw "参数非法";
else
length = n;
for(int i = 0;i < n;i++)
{
data[i] = a[i];
}
}
template <class DataType>
DataType SeqList<DataType>::Get(int i )
{
if(i < 1 || i > length)
throw "查找位置非法";
return data[i-1];
}
template <class DataType>
int SeqList<DataType>::Locate(DataType x)
{
for(int i = 0;i < length;i++)
{
if(data[i] == x)
return i+1;
}
return 0; //退出循环,没有这个值
}
template <class DataType>
void SeqList<DataType>::Insert(int i ,DataType x)
{
if(length > MaxSize) throw "上溢";
if(i < 1 || i > length+1) throw "位置不正确";
for(int j = length;j >= i;j--)
{
data[j] = data[j-1]; //第j个元素处于j-1位置 循环将所有数据往后移动一位,空出一个位置给x
}
data[i-1] = x; //插入x
length++; //长度+1
}
template <class DataType>
DataType SeqList<DataType>::Delete(int i )
{
DataType x;
if(length == 0) throw "下溢";
if(i <1 || i > length) throw "位置不正确";
x = data[i-1];
for(int j = i; j < length;j++)
data[j-1] = data[j]; //循环将数据左移一位,覆盖掉第i个值
length--;
return x;
}
template <class DataType>
void SeqList<DataType> :: PrintList()
{
for(int i = 0;i < length;i++)
cout<<data[i]<<" ";
cout<<endl;
}
int main()
{
int n = 10;
char a[10] = {'a','b','c','d','e','f','g','h','i','j'};
//创建对象--这里把DataType实例为char类型
SeqList<char> sq(a,n);
//输出长度
cout<<sq.Getlength()<<endl;
cout<<"第5个值为:"<<sq.Get(5)<<endl;
cout<<"插入之前的顺序表"<<endl;
sq.PrintList();
//插入
sq.Insert(7,'t');
//删除第三个数据
cout<<"删除了的值是:"<<sq.Delete(3)<<endl;
cout<<"插入和删除之后的顺序表:"<<endl;
sq.PrintList();
cout<<"值为g的数据所在的下标是:"<<sq.Locate('g')<<endl;
}
亲测结果如下
![](https://i-blog.csdnimg.cn/blog_migrate/15424e05a0e68e06cb896e641869dd09.png)
在写的过程中我突然想到,线性表类还能再添加另外一些功能,比如将线性表反转一下?
还有一个问题是:当按值查找的时候按上边给出的代码只会返回第一次出现x值的下标,那如果是有多个呢?怎么解决?这个就看具体的需求来修改代码了。