c++实现顺序表的基本操作_c语言实现顺序表

c++实现顺序表的基本操作_c语言实现顺序表C++顺序表的实现// 顺序表.cpp: 定义控制台应用程序的入口点。//Author:kgvito YinZongYao//Date: 2017.12.27 #include<iostream>using namespace std; #define MAXSIZE 3#define Node ElemType#define ERROR 0typedef int…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

C++顺序表的实现

// 顺序表.cpp: 定义控制台应用程序的入口点。
//Author:kgvito YinZongYao
//Date: 2017.12.27
#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 = 0;                     //定义顺序表的长度
}
//销毁顺序表
SqList::~SqList()                  
{ 

delete[] elem;   //删除基地址的指针
}
//创建顺序表
void SqList::CreateSqList(int n)
{ 

if (n < 0) { 
                                //当输入的数值有误时报异常
cout << "输入的节点个数有误!" << endl;
exit(EXIT_FAILURE);
}
else { 

int i;
for (i = 0; i < n;i++) { 
                //循环向数组中插入数据
cout << "请输入第" << i + 1 << "个节点元素: ";
cin>>elem[i].data;
}
length = n;                             //更改顺序表的长度
}
}
//遍历顺序表
void SqList::TraverseSqList()
{ 

for (int i = 0; i < length;i++) { 
           //循环打印顺序表的每个节点数据
cout << "第" << i + 1 << "个元素的值是" << elem[i].data << endl;
}
}
//通过下标获取元素
ElemType SqList::GetElemByIndex(int i)
{ 

if (i < 1 || i > length) { 
       //下标输入有误时报异常
cout << "查询的下标不存在" << endl;
}
else { 

return elem[i - 1];          //返回下标指定的节点
}
}
//判断顺序表是否为空
bool SqList::isEmpty()
{ 

if (length == 0)    //如果顺序表的长度为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 = 0; i < length;i++) { 
    //从头遍历顺序表
if (elem && elem[i].data == data) { 
  //若找到与之匹配的数据,则返回当前节点的下标
return i + 1;
}
if (i == length - 1) { 
       //否则返回-1
return -1;
}
}
}
//插入一个数据
void SqList::InsertSqList(int i, DataType data)
{ 

if (i<1 || i > length+1) { 
      //下标输入有误时报异常
cout << "输入的下标不合法" << endl;
}
else if (length > MAXSIZE) { 
   //当顺序表满时无法插入新的数据
cout << "已经达到最大长度" << endl;
}
else
{ 

for (int j = length - 1; j >= i - 1; j--) { 
   //遍历到要插入的位置
elem[j + 1] = elem[j];     //从j位置后的全体数据向后移一位
}
elem[i - 1].data = data;       //插入数据
length++;                      //更改顺序表长度
}
}
//在头部插入一个新数据
void SqList::InsertSqListAtHead(DataType data)
{ 

for (int i = length - 1; i >= 0; i--)  //将全体元素向后移一位
{ 

elem[i + 1] = elem[i];
}
elem[0].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<1 || i>length)           //输入的位置不合法报异常
cout << "输入的下标不合法" << endl;
else                           
{ 

for (j = i; j <= length - 1;j++) { 
 //循环到要删除节点的位置
elem[j - 1] = elem[j];         //该位置后的元素全体向前移一个位置
}
length--;                          //更改顺序表长度
}
}
//按值删除元素
void SqList::DeleteElemAtElem(DataType data)
{ 

int i = 0;
while (elem[i].data != data && i < length)   //按值查到要删除数据的位置
{ 

i++;
}
for (int index = i; index <= length - 1; index++) //将该位置后的节点全体向前移一位
{ 

elem[index] = elem[index + 1];
}
length--;                              //更改顺序表长度
}
//删除所有元素
void SqList::DeleteAll()
{ 

for (int i = length;i > 0;i--)    //从最后一个元素开始删除,长度减一
{ 

elem[i] = elem[i - 1];        //元素向前移位
length--;                     //长度减一
}
}
//在头部删除元素
void SqList::DeleteAtHead()
{ 

for (int i = 1; i <= length - 1; i++) { 

elem[i - 1] = 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 1:
int n;
cout << "请输入顺序表的元素个数: ";
cin >> n;
l.CreateSqList(n);
break;
case 2:
l.TraverseSqList();
break;
case 3:
int i;
cout << "请输入将要获取元素的下标: ";
cin >> i;
ElemType getElemByIndex = l.GetElemByIndex(i);
cout << getElemByIndex.data << endl;
break;
case 4:
DataType data;
cout << "请输入将要查找元素的值: ";
cin >> data;
cout<<"该元素的下标为:"<<l.GetElemByElem(data)<<endl;
break;
case 5:
int index;
DataType insertData;
cout << "请输入要插入的数据的位置: ";
cin >> index;
cout << "请输入要插入的数据: ";
cin >> insertData;
l.InsertSqList(index, insertData);
break;
case 6:
int deleteIndex;
cout << "请输入要删除的数据的下标: ";
cin >> deleteIndex;
l.DeleteElem(deleteIndex);
break;
case 7:
cout<<l.GetLength()<<endl;
break;
case 8:
l.DeleteAll();
break;
case 9:
if (l.isEmpty() == 1) { 

cout << "顺序表为空" << endl;
}
else
{ 

cout << "顺序表不为空" << endl;
}
break;
case 10:
if (l.isFull() == 1) { 

cout << "顺序表满" << endl;
}
else
{ 

cout << "顺序表不满" << endl;
}
break;
case 11:
DataType data1;
cout << "请输入要删除的数据: ";
cin >> data1;
l.DeleteElemAtElem(data1);
break;
case 12:
DataType data2;
cout << "请输入要在头部插入的数据: ";
cin >> data2;
l.InsertSqListAtHead(data2);
break;
case 13:
l.DeleteAtHead();
break;
case 14:
DataType data3;
cout << "请输入要在末尾插入的数据: ";
cin >> data3;
l.InsertSqListAtEnd(data3);
break;
default:
break;
}
} while(i != 0);
system("pause");
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/170891.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 一文弄懂罗斯蒙特644温度变送器接线

    一文弄懂罗斯蒙特644温度变送器接线罗斯蒙特644温度变送器分为单输入644H和双输入644S两种,昌晖仪表在本文介绍温度变送器644接线,大家学习一起罗斯蒙特644温度变送器接线的注意事项。问题1:下图①位置这四个端子是干什么的?问题2:下图②位置这三个端子是干什么的?问题3:下图③位置这三个端子是干什么的?问题4:下图④位置这个插针是干什么的?问题5:下图⑤位置拨盘L和H位置代表什么?问题6:上图⑥位置这两个端子是干什么的?结…

  • 语义分割的发展前景和概述[通俗易懂]

    语义分割的发展前景和概述[通俗易懂]感谢感谢!收藏用~原文出自:http://blog.geohey.com/ji-suan-ji-shi-jue-zhi-yu-yi-fen-ge/计算机视觉之语义分割2017年10月11日人工智能被认为是第四次工业革命,google,facebook等全球顶尖、最有影响力的技术公司都将目光转向AI,虽然免不了存在泡沫,被部分媒体夸大宣传,神经网络在图像识别,语音识别,自然语言处理,无人车等方面的贡…

  • 特征选择/筛选方法总结

    作者:jlianghttps://blog.csdn.net/jliang31.特征选择介绍1)特征分类相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果; 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升; 冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出;2)特征选择的目的对于一个特定的学习算法…

  • 大整数的加法运算_大整数相减

    大整数的加法运算_大整数相减问题:如果给出两个很大很大的整数,这两个数大到long类型也装不下,如何求他们的和呢?回顾起小学数学,当我们需要计算两个较大数目的加减乘除,我们是用列竖式的方式来计算的。因为对于较大的整数,我们无法一步就直接计算出结果,所以不得不把计算过程拆分成一个一个小步骤来完成。不仅仅是人脑,对于计算机来说也可以这样解决。程序不可能通过一条指令计算出两个大整数之和,却可以像列竖式一样将运算拆解成若干小…

  • php面试知识点总结

    php面试知识点总结

  • input file读取文件

    input file读取文件js读取inputfile文件的两种方式:&lt;divid="localImag"&gt;&lt;imgid="preview"src=""width="150"height="180"style="display:block;width:150px;height:180px;"&gt;&lt;

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号