用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. Myeclipse10 安装 破解 激活(含安装包,激活软件 免费)

    参考博客: https://www.cnblogs.com/gzhnan/articles/9536275.html 注意 安装完成之后一定不要点 Launch Myeclipse 下载地址: htt ...

  2. 牛客OI周赛10-提高组:B-Taeyeon的困惑(值域线段树)

    做法 单点加单点删,在值域线段树上直接二分就能求值前\(K\)小的和 Code #include<bits/stdc++.h> typedef long long LL; const LL ...

  3. ELK系列(7) - 测试环境下Logstash异常退出:block in multi_receive_encoded

    问题与分析 在本地测试无误后将ELK部署到了测试环境,结果第二天发现Logstash挂掉了,一开始以为是自动部署之类导致的问题.之后几天时间里Logstash总是会down掉,查看了下日志文件,发现报 ...

  4. A·F·O小记

    看过很多的游记,也看过很多的退役记.回忆录,而当自己真正去面对的那一刻,却又不知道从何说起,也不知道能用怎样的形式和语言,才能把这段珍贵的记忆封存起来,留作青春里的一颗璀璨明珠…… 还是随便写写吧…… ...

  5. can't read property 'push' of undefined

    在某些情况下是因为没有初始化,所以初始化一下就好了

  6. Lucene核心数据结构——FST存词典,跳表存倒排或者roarning bitmap 见另外一个文章

    Lucene实现倒排表没有使用bitmap,为了效率,lucene使用了一些策略,具体如下:1. 使用FST保存词典,FST可以实现快速的Seek,这种结构在当查询可以表达成自动机时(PrefixQu ...

  7. 算法练习 —— LeetCode 1-20题

    一.两数之和 1.1 题目描述 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, ...

  8. Mercury:唯品会全链路应用监控系统解决方案详解(含PPT)

    Mercury:唯品会全链路应用监控系统解决方案详解(含PPT) 原创: 姚捷 高可用架构 2016-08-08    

  9. C语言 消灭编译警告(Warning)

    如何看待编译警告 当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息.警告信息可能意味着程序中隐含的大错误,也可能确实没有问题.对于警告的正确处理方式应该是:尽可能地消除之.对于编译 ...

  10. Git——起步(待续)

    原文链接:Getting Started with Git