C++实现顺序表的14种操作
C++顺序表的操作
2017-12-27
// 顺序表.cpp: 定义控制台应用程序的入口点。
//Author:kgvito YinZongYao
//Date: 2017.12.27 #include "stdafx.h"
#include<iostream>
using namespace std; #define MAXSIZE 3
#define Node ElemType
#define ERROR 0
typedef int DataType; //创建一个节点类
class Node
{
public:
DataType data;
}; //创建一个顺序表类
class SqList
{
public:
SqList(); //初始化顺序表
~SqList(); //销毁顺序表
void CreateSqList(int n); //定义创建一个顺序表
void TraverseSqList(); //遍历顺序表
ElemType GetElemByIndex(int i); //根据下标查找顺序表中的元素
bool isEmpty(); //判断顺序表是否为空
bool isFull(); //判断顺序表是否满
int GetLength(); //获取顺序表的长度
int GetElemByElem(DataType data); //查看顺序表中是否含有查找的值
void InsertSqList(int n, DataType data); //向顺序表中插入新数据
void InsertSqListAtHead(DataType data); //在头部插入新数据
void InsertSqListAtEnd(DataType data); //向顺序表的最后插入数据
void DeleteElem(int i); //删除指定位置的值
void DeleteElemAtElem(DataType data);//按值删除元素
void DeleteAll(); //删除所有元素
void DeleteAtHead(); //在头部删除元素
private:
Node * elem; //顺序表的基地址
int length; //顺序表的长度
}; //初始化顺序表
SqList::SqList()
{
elem = new ElemType[MAXSIZE]; //开辟空间
if (!elem) { //当溢出时报异常
exit(OVERFLOW);
}
length = ; //定义顺序表的长度
} //销毁顺序表
SqList::~SqList()
{
delete[] elem; //删除基地址的指针
} //创建顺序表
void SqList::CreateSqList(int n)
{
if (n < ) { //当输入的数值有误时报异常
cout << "输入的节点个数有误!" << endl;
exit(EXIT_FAILURE);
}
else {
int i;
for (i = ; i < n;i++) { //循环向数组中插入数据
cout << "请输入第" << i + << "个节点元素: ";
cin>>elem[i].data;
}
length = n; //更改顺序表的长度
}
} //遍历顺序表
void SqList::TraverseSqList()
{
for (int i = ; i < length;i++) { //循环打印顺序表的每个节点数据
cout << "第" << i + << "个元素的值是" << elem[i].data << endl;
}
} //通过下标获取元素
ElemType SqList::GetElemByIndex(int i)
{
if (i < || i > length) { //下标输入有误时报异常
cout << "查询的下标不存在" << endl;
}
else {
return elem[i - ]; //返回下标指定的节点
}
} //判断顺序表是否为空
bool SqList::isEmpty()
{
if (length == ) //如果顺序表的长度为0,则表为空
return true;
return false; //长度不为0,表不为空
} //判断顺序表是否满
bool SqList::isFull()
{
if (length == MAXSIZE) //当长度为定义的最大长度,则顺序表满
return true;
return false; //否则不满
} //获取顺序表的长度
int SqList::GetLength()
{
return length; //返回顺序表的长度
} //判断是否存在寻找的值,如果存在将返回下标
int SqList::GetElemByElem(DataType data)
{
int i;
for (i = ; i < length;i++) { //从头遍历顺序表
if (elem && elem[i].data == data) { //若找到与之匹配的数据,则返回当前节点的下标
return i + ;
}
if (i == length - ) { //否则返回-1
return -;
} }
} //插入一个数据
void SqList::InsertSqList(int i, DataType data)
{
if (i< || i > length+) { //下标输入有误时报异常
cout << "输入的下标不合法" << endl;
}
else if (length > MAXSIZE) { //当顺序表满时无法插入新的数据
cout << "已经达到最大长度" << endl;
}
else
{
for (int j = length - ; j >= i - ; j--) { //遍历到要插入的位置
elem[j + ] = elem[j]; //从j位置后的全体数据向后移一位
}
elem[i - ].data = data; //插入数据
length++; //更改顺序表长度
}
} //在头部插入一个新数据
void SqList::InsertSqListAtHead(DataType data)
{ for (int i = length - ; i >= ; i--) //将全体元素向后移一位
{
elem[i + ] = elem[i];
}
elem[].data = data; //在第一个位置插入元素
length++; //更改长度
} //在顺序表的最后插入数据
void SqList::InsertSqListAtEnd(DataType data)
{
if (length > MAXSIZE) { //当顺序表满时无法插入新的数据
cout << "已经达到最大长度" << endl;
}
else
{
elem[length].data = data; //插入数据
length++; //更改顺序表长度
}
} //根据下标删除一个节点
void SqList::DeleteElem(int i)
{
int j;
if (i< || i>length) //输入的位置不合法报异常
cout << "输入的下标不合法" << endl;
else
{
for (j = i; j <= length - ;j++) { //循环到要删除节点的位置
elem[j - ] = elem[j]; //该位置后的元素全体向前移一个位置
}
length--; //更改顺序表长度
}
} //按值删除元素
void SqList::DeleteElemAtElem(DataType data)
{
int i = ;
while (elem[i].data == data && i < length) //按值查到要删除数据的位置
{
i++;
}
for (int index = i; index <= length - ; index++) //将该位置后的节点全体向前移一位
{
elem[index - ] = elem[index];
}
length--; //更改顺序表长度
} //删除所有元素
void SqList::DeleteAll()
{
for (int i = length;i > ;i--) //从最后一个元素开始删除,长度减一
{
elem[i] = elem[i - ]; //元素向前移位
length--; //长度减一
}
} //在头部删除元素
void SqList::DeleteAtHead()
{
for (int i = ; i <= length - ; i++) {
elem[i - ] = elem[i];
}
length--;
} //测试函数
int main()
{
SqList l;
int i;
cout << "1.创建一个顺序表 2.遍历顺序表 3.通过下标获取元素\n4.查找要查询的元素的下标 5.通过下标插入元素 6.通过下标删除一个元素\n7.获取顺序表的长度 8.删除所有元素 9.判断顺序表是否为空\n10.判断顺序表是否满 11.根据数据删除节点 12.在头部插入数据\n13.在头部删除数据 14.在顺序表最后插入数据 0.退出" << endl;
do
{
cout << "请选择一个操作: " ;
cin >> i;
switch (i)
{
case :
int n;
cout << "请输入顺序表的元素个数: ";
cin >> n;
l.CreateSqList(n);
break;
case :
l.TraverseSqList();
break;
case :
int i;
cout << "请输入将要获取元素的下标: ";
cin >> i;
ElemType getElemByIndex = l.GetElemByIndex(i);
cout << getElemByIndex.data << endl;
break;
case :
DataType data;
cout << "请输入将要查找元素的值: ";
cin >> data;
cout<<"该元素的下标为:"<<l.GetElemByElem(data)<<endl;
break;
case :
int index;
DataType insertData;
cout << "请输入要插入的数据的位置: ";
cin >> index;
cout << "请输入要插入的数据: ";
cin >> insertData;
l.InsertSqList(index, insertData);
break;
case :
int deleteIndex;
cout << "请输入要删除的数据的下标: ";
cin >> deleteIndex;
l.DeleteElem(deleteIndex);
break;
case :
cout<<l.GetLength()<<endl;
break;
case :
l.DeleteAll();
break;
case :
if (l.isEmpty() == ) {
cout << "顺序表为空" << endl;
}
else
{
cout << "顺序表不为空" << endl;
}
break;
case :
if (l.isFull() == ) {
cout << "顺序表满" << endl;
}
else
{
cout << "顺序表不满" << endl;
}
break;
case :
DataType data1;
cout << "请输入要删除的数据: ";
cin >> data1;
l.DeleteElemAtElem(data1);
break;
case :
DataType data2;
cout << "请输入要在头部插入的数据: ";
cin >> data2;
l.InsertSqListAtHead(data2);
break;
case :
l.DeleteAtHead();
break;
case :
DataType data3;
cout << "请输入要在末尾插入的数据: ";
cin >> data3;
l.InsertSqListAtEnd(data3);
break;
default:
break;
}
} while(i != );
system("pause");
return ;
}
C++实现顺序表的14种操作的更多相关文章
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- C++学习---顺序表的构建及操作
#include<iostream> #include<fstream> using namespace std; #define MAXLEN 100 //定义顺序表 str ...
- 动态分配的顺序线性表的十五种操作—C语言实现
线性表 定义:是最常用的,也是最简单的数据结构,是长度为n个数据元素的有序的序列. 含有大量记录的线性表叫文件 记录:稍微复杂的线性表里,数据元素为若干个数据项组成,这时把一个数据元素叫记录 结构特点 ...
- c语言实现--顺序表操作
经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连 ...
- 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表
在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...
- C#顺序表(数据结构)
xmfdsh我近来心情实在不好,只因为这两天课比较少,然后一下子时间太多,不知道干什么,心情郁闷......这是要闹哪样?这都让我一个郁闷了一个晚上.闲来无聊,回顾下之前学的C#数据结构,数据结构的重 ...
- 3、顺序表、内存、类型、python中的list
1.内存.类型本质.连续存储 1.内存本质 2.C 语言实例-计算 int, float, double 和 char 字节大小 使用 sizeof 操作符计算int, float, double 和 ...
- 线性表的顺序存储结构之顺序表类的实现_Java
在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...
- 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表
一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...
随机推荐
- 一个小证明(题解 P5425 Part1)
所以这道题为什么可以这样做 嗯,我也不知道,不过我是来填坑的. \(Q\):为什么要把牛分成\(1\),\(1\)......\(N-K+1\)这样的\(K\)组呢? \(A\):我们设第\(i\)组 ...
- python matplotlib绘图/sklearn包--make_blobs()
1.make_bolbs() 函数 from sklearn.datasets.samples_generator import make_blobs import numpy as np impor ...
- SpringBoot学习(学习过程记录)
关于微服务和SOA 这,仅是我学习过程中记录的笔记.确定了一个待研究的主题,对这个主题进行全方面的剖析.笔记是用来方便我回顾与学习的,欢迎大家与我进行交流沟通,共同成长.不止是技术. 官网教程学习ht ...
- 045、Java中使用if语句进行判断
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- spring boot 接口service有多个实现类
接口.java public interface DeService { } 接口实现类1.java @Service("ud")public class DeServiceImp ...
- Spring加载Properties配置文件的三种方式
一.通过 context:property-placeholder 标签实现配置文件加载 1) 用法: 1.在spring.xml配置文件中添加标签 <context:property-plac ...
- 剑指offer自学系列(三)
题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变,例如{5,1,4,2 ...
- 工作问题整理-- sqlserver 新增参数限制,maven pom邮件发送
1.SqlServer连续新增参数限制 com.microsoft.sqlserver.jdbc.SQLServerException: 传入的请求具有过多的参数.该服务器支持最多 2100 个参数. ...
- 八十六、SAP中ALV的事件查看
一.事务代码SE37,点击运行 二.再点击执行 三.我们可以看到有17个事件,点击17前面的表格图标 四.来到详细的事件中 五.我们回到SE37,点击显示 六.查看参数,为一个内表 七.我们点击SLI ...
- css 基础知识 (待完善...)
CSS 1.position 属性 对元素进行定位. absolute 相对于 非static类型的position 的 第一个(临近的) 父元素 进行定位. ...