【数据结构 Python & C++】顺序表
用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++】顺序表的更多相关文章
- python实现顺序表
python实现顺序表可以有两中形式进行存储 列表 元组 其实简单来说,顺序表无非就是操作列表和元组的方法来对顺序表进行操作. 实例代码 7 class SqList: 8 def __init__( ...
- 五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)
7.JavaScript语言实现 7.1.用ES6语法编写顺序表类 //1.创建类 class MyList { //1. initList(&L):初始化表.构造一个空的线性表.放回值应该是 ...
- C++数据结构学习之顺序表
顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- 【数据结构】之顺序表(C语言描述)
顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...
- C++ 数据结构学习一(顺序表)
//SequentialList.h 顺序表模板类 #ifndef SEQUENTIAL_LIST_HXX#define SEQUENTIAL_LIST_HXX using std::cout; us ...
- 数据结构 单链表&顺序表
顺序表: 一般使用数组(C语言中的数组采用顺序存储方式.即连续地址存储)来描述. 优点:在于随机访问元素, 缺点:插入和和删除的时候,需要移动大量的元素. 链表: 优点:插入或删除元素时很方便,使用灵 ...
- 数据结构——Java实现顺序表
一.分析 什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表.一个标准的顺序表需要实现以下基本操作: 1.初始化顺序表 ...
- 数据结构之线性顺序表ArrayList(Java实现)
一.ListMe接口: import java.util.ArrayList; //实现线性表(顺序表和链表)的接口://提供add get isEmpty size 功能public interfa ...
- 数据结构之动态顺序表(C实现)
线性表有2种,分为顺序表和链表. 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定) 链表: 有3种,单链表.双向链表.循环链表(长度不固定) seqList.h ...
随机推荐
- hadoop(10)---hdfs配置文件详解
以下只是简单的对hdfs(hdfs.site.xml)配置文件做一个简单的说明. <configuration><property><!-- 为namenode集群定义一 ...
- 树莓派安装配置Nginx+PHP7+MariaDB
原文地址:http://blog.sina.com.cn/s/blog_150f554f50102yhra.html 一.安装 Nginx 和 PHP7 1.安装Nginx sudo apt inst ...
- Linux用户组
1.介绍 类似于角色,系统可以对有共性的多个用户进行统一的管理 2.增加组 groupadd 组名 3.删除组 groupdel 组名 4.增加用户时直接为用户指定组 useradd -g 用 ...
- EXCEL公式中如何表示回车符?
问题: 将 id credttm cdno cdamt cashbrid cashrole note 转换为 "id credttm cdno cdamt cashbrid ca ...
- Linux perl: warning: Setting locale failed.perl: warning: Please check that your locale settings:
使用 apt-get 安装软件时,总是出现下面的错误. perl: warning: Setting locale failed. perl: warning: Please check that y ...
- mybatis bind标签
开门见山的说,平时写模糊查询,一直用${name},例如: select * from table where name like '%${name}%' 后来知道了,这样写可能会引发sql注入,于是 ...
- Flutter移动电商实战 --(50)持久化_shared_preferences
当app关掉了.再进去的时候 ,购物车的内容还是存在. sqflite提供这个来操作SQLite数据库 flutter提供三种持久化的工具 今天要学的就是 shared_preferences 还有一 ...
- opencv 检测人脸、人眼
This tutorial code’s is shown lines below. You can also download it from here . The second version ( ...
- ColorMatrix图片饱和度设置
package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...
- Canvas恢复布局
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...