#include<stdio.h>
#define MaxSize 6 //定义最大长度
//假设顺序表存储的全是正整数
typedef struct
{
int data [MaxSize];//静态 数组 存放数据元素
int length = 0;//顺序表当前长度
} SqList; //顺序表类型定义
//初始化表 构造一个空的线性表
void InitList(SqList &L)
{
//如果不进行初始化,首次访问会读取到脏数据
for(int i = 0; i < MaxSize; i++)
{
L.data[i] = 0;
}
L.length = 0;
}
//删除操作,删除第 i 个 元素,并用 e 返回删除元素的值
bool ListDelete(SqList &L,int i,int & e)
{
if(i < 1 || i > L.length)
{
return false;
}
e = L.data[i-1];
//从i个元素开始元素前移
for(int j = i; j< L.length; j++)
{
L.data[j-1] = L.data[j];
}
L.length--;
return true;
}
//插入操作,在 第 i (i>=1)个 位置 插入 元素e
//这里的插入位置可以是 1 - L.length+1,即插入数据元素的数组下标为0 - L.length
bool ListInsert(SqList &L,int i, int e)
{
//如果插入位置不合法
if(i<1 || i > L.length + 1)
{
return false;
}
//如果存储空间已满
if(L.length >= MaxSize)
{
return false;
}
//当前数据元素的长度为 L.length,最后一个元素为 L.data[L.length - 1] 下标为 L.length - 1
//第i个元素的下标为 i - 1
//L.data[L.length] = L.data[L.length - 1]
//L.data[L.length - 1] = L.data[L.length - 2]
//...
// L.data[i] = L.data[i - 1]
//移动完成
//这时 再将第 i 个位置的元素(数组下标为 i- 1)赋值 为 e
//最后将线性表元素的长度+1
for(int j = L.length; j >= i; j--) //从 i开始后面的元素全部后移一位
{
L.data[j] = L.data[j-1];
}
L.data[i-1] = e;
L.length++;
return true;
}
void testStaticSqList()
{
SqList L;//声明一个顺序表
InitList(L);
//如果未初始化 会读取到 “脏数据”
for(int i =0; i < MaxSize; i++)
{
printf("data[%d]=%d\n",i,L.data[i]);
}
//正确读取方式 或 GetElem
for(int i =0; i < L.length; i++)
{
printf("data[%d]=%d\n",i,L.data[i]);
}
}
//输出操作 按前后顺序输出线性表的所有元素值
void PrintList(SqList L)
{
for(int i = 0; i < L.length; i++)
{
printf("L.data[%d]=%d\n",i,L.data[i]);
}
}
//按位查找操作 获取第 i 个元素的值
int GetElem(SqList L,int i)
{
if(i < 1 || i> L.length)
{
return -1;
}
return L.data[i-1];
}
//按值查找,找到值为e的元素的次序
int LocateElem(SqList L,int e)
{
for(int i = 0; i < L.length; i++)
{
if(L.data[i]==e)
{
return i+1;
}
}
return 0;
}
//求表长
int Length(SqList L) {
return L.length;
}
//判断是否为空表
bool Empty(SqList L){
return Length(L)== 0;
}
//销毁顺序表
void DestroyList(SqList &L) {
L.length = 0;
}
int main()
{
SqList L;//声明一个顺序表
InitList(L);
int p = 0;
int e = -1;
//插入几个数
L.data[0] = 1;
L.length++;
L.data[1]= 2;
L.length++;
L.data[2] = 4;
L.length++;
L.data[3] = 5;
L.length++;
L.data[4] = 6;
L.length++;
printf("打印插入前元素列表:\n");
PrintList(L);
p = 3;
e = 3;
//在 第3 个位置插入3 ,即在数组下标为2的位置插入3
ListInsert(L,p,e);
// ListInsert(L,7,3);//测试插入不合法数据
printf("打印在第%d个位置插入%d后元素列表:\n",p,e);
PrintList(L);
e = -1;//接收删除的元素
p = 2;
if(ListDelete(L,p,e))
{
printf("已删除第%d个元素%d\n",p,e);
printf("打印删除后元素列表:\n");
PrintList(L);
}
else
{
printf("第%d个元素删除失败\n",p);
}
p = 5;
e = GetElem(L,5);
if( e!= -1)
{
printf("查找到第%d个元素:%d\n",p,e);
}
else
{
printf("查找第%d个元素失败\n",p);
}
e = 5;
p = LocateElem(L,e);
if(p != 0) {
printf("值为%d的元素为第%d个\n",e,p);
} else {
printf("值为%d的元素未找到\n",e);
}
if(Empty(L)) {
printf("是空表\n");
} else {
printf("不是空表,长度为%d\n",Length(L));
PrintList(L);
}
DestroyList(L);
if(Empty(L)) {
printf("是空表\n");
} else {
printf("不是空表,长度为%d\n",Length(L));
PrintList(L);
}
}
数据结构复习:(定长)顺序表的实现
于 2022-07-28 10:21:26 首次发布