为了能到远方,脚下的每一步都不能少.|

Smera1d0

园龄:1年6个月粉丝:11关注:0

数据结构与算法——顺序表

  • 定义:一系列物理连续地址的存储单元,用来存储一系列的数据元素,一般是用数组的形式存储,(但和数组还是有一些区别),用来实现对数据的增删查改

(一)定义模板类

代码如下:

template <class T> // 假定顺序表的元素类型为T
class arrList : public List<T> { // 顺序表,向量
private: // 线性表的取值类型和取值空间
int maxSize; // 私有变量,顺序表实例的最大长度
int curLen; // 私有变量,顺序表实例的当前长度
int position; // 私有变量,当前处理位置
T *aList ; // 私有变量,存储顺序表的实例
public: // 顺序表的运算集
arrList(const int size) { // 创建一个新的顺序表,参数为表实例的最大长度
maxSize = size;
aList = new T[maxSize];
curLen = position = 0;
}
~arrList() { // 析构函数,用于消除该表实例
delete [] aList;
}
void clear() { // 将顺序表存储的内容清除,成为空表
delete [] aList;
curLen = position = 0;
aList = new T[maxSize];
}
int length(); // 返回此顺序表的当前实际长度
bool append(T value); // 在表尾添加一个元素value,表的长度增1
bool insert(int p, T value); // 在位置p上插入一个元素value,表的长度增1
bool del(int p); // 删除位置p上的元素,表的长度减 1
int getPos(const T value); // 在线性表中查找值为value的元素,并返回第1次出现的位置
void print(); // 打印线性表
};

(二)具体函数的实现:

构造函数:

arrlist(const int size){//创建一个新的顺序表,参数为表的最大长度
maxsize=size;
alist=new int[maxsize];
curlen=position=0;
}

析构函数:

~arrlist(){
delete[]alist;//析构函数,用于消除该表的实例
}

clear函数:

void clear(){//将顺序表储存的内容清除
delete[]alist;
curlen=position=0;
alist=new int[maxsize];
}

length函数:

int length(){//返回此顺序表的当前实际长度
return curlen;
}

getpos函数:

int getpos(const int value){//查找值为value的元素的下标
for(int i=0;i<curlen;i++){
if(value==alist[i])
return i;
}
return -1;
}

insert函数:

bool insert(const int p,const int value){//在某位置插入元素
if(curlen>=maxsize){
cout<<"The List is overflow"<<endl;
return false;
}
if(p<0||p>curlen){
cout<<"Insertion point is illegal"<<endl;
return false;
}
for (int i = curlen; i > p; i--) {
alist[i] = alist[i - 1];
}
alist[p] = value;
curlen++;
return true;
}

del函数:

bool del(const int p){
if(curlen==0){
cout<<"No elements to delete"<<endl;
return false;
}
if(p<0||p>curlen-1){
cout<<"Deletion is illegal"<<endl;
return false;
}
for(int i=p;i<=curlen-1;i++){
alist[i]=alist[i+1];
}
curlen--;
return true;
}

print函数:

void print(){
for(int i=0;i<curlen;i++){
cout<<alist[i];
}
cout<<endl;
}

(三)完整代码:

#include<iostream>
using namespace std;
class arrlist {
private:
int* alist;//储存顺序表的实例
int maxsize;//顺序表的最大长度
int curlen;//顺序表的当前长度
int position;//当前处理位置
public:
arrlist(const int size) {//创建一个新的顺序表,参数为表的最大长度
maxsize = size;
alist = new int[maxsize];
curlen = position = 0;
}
~arrlist() {
delete[]alist;//析构函数,用于消除该表的实例
}
void clear() {//将顺序表储存的内容清除
delete[]alist;
curlen = position = 0;
alist = new int[maxsize];
}
int length() {//返回此顺序表的当前实际长度
return curlen;
}
int getpos(const int value) {//查找值为value的元素的下标
for (int i = 0; i < maxsize; i++) {
if (value == alist[i]) {
return i;
}
}
return -1;
}
bool insert(const int p, const int value) {//在某位置插入元素
if (curlen >= maxsize) {
cout << "The List is overflow" << endl;
return false;
}
if (p<0 || p>curlen) {
cout << "Insertion point is illegal" << endl;
return false;
}
for (int i = curlen; i > p; i--) {
alist[i] = alist[i - 1];
}
alist[p] = value;
curlen++;
return true;
}
bool del(const int p) {//删除顺序表上指定位置的元素
if (curlen == 0) {
cout << "No elements to delete" << endl;
return false;
}
if (p<0 || p>curlen - 1) {
cout << "deletion is illegal" << endl;
return false;
}
for (int i = p; i <= curlen - 1; i++) {
alist[i] = alist[i + 1];
}
curlen--;
return true;
}
void print() {
for (int i = 0; i < curlen; i++) {
cout << alist[i];
}
cout << endl;
}
};
int main() {
arrlist a(10);
a.insert(0, 1);
a.print();
a.insert(1, 3);
a.insert(1, 2);
a.print();
a.insert(3, 4);
cout<<a.length()<<endl;
a.del(3);
a.print();
cout<<a.length()<<endl;
cout << a.getpos(1);
return 0;
}

