完成顺序表的基本运算:初始化、显示、求长度、判空、判满、插入、删除、按位置取元素、按值查找
//完成顺序表的基本运算:初始化、显示、求长度、判空、判满、插入、删除、按位置取元素、按值查找等,并编写主函数测试算法。
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 10 //定义存储空间的分配量
#define OVERFLOW 0
#define ERROR 0
#define OK 1
//定义类型
typedef struct
{
int *elem; //存储空间基址
int length; //存储空间长度
}SqList;
int InitList_Sq(SqList &L);
void CreateList(SqList &L);
void PrintList(SqList &L);
int GetLength(SqList L);
int IsEmpty(SqList L);
int IsFull(SqList L);
int ListDelete_Sq(SqList &L,int i);
int ListInsert_Sq(SqList &L,int i ,int e);
int GetElem(SqList L,int i);
int LocateELem(SqList L,int e);
int main()
{
//初始化顺序表
SqList L;
if(InitList_Sq(L)){
printf("\n线性表Sqlist初始化成功...\n\n");
}
else
{
printf("\n线性表Sqlist初始化失败...\n\n");
}
printf("-----------------------------------------------------------\n");
//创建顺序表
CreateList(L);
//显示顺序表
PrintList(L);
printf("-----------------------------------------------------------\n");
//求顺序表长度
printf("线性表长度是:%d\n\n",GetLength(L));
printf("-----------------------------------------------------------\n");
//顺序表的判空
if(IsEmpty(L))
{
printf("线性表为空...\n\n");
}
else{
printf("线性表不为空...\n\n");
}
printf("-----------------------------------------------------------\n");
//顺序表的判满
if(IsFull(L))
{
printf("线性表已满...\n\n");
}
else{
printf("线性表未满...\n\n");
}
printf("-----------------------------------------------------------\n");
//顺序表的插入
int i=0,e=0;
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入要插入的元素:");
scanf("%d",&e);
if(ListInsert_Sq(L,i ,e))
{
printf("线性表插入成功...\n\n");
PrintList(L);
}
else{
printf("线性表未插入成功,要插入的位置可能不合法或者存储空间已满...\n\n");
}
printf("-----------------------------------------------------------\n");
//顺序表的删除
printf("请输入要删除的位置:");
int n=0;
scanf("%d",&n);
if(ListDelete_Sq(L,n))
{
printf("线性表删除成功...\n\n");
PrintList(L);
}
else{
printf("线性表未删除成功,要删除的位置可能不合法...\n\n");
}
printf("-----------------------------------------------------------\n");
//顺序表的取值(按位置查找)
printf("请输入要查找的位置(按位置查找):");
int m=0;
scanf("%d",&m);
if(GetElem(L,m))
{
printf("线性表查找成功...\n\n");
}
else{
printf("线性表未查找成功,要查找的位置可能不合法...\n\n");
}
printf("-----------------------------------------------------------\n");
//顺序表的取值(按值查找)
printf("请输入要查找的元素(按值查找):");
int y=0;
scanf("%d",&y);
if(LocateELem(L,y))
{
printf("线性表查找成功,查找到的元素的位置是%d...\n\n",LocateELem(L,y));
}
else{
printf("线性表未查找成功,要查找的元素可能不存在...\n\n");
}
return 0;
}
//初始化顺序表
int InitList_Sq(SqList &L) //构造一个空的顺序表L
{
L.elem =(int *)malloc(sizeof(int)*MAXSIZE);; //为顺序表分配空间
if(!L.elem){ //如果存储分配失败
exit(OVERFLOW);
}
L.length=0; //空表长度为0
return OK;
}
//创建顺序表
void CreateList(SqList &L)
{
int arr[9]={1,2,3,4,5,6,7,8,9};
int i=0; //将数组里面的值通过循环赋值给顺序表
for(i=0;i<9;i++)
{
L.elem[i]=arr[i];
L.length++;
}
}
//显示顺序表
void PrintList(SqList &L)
{
int i;
printf("\n顺序表中的元素为:\n");
for(i=0;i<L.length;i++) //通过循环将线性表里面的元素取出来
{
printf("%d ",L.elem[i]);
}
printf("\n\n");
}
//求顺序表长度
int GetLength(SqList L)
{
return (L.length); //返回线性表的长度
}
//顺序表的判空
int IsEmpty(SqList L)
{
if (L.length==0) //判断是否长度为0
{
return 1; //长度为0返回1
}
else return 0; //长度不为0返回0
}
//顺序表的判满
int IsFull(SqList L)
{
if (L.length==MAXSIZE) //判断是否长度是否等于存储空间的分配量
{
return 1;
}
else return 0;
}
//顺序表的插入
int ListInsert_Sq(SqList &L,int i ,int e)
{
if(i<1 || i>L.length+1)
{
return ERROR; //判断i值是否合法
}
if(L.length==MAXSIZE)
{
return ERROR; //判断当前存储空间是否已满
}
int j=0;
for(j=L.length-1;j>=i-1;j--){
L.elem[j+1]=L.elem[j]; //插入位置及之后的元素后移
}
L.elem[i-1]=e; //将新元素e放入第i个位置
++L.length; //表长增1
return OK;
}
//顺序表的删除
int ListDelete_Sq(SqList &L,int i)
{
if((i<1)||(i>L.length)) //判断i值是否合法
{
return ERROR;
}
int j=0;
for(j=i;j<=L.length-1;j++)
{
L.elem[j-1]=L.elem[j]; //要删除元素之后的元素前移
}
--L.length; //表长减1
return OK;
}
//顺序表的取值(按位置查找)
int GetElem(SqList L,int i)
{
int e;
if (i<1||i>L.length) //判断i值是否合理,若不合理,返回ERROR
{
return ERROR;
}
e=L.elem[i-1]; //第i-1的单元存储着第i个数据
printf("查找到的元素是:%d\n",e);
return OK;
}
//顺序表的取值(按值查找)
int LocateELem(SqList L,int e)
{
int i=0;
for (i=0;i<L.length;i++) //使用循环将顺序表里面的值一个一个取出来
{
if (L.elem[i]==e) //判断是否与要查找的值相同
{
return i+1; //相同则返回
}
}
return ERROR; //没有找到对应的要查找的值,返回ERROR
}