用C++ 和 Python实现顺序表的简单操作

C++代码

 // Date:2019.7.31
// Author:Yushow Jue #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 ;
}

Python代码

class SqList(object):

    def __init__(self, size=6):
self.max = size
self.length = 0
self.list = [] # 创建顺序表
def create_list(self, ):
self.length = int(input("请输入顺序表长度"))
while self.length > self.max:
print("超出最大范围6,重新输入。")
self.length = int(input("请输入顺序表长度"))
i = 0
while i < self.length:
temp = input("请输入第%s个元素" % i)
try:
temp = float(temp)
self.list.append(temp)
i += 1
except ValueError:
print("wrong value !") # 遍历
def print_list(self):
print(self.list) # 判空
def is_empty(self):
if self.length == 0:
print("顺序表为空") # 判满
def is_full(self):
if self.length == self.max:
return True # 根据下标索引
def get_elem_by_index(self, index):
if index >= self.length:
print("下标超出范围")
else:
print("第%s个元素为:%s" % (index, self.list[index])) # 按值查找
def get_elem_by_elem(self, value):
for i in range(self.length):
if value == self.list[i]:
return i
return -1 # 插入
def insert(self, index, value):
if not isinstance(index, int):
raise TypeError
elif index < 0 or index > self.length:
raise IndexError
else:
self.list.append(0)
for i in range(self.length, index, -1):
self.list[i] = self.list[i-1]
self.list[index] = value
self.length += 1 # 按值删除
def delete_elem(self, index):
for i in range(index, self.length):
self.list[index] = self.list[index+1]
self.list.pop()
self.length -= 1 # 清空顺序表
def clear(self):
self.list.clear() if __name__ == '__main__':
sq_list = SqList()
sq_list.create_list()
sq_list.print_list()
if sq_list.is_full():
print("顺序表满了")
print("操作码:")
print("1:插入 2:按值查找 3:按值删除 4:清空 0:退出")
op = 1
while op != 0:
op = int(input("请输入操作码:"))
if op == 1:
if sq_list.is_full():
print("顺序表已满,无法插入")
else:
input_index = int(input("插入位置"))
input_value = float(input("插入元素"))
sq_list.insert(input_index, input_value)
sq_list.print_list() elif op == 2:
input_value = float(input("元素值"))
num = sq_list.get_elem_by_elem(input_value)
if num != -1:
print("存在元素%s,下标为%s" % (input_value, num))
else:
print("不存在") elif op == 3:
input_value = float(input("元素值"))
num = sq_list.get_elem_by_elem(input_value)
sq_list.delete_elem(num)
sq_list.print_list() elif op == 4:
sq_list.clear()
print("清空顺序表")
sq_list.print_list() else:
break

【数据结构 Python & C++】顺序表的更多相关文章

  1. python实现顺序表

    python实现顺序表可以有两中形式进行存储 列表 元组 其实简单来说,顺序表无非就是操作列表和元组的方法来对顺序表进行操作. 实例代码 7 class SqList: 8 def __init__( ...

  2. 五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)

    7.JavaScript语言实现 7.1.用ES6语法编写顺序表类 //1.创建类 class MyList { //1. initList(&L):初始化表.构造一个空的线性表.放回值应该是 ...

  3. C++数据结构学习之顺序表

    顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...

  4. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  5. 【数据结构】之顺序表(C语言描述)

    顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...

  6. C++ 数据结构学习一(顺序表)

    //SequentialList.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; us ...

  7. 数据结构 单链表&顺序表

    顺序表: 一般使用数组(C语言中的数组采用顺序存储方式.即连续地址存储)来描述. 优点:在于随机访问元素, 缺点:插入和和删除的时候,需要移动大量的元素. 链表: 优点:插入或删除元素时很方便,使用灵 ...

  8. 数据结构——Java实现顺序表

    一.分析 什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表.一个标准的顺序表需要实现以下基本操作: 1.初始化顺序表 ...

  9. 数据结构之线性顺序表ArrayList(Java实现)

    一.ListMe接口: import java.util.ArrayList; //实现线性表(顺序表和链表)的接口://提供add get isEmpty size 功能public interfa ...

  10. 数据结构之动态顺序表(C实现)

    线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...

随机推荐

  1. swoole入门到实战打造高性能赛事直播平台☆

    ​ 第1章 课程介绍 本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司的一些案例,最后重点讲解了swoole学习的一些准备工作. 第2章 PHP 7 源码安装 本 ...

  2. 2.线程--线程安全(synchronized)

    同步锁:synchronized,(缺点:不能手动开锁 解锁)   1.同步代码块 public void run(){ synchronized(this){/使用this关键字表示同一把锁,非静态 ...

  3. zabbix (8) 自动发现

    当主机数量过多时,如果一台一台的添加,估计整个人都要崩溃,而通过自动发现或者自动注册可以大批量的添加主机,并且自动绑定模板,触发器,动作等操作 1.基本配置 (1)创建发现规则 (2)配置规则 效果如 ...

  4. (转)hadoop balancer(重新平衡)

    借鉴:https://blog.csdn.net/mnasd/article/details/80369603?utm_source=blogxgwz2 参考文档:  http://blog.csdn ...

  5. hbase单点安装

    系统环境:centos 6 软件包: hbase版本:hbase-1.4.8-bin.tar.gz     下载地址:wget  http://mirror.bit.edu.cn/apache/hba ...

  6. GO windows下编译luajit

    1 GO嵌入luajit需要用到cgo,使用cgo需要安装gcc,在windows上下载MinGW-W64安装上配置好环境变量就可以 2 gcc编译luajit,生成.a文件. 把LuaJIT-2.0 ...

  7. 2018-2019-2 20165222《网络对抗技术》Exp9 Web安全基础

    1.实践过程记录 1.字符串型注入. 2.整数型注入 3.注入语句查看其他内容 4.xss是一种漏洞,这种漏洞允许用户输入脚本并且浏览器提交的时候不加编码.这种东西是最为流行并且有害的web应用的问题 ...

  8. rpm包和deb分别是什么?

    一.RMP 是 LINUX 下的一种软件的可执行程序,你只要安装它就可以了.这种软件安装包通常是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀 ...

  9. Publish site through visual studio

    https://www.c-sharpcorner.com/UploadFile/4b0136/getting-started-with-iis-host-and-publish-in-mvc-5/ ...

  10. MyBatis 插件之拦截器(Interceptor)

    参考 https://blog.csdn.net/weixin_39494923/article/details/91534658 //项目实际使用  就是在你进行数据库操作时,进行数据的第二次封装 ...