学完数据结构一个学期了,很久没写几乎全都忘了。最近抽点时间把学过的东西都给回顾一下。
首先是顺序表。即用数组实现的线性结构。这里用的是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; }
亲测结果如下
在写的过程中我突然想到,线性表类还能再添加另外一些功能,比如将线性表反转一下?
还有一个问题是:当按值查找的时候按上边给出的代码只会返回第一次出现x值的下标,那如果是有多个呢?怎么解决?这个就看具体的需求来修改代码了。