数据结构 第二章 线性表(C++实现 带继承和类模板)
本文讲第二章数据结构的进行了加工处理(参考书籍《数据结构与算法–C++实现》(慕晨))
父类的定义
在数据结构中,我们发现顺序表、单链表、双链表实现的功能是一样的,都有插入函数、删除函数、按值查找、按位查找等操作。
我们讲线性表的功能函数提出来就可以构成一个父类
这里的定义List类
函数成员有
函数名 | 返回值 | 参数表 | 作用 |
---|---|---|---|
getLength | int | void | 返回表长 |
getItem | E | int i | 返回某个位置的元素 |
locate | int | E x | 返回元素所在的位置 |
insert | void | int i,E x | 插入元素 |
remove | E | int i | 删除元素 |
empty | bool | void | 判断表是否为空 |
printList | void | void | 输出整个线性表 |
List.h
这里使用virtual定义为虚函数,在子类中定义同名的函数覆盖,父类的指针可以调用这些函数,实现子类函数的功能
#include <iostream>
template<typename E>
class List {
public:
virtual int getLength() { return 0; };
virtual E* getItem(int i) { return nullptr; };
virtual int locate(E x) { return 0; };
virtual void insert(int i,E x){};
virtual E remove(int i) { return E(); };
virtual bool empty() { return false; };
virtual void printList(){};
private:
};
顺序表的实现
定义部分
template<typename Element>
class SeqList :public List<Element>{
public:
SeqList();
SeqList(Element a[],int n);
~SeqList();
int getLength();
Element* getItem(int i);
int locate(Element x);
void insert(int i,Element x);
Element remove(int i);
bool empty();
void printList();
int getMaxSize() const;
private:
int MaxSize = 2;
Element *data;
void resize();
int length;
};
顺序表的扩容操作
在数据结构书中线性表没有提及扩容的相关操作
但在实际数据结构的使用中往往需要扩容
以STL的Vector为例,实现原理是顺序表,在容量不足时自动扩展到以前的2倍(有的版本是1.5倍)
resize函数
template<typename Element>
void SeqList<Element>::resize() {
Element *dataNew = new Element[MaxSize*2];
MaxSize *= 2;
for(int i = 0;i<length;i++)
{
dataNew[i] = data[i];
}
delete[] data;
data = dataNew;
}
在插入函数使用扩容
template<typename Element>
void SeqList<Element>::insert(int i, Element x) {
if(length >= MaxSize)resize();
if(i<1||i>length+1)throw "位置异常";
for(int j = length;j>=i;j--)
{
data[j] = data[j-1];
}
data[i-1] = x;
length++;
}
全部代码
#include <iostream>
#include "List.h"
using namespace std;
template<typename Element>
class SeqList :public List<Element>{
public:
SeqList();
SeqList(Element a[],int n);
~SeqList();
int getLength();
Element* getItem(int i);
int locate(Element x);
void insert(int i,Element x);
Element remove(int i);
bool empty();
void printList();
int getMaxSize() const;
private:
int MaxSize = 2;
Element *data;
void resize();
int length;
};
template<typename Element>
SeqList<Element>::SeqList() {
data = new Element[2];
length = 0;
}
template<typename Element>
SeqList<Element>::SeqList(Element *a, int n) {
if(n > MaxSize)throw "参数非法";
for(int i = 0;i < n;i++)
{
data[i] = a[i];
}
length = n;
}
templat