更完整的顺序表
Posted djcf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更完整的顺序表相关的知识,希望对你有一定的参考价值。
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
#define maxlen 100 //表的最大长度
typedef struct
int key;
char name[20];
int age;
Data;//节点的结构
typedef struct
Data listdata[maxlen];//用于保存结点的结构体数组
int listlen;//节点数量/表的长度
SLType;//顺序表的结构
int SLInit(SLType* SL)
SL->listlen=0;
//初始一个空表。
int SLLength(SLType*SL)
return SL->listlen;
//输出表的长度。
int SLInsert(SLType *SL,int n,Data data)
int i;
if(SL->listlen>=maxlen)
printf("顺序表已满,无法插入\\n");
return 0;
if(n>SL->listlen||n<1)
printf("插入元素序号有误,无法插入\\n");
return 0;
for(i=SL->listlen;i>=n-1;i--)
SL->listdata[i+1]=SL->listdata[i];
SL->listdata[n-1]=data;
SL->listlen+=1;//节点数量加一;
cout<<"插入成功!"<<endl;
return 1;
//插入一个数据
int SLAdd(SLType*SL,Data data)
if(SL->listlen>=maxlen)
printf("顺序表已满,无法添加");
return 0;
else
SL->listdata[SL->listlen]=data;
SL->listlen++;
cout<<"追加节点成功!"<<endl;
return 1;
//判断顺序表是否已满,在表的末尾添加一个数据。
int SLDelete(SLType *SL,int n)
if(n<1||n>SL->listlen)
printf("输入节点序号有误,无法删除\\n");
return 0;
int i=n-1;
for(i;i<SL->listlen;i++)
SL->listdata[i]=SL->listdata[i+1];
SL->listlen-=1;
cout<<"删除数据成功!"<<endl;
return 1;
//删除指定数据;
int SLFindByCont(SLType*SL,int key)
int i=0;
for(i;i<=SL->listlen;i++)
if(SL->listdata[i].key==key)
cout<<"学生姓名:"<<SL->listdata[i].name<<" 学生年龄:"<<SL->listdata[i].age<<endl;
return 0;
cout<<"未查找到相关信息!"<<endl;
return 0;
//查找指定数据的序号;
int Printf(SLType *SL)
int i;
for(i=0;i<SL->listlen;i++)
cout<<"第"<<i+1<<"名学生信息:"<<"学号: "<<SL->listdata[i].key<<"姓名: "<<SL->listdata[i].name<<"年龄: "<<SL->listdata[i].age<<endl;
return 0;
int main()
int i;
SLType SL;//定义顺序表
Data data;//定义节点
char key[10];
SLInit(&SL);
cout<<"初始化顺序表完成"<<endl;
while(1)
cout<<"请输入节点(学号 姓名 年龄)"<<endl;
cin>>data.key>>data.name>>data.age;
//fflush(stdin);
if(data.age)
if(!SLAdd(&SL,data))
break;
else
break;
cout<<endl<<"顺序表的节点顺序:"<<endl;
Printf(&SL);//输出已录入的学生;
int flag;
while(1)
cout<<"请选择接下来的操作:追加节点(1),插入节点(2),删除节点(3),查看已有的节点数量(4),输出全部数据(5),查找信息(6)结束操作(7)"<<endl;
cin>>flag;
if(flag==1)
Data data;
cout<<"输入追加的学生学号、姓名、年龄:"<<endl;
cin>>data.key>>data.name>>data.age;
SLAdd(&SL,data);
if(flag==2)
int i;
Data data;
cout<<"请输入希望插入的位置(整数)及学生学号、姓名、年龄:"<<endl;
cin>>i>>data.key>>data.name>>data.age;
SLInsert(&SL,i,data);
if(flag==3)
int i;
cout<<"请输入删除的节点序号(整数): "<<endl;
cin>>i;
SLDelete(&SL,i);
if(flag==4)
cout<<"已有的节点个数:"<<SLLength(&SL)<<endl;
if(flag==5)
Printf(&SL);
if(flag==6)
int i;
cout<<"按学号查找(1)按姓名查找(2)"<<endl;
cin>>i;
if(i==1)
int key;
cout<<"请输入学号: "<<endl;
cin>>key;
SLFindByCont(&SL,key);
//按姓名查找else
if(flag==7)
cout<<"感谢使用!"<<endl;
break;
return 0;
总结:
今天解决了在录入数据后因为节点数量导致无法正常输出的问题;
对数组下标和实际需要的序号进行了改进;
增加了多分支操作;
仍存在的问题:
对于标红加粗的语句理解不深;
剩余按姓名查找的函数未写(明日再写);
按学号查找由字符串类型更换为int类型,对于字符串函数的理解应用不足,导致查找函数无法编译;
01=顺序表(python完整代码)
一、顺序表
顺序表是指采用顺序存储的方式来存储数据元素的线性表,顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
1.1 顺序表结构
顺序表中包括元素存储区的容量和当前表中已有的元素个数两项。
1.2 顺序表的两种基本实现方式
- 图1为一体式结构,存储表信息的单元与元素存储区以连续的方式安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。一体式结构整体性强,易于管理。但是由于数据元素存储区域是表对象的一部分,顺序表创建后,元素存储区就固定了。
- 图2为分离式结构,表对象里只保存与整个表有关的信息(即容量和元素个数),实际数据元素存放在另一个独立的元素存储区里,通过链接与基本表对象关联。
1.3 python实现顺序表
# -*- coding: utf-8 -*-
# time: 2022/9/27 10:07
# file: SequenceList.py
# author: Meng
# description:
class SequenceList():
def __init__(self, max_list=20):
self.max_list = max_list # 容量
self.num_list = 0 # 元素个数
self.seq_list = [None] * self.max_list # 顺序表本身
# 计算顺序表中元素数量
def counter(self):
print(f'列表容量为self.max_list,现在列表元素个数为self.num_list\\n')
# 显示顺序表所有元素
def show(self):
print(f'当前顺序表为self.seq_list')
"""
从顺序表添加元素
"""
# 头插法
def add(self, value):
assert self.num_list < self.max_list,\\
"元素已满,添加元素失败"
for j in range(self.num_list, 0, -1):
self.seq_list[j] = self.seq_list[j - 1]
self.seq_list[0] = value
self.num_list += 1
# 尾插法
def append(self, value):
assert self.num_list < self.max_list,\\
"元素已满,添加元素失败"
self.seq_list[self.num_list] = value
self.num_list += 1
# 任意位置插入
def insert(self, index, value):
assert 0 <= index <= self.max_list, "index必须在范围内"
assert self.num_list < self.max_list,\\
"元素已满,添加元素失败"
for j in range(self.num_list, index, -1):
self.seq_list[j] = self.seq_list[j - 1]
self.seq_list[index] = value
self.num_list += 1
# 判断某元素是否存在于顺序表中
def isExist(self, value):
for j in range(self.num_list):
if self.seq_list[j] == value:
return True
return False
# 查询某元素的位置
def find_index(self, value):
if self.isExist(value):
for j in range(self.num_list):
if self.seq_list[j] == value:
return j
else:
print(f"该元素不存在")
# 根据索引查询对应的元素
def getitem(self, index):
assert 0 <= index <= self.num_list, \\
"index必须在范围内,该范围为0-".format(self.num_list)
return self.seq_list[index]
"""
从顺序表中删除元素
""" # 根据索引删除元素
def delete_index(self, index):
assert 0 <= index <= self.num_list, \\
"index必须在范围内,该范围为0-".format(self.num_list)
for j in range(index, self.num_list):
if j == self.num_list - 1:
self.seq_list[j] = None
else:
self.seq_list[j] = self.seq_list[j + 1]
self.num_list -= 1
# 直接删除元素
def delitem(self, value):
if self.isExist(value):
for i in range(self.num_list):
if self.seq_list[i] == value:
self.delete_index(i)
else:
print(f'该元素不存在')
def main():
s = SequenceList(max_list=5) # 实例化对象
s.show() # [None, None, None, None, None]
s.add(1) # [1, None, None, None, None]
s.append(3) # [1, 3, None, None, None]
s.add(2) # [2, 1, 3, None, None]
s.insert(2, 7) # [2, 1, 7, 3, None]
s.counter() # 列表容量为5,现在列表元素个数为4
print(s.find_index(7)) # 2
print(s.getitem(2)) # 7
s.delete_index(1) # [2, 7, 3, None, None]
s.delitem(2) # [7, 3, None, None, None]
if __name__ == '__main__':
main()
以上是关于更完整的顺序表的主要内容,如果未能解决你的问题,请参考以下文章