基于顺序表实现线性表

来源:互联网 发布:iphone 62078端口 编辑:程序博客网 时间:2024/06/08 05:00

大家好呀~好久没有和大家见面啦~~~进入大二了然后现在学业有点忙呢hh,做的题目少了然后时间利用的不是很有效率~所以说写一下博客来督促自己学习吧~

今天使用程序实现了一下线性表。


这次突破了一下自己使用了类模板,以前我都是直接在函数声明之后马上就实现,但是今天我想让整个类变得更加简明扼要一些,所以采用了类外实现。

然后类外实现发现我们还要有一些要注意的地方~就是实现函数之前,都要加一些声明的东西

template<typename E>

......list<E>::......

这个注意一下就好了哈哈哈

我来谈一下对这个程序的理解吧。

首先引入眼帘的是我们的成员对象。

每个顺序表(数组)都有自己的大小,所以说maxSize不难理解。

curSize是一个记录当前线性表大小的数据成员,之所以有这个数据成员存在,主要是因为我们的线性表是一个动态的过程,不断的插入、删减都会对当前的线性表的大小有影响,我们对于线性表的操作都是基于当前位置,然而当前位置的合法性又与我们的当前线性表大小有莫大的关系,所以说这个数据成员也是非常重要的。

*arr就更加不用多加赘述了,因为我们就是基于顺序表实现的线性表。

因为我们线性表的操作都是基于当前位置,所以我们设定curr就是我们的当前位置

在这里其实我很想谈一下两个基本操作

一个是clear函数

一个是insert函数


clear函数

clear函数可以怎么实现呢?其实我觉得,clear函数就是起到一个清空的操作,就是我们不还内存,但是其他的所有数据成员都要回到最开始的情况。我们可以怎么实现呢?其实我们可以delete了我们一开始new出来的连续的内存,然后我们把maxSize=0,curSize=0,curr=0,,再重新new一片内存给arr。

或许

有的同学会说,这样子有点怪怪的,但是我觉得,内存在哪有什么关系呢?在哪不都是连续的一片内存吗,所有的基本操作都是可以完成的。


insert函数

1、insert函数我经常忘记了判断当前位置的合法性,就像如果我们的线性表已经是最大容量了,那么我们的操作就不可能进行了,因为这会超出我们的maxSize

2、我有想过把insert函数加多一个参数pos,然后就可以实现所有位置的insert,替代append,但是我后来想了想,我们的操作应该都要遵从线性表的一个特点,就是插入和删除操作都是基于当前位置,然后当前位置我们也封装了不少的函数对它进行控制,所以说,我们不应该多加以一个pos


以上就是我的一些心得hh


对了还有,记得回收内存!不要内存泄漏了,要不然你写着写着后来的程序就无法run了

0#include<iostream>using namespace std;template<typename E>class list{private:int maxSize;int curSize;int curr;E* arr;public:list(int size);~list();void clear();bool append(E elem);bool insert(E elem);//我们的插入按照前插入的方法,也就是说插入位置为0,则插入后的元素在位置0bool remove(E elem);void movetoBegin();void movetoEnd();bool setPos(int pos);void current(E elem);bool prev();bool next();E getValue();int getPos();int getLen();void tran();};template <typename E>list<E>::list(int size){arr = new E[size];maxSize = size;curSize = 0;curr = 0;}template <typename E>list<E>::~list(){delete[]arr;arr = NULL;maxSize = 0;curr = 0;}template <typename E>void list<E>::clear(){~list();arr = new E[maxSize];}template<typename E>bool list<E>::append(E elem){if (curSize == maxSize)return false;else{arr[curSize] = elem;curSize++;return true;}}template <typename E>bool list<E>::insert(E elem){if (curr < 0 || curr >= curSize)return flase;else{for (int i = curSize - 1; i > curr; i--){arr[i] = arr[i - 1];}arr[curr] = elem;curSize++;return true;}}template <typename E>bool list<E>::remove(E elem){if (curr < 0 || curr >= curSize)return false;else{for (int i = curr; i < curSize - 1; i++)arr[i] = arr[i + 1];arr[curSize - 1] = 0;curSize--;return true;}}template <typename E>void list<E>::movetoBegin(){curr = 0;}template <typename E>void list<E>::movetoEnd(){curr = curSize - 1;}template<typename E>bool list<E>::setPos(int pos){if (pos < 0 || pos <= curSize - 1){curr = pos;return true;}elsereturn false;}template<typename E>void list<E>::current(E elem){arr[curr] = elem;}template <typename E>bool list<E>::prev(){if (curr > 0){curr = curr - 1;return true;}elsereturn false;}template <typename E>bool list<E>::next(){if (curr == curSize)return false;else{curr = curr + 1;return true;}}template <typename E>E list<E>::getValue(){return arr[curr];}template <typename E>int list<E>::getPos(){return curr;}template <typename E>int list<E>::getLen(){return curSize;}template<typename E>void list<E>::tran(){for (int i = 0; i <= curSize - 1; i++){cout << arr[i] << endl;}}


原创粉丝点击