(四)运行结果:

1
123
4
123
3
0

(五)关于时间复杂度:

  • 按位置读取:O(1)

  • 插入、删除、按内容查找:O(n)

  • 查找:i=1np×i=1n(1+2+n)=n+12

  • 插入:i=0np×(ni)=1n+1i=0n(ni)=n2

本文作者:Smera1d0

本文链接:https://www.cnblogs.com/Smera1d0/p/17698001.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Smera1d0  阅读(40)  评论(0编辑  收藏  举报
  1. 1 郑润泽
  2. 2 如果呢 郑润泽
- 郑润泽
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 郑润泽

作曲 : 郑润泽

编曲 : 朴桑松Sunny@壹橙Music

制作人 : 苗柏杨@壹橙Music/郑润泽

我想 说不清哪天

你就会回来

你就会回来

可太多的思念

可太多的思念

却压着时钟转

喜欢 在夜深人静

喜欢 在夜深人静

零碎的不堪

零碎的不堪

能孤单的 大胆

能孤单的 大胆

太多挂念

太多挂念

光好刺眼

殆尽之前

殆尽之前

你出现在我眼前

就当是我的幻觉 慢一点

就当是我的幻觉 慢一点

如果倒转思念

如果倒转思念

在这之前

能够将我换为你来选

你要让时间怎么转

你要让时间怎么转

刚错过的怎么换

刚错过的怎么换

不想到醒来缺一块

不想到醒来缺一块

我想过忘记

我想过忘记

是最后最坏的打算

一尘不染

一尘不染

如此简单

如此简单

你羞涩的拍下的相片纸

你羞涩的拍下的相片纸

第一次的画面

第一次的画面

你让我触动了这按键

是放松的那面

是放松的那面

再到后来慢慢的瓦解

再到后来慢慢的瓦解

在暂时分别那天

在暂时分别那天

谁能够想到那是我们

谁能够想到那是我们

两人之间最后的一面

明明在这之前

明明在这之前

相拥的如此坚定

相拥的如此坚定

说着一直在身边

说过要一起看的海

说过要一起看的海

现在我独自等待

现在我独自等待

你要让时间怎么转

你要让时间怎么转

刚错过的怎么换

刚错过的怎么换

不想到醒来缺一块

不想到醒来缺一块

我想过忘记

我想过忘记

是最后最坏的打算

我的无力成为了我的败笔

我的无力成为了我的败笔

我是无法做到真的毫不在意

我是无法做到真的毫不在意

我只能做的只是每天

我只能做的只是每天

默念 默念

忘记是最后最后的最坏打算

忘记是最后最后的最坏打算

一尘不染

一尘不染

如此简单

如此简单

不断的失重

不断的失重

直到我失控

直到我失控

没有任何理由

没有任何理由

你已经看见

你已经看见

怎会相信我说的我不痛

你要让时间怎么转

你要让时间怎么转

刚错过的怎么换

刚错过的怎么换

不想到醒来缺一块

不想到醒来缺一块

我想过忘记

我想过忘记

是最后最坏的打算

一尘不染

一尘不染

如此简单

如此简单

吉他 : 陈麒元@NoMarryStudio

弦乐 : 国际首席爱乐乐团

鼓 : 伊佳文

鼓录音 : 万曦

和声 : 彭浩楷

混音/母带 : 钟焕楷@壹橙Music/谭玉堂

封面设计 : ELANUS

艺人经纪 : 青小桔@青桔娱乐

艺人宣传 : 肖肖@Matrix/毛俊@青桔音乐

企划营销 : 花境艺@银河方舟/赵国庆@银河方舟

艺人合作统筹:姚慧佳@银河方舟

项目总监:宫尹琳@银河方舟

出品人:陆㻛@银河方舟/张洛铭@Matrix/李淘@青桔音乐

OP:青桔音乐

SP:银河方舟

点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起