#include<stdio.h>
//顺序表类型定义(静态分配)
#define MaxSize 5 //定义顺序表的最大长度
typedef struct
{
int data[MaxSize]; //使用静态的数组存放数据元素,元素类型为整形,MaxSize*sizeof(int)
int length; //顺序表当前的长度,分配一个int字节的空间
}SqList; //Sq--sequence,顺序的意思
//因为定义了类型名为SqList,那么定义一个顺序表的时候就不需要使用struct,使用SqList即可
//对顺序表进行的基本操作
void InitList(SqList &L); //初始化一个顺序表,对length设置初值,构造空表
int GetLength(SqList L); //求表的长度
bool Empty(SqList L); //判空操作
void PrintList(SqList L); //输出顺序表
bool ListInsert(SqList &L,int i,int e); //按位序插入,在第i个位置上插入元素e,返回bool值方便别人判断是否插入成功,是否获取返回值,按具体情况而定
bool ListDelete(SqList &L,int i,int &e); //按位序删除
int GetElem(SqList L,int i); //按位序查找
int LocateElem(SqList L,int e); //按值查找
//由于没有使用动态分配内存的方式(malloc),所以并没有DestroyList(&L)函数,在程序结束后会自动销毁该数组
//基本方法(函数)的实现
//初始化一个顺序表,因为是直接对已经定义的表(原表)进行操作,所以是引用&
void InitList(SqList &L)
{
L.length=0; //初始的顺序表长度为0,构造一个空的顺序表
}
int GetLength(SqList L)
{
return L.length;
}
bool Empty(SqList L)
{
return(L.length==0);
}
void PrintList(SqList L) //这属于违规打印,比如只有第三个位置我插入了元素,其余位置仍然没有值,那么就是计算机本身内存空间存放的那个值了
{
//使用MaxSize会导致删除操作之后,输出的个数仍然为Maxsize,输出的数据可能就是之前存放的数据了;
for(int i=0;i<L.length;i++) //L.length其实也不合法,因为比如上面插入一个元素在第三个位置,我打印出来的是第一个位置的值
printf("%d ",L.data[i]);
printf("\n");
}
bool ListInsert(SqList &L,int i,int e) //第i个位置(包括第i个)开始,所有元素后移一位
{
if(i<0||i>L.length+1) //判断位序值是否合法
return false;
if(L.length>=MaxSize) //判断顺序表是否满了
return false;
for(int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1]; //注意数组下标为i-1,位序为i
L.data[i-1]=e;
L.length++; //插入一个元素后,顺序表的当前长度加一,注意不是分配的空间加一
return true;
}
bool ListDelete(SqList &L,int i,int &e)
{
if(i<0||i>L.length)
return false;
if(L.length==0)
return false;
e=L.data[i-1]; //先将即将删除的元素返回
for(int j=i;j<L.length;j++) //将第i个位置后的元素前移
L.data[j-1]=L.data[j];
L.length--;
return true;
}
int GetElem(SqList L,int i)
{
return L.data[i-1];
}
int LocateElem(SqList L,int e)
{
for(int i=0;i<L.length;i++)
{
if(L.data[i]==e)
return i+1;
}
}
void main()
{
SqList L; //定义一个顺序表
InitList(L);
for(int i=0;i<MaxSize;i++)
ListInsert(L,i+1,i);
if(Empty(L)==false)
printf("该顺序表不是空表\n");
else
printf("该顺序表是空表\n");
int e=-1;
if(ListDelete(L,2,e))
{
printf("已经删除第2个元素,删除的元素值=%d\n",e);
}
else
printf("位序不合法或者顺序表为空,删除失败\n");
printf("顺序表的长度=%d\n",GetLength(L));
PrintList(L);
printf("第3个元素的值=%d\n",GetElem(L,3));
printf("元素值为2的数其位序为:%d\n",LocateElem(L,2));
}
顺序表的实现静态分配
最新推荐文章于 2024-01-19 16:50:13 发布