【无标题】顺序表的一些最基本操作

顺序表的一些最基本操作

萌新菜鸟一枚,目前刚开始学数据结构与算法,只有一年c++的功底,不过也忘得差不多了,但为了学习数据结构与算法,还是得从头拿起来学,学院里定的教材是清华殷人昆的那本,确实难啃,然后自己从头开始学起来也确实有点吃力,主要是写代码。
不过,千里之行始于足下嘛,包括在CSDN里写博客(这也是我第一次写)。

直接上代码

主要就是顺序表的一些最基本的操作

  1. 顺序表的类定义
  2. 顺序表的构造函数(这里还不知道怎么具体直接一步到位构造顺序表,本来是打算写一个数组初始化元素的,但是没有做到,后面又打算偷懒在主函数里输入数据,但是又没有做到,所以干脆就直接用insert函数直接for循环插入构造了)
  3. 查找元素
  4. 删除元素
  5. 插入元素

代码详细细节`

头文件:
#pragma once
#include
using namespace std;
#include
//#define maxsize 256 //为了考虑到最后的初始化的时候用数组,所以这里在对构造函数的重写中使用了宏定义的顺序表大小
template
class seqlist //顺序表的类定义比静动态存储更重要
{
public:
T* data;
int maxsize;
//int length;
int last; //从0开始的最后一个元素的下标,即数组表长-1
public:
//void initlist(seqlist& L);//初始化顺序表,不用数组初始化,用插入数据函数初始化+for循环
//seqlist(T a[], int sz); //重新写一个构造函数,可以直接用对应数组的元素来初始化对应的顺序表
seqlist(int sz); //构造函数,参数sz指定数组的大小
int search(T& x); //查找元素x,引用可以理解,找到之后用int返回其位置
bool insert(T x, int i); //在位置顺序i处插入元素x,插入成功则返回true,否则返回false
bool remove(T& x); //删除元素x,若有多个元素,则只删除第一个,删除成功则返回true,否则false
};

template
seqlist::seqlist(int sz) //构建空表,之后用insert函数来插入数据(用1个for循环)
{
if (sz > 0)
{
maxsize = sz; //数组大小数据更新
last = -1; //表长数据,空表
data =new T [maxsize];
if (data == NULL) //数组(地址,大小)+表长元素都有了,数组动态分配的检查
{
cerr << “存储分配错误” << endl;
exit(1);
}
}
}
template
int seqlist:: search(T& x) //查找元素x,引用可以理解,找到之后用int返回其位置
{
int i = 0;
while (i <= last && data[i] != x)
{
i++;
}
if (i > last) //跳出循环之一是超出下标,则没找到
{
return -1;
}
else //否则就是找到了该元素
{
return i;
}
}
template
bool seqlist::insert(T x, int i) //在位置顺序i处插入元素x,插入成功则返回true,否则返回false
{
if (i<0 || i>last + 1 || last + 1 == maxsize) //统一先判断能否插入,即插入的时候位置是否合适(空表-1或者是last+1,以及表满了,表长last+1=数组大小
{
return false; //不能插入
}
else
{
last++;
for (int j = last; j >=i; j–) //从后面往前面循环,依次后移一个位置
{
data[j] = data[j - 1];
}
data[i] = x;
return true; //插入成功
}
}
template
bool seqlist:: remove(T& x)//删除元素x,若有多个元素,则只删除第一个,删除成功则返回true,否则false
{
int i = search(x); //先找到x在顺序表中的位置,在该位置从前往后循环前移一个位置
if (i >= 0)
{
last–;
for (int j = i; j <= last; j++)
{
data[j] = data[j + 1];
}
return true; //删除成功
}
else
{
return false; //表中没有该元素
}
}

源文件:
#include"ex0209.h"
#define endtag 000 //此处预定义000是数字输入结束符号
int main()
{
seqlist L(10); //5个就是后面的insert函数初始化中的a[i],用于数据的初始化
int a[5] = { 90,56,23,787,6 };
for (int i = 0; i < 5; i++)
{
L.insert(a[i], i); //没有规律,或者是用随机函数
L.last = i ;
}
cout << “原始顺序表数据” << endl;
for (int i = 0; i <=L.last; i++)
{
cout << L.data[i] << ‘\t’;
}
cout << endl << “请输入待查找的元素:”;
int x;
cin >> x;
cout << endl << “该元素的位置(下标):” << L.search(x) << endl;
cout << “删除该元素” << endl;
L.remove(x);
cout << “现在顺序表数据” << endl;
for (int i = 0; i <=L.last; i++)
{
cout << L.data[i] << ‘\t’;
}
cout << “在0下标处插入数据”;
L.insert(99, 0);
cout << “现在顺序表数据” << endl;
for (int i = 0; i <=L.last; i++)
{
cout << L.data[i] << ‘\t’;
}
return 0;
}

最终结果的代码显示
最终结果显示

老实说,排版之类的萌新也不太清楚,格式设置之类的也不太清楚,只能是后面慢慢实践逐步掌握了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值