#include<stdio.h> //头文件,输入输出操作主要使用
#include<stdlib.h> //头文件,包含本程序中的malloc,free system函数
#define MAXSIZE 10 //宏定义,定义常量MaxSize
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType; //定义类型ElemType,本例中使用的数据元素类型为int型
//顺序表类型SqList的定义
typedef struct List
{
ElemType *elem; //存放顺序表的元素
int length; //顺序表的实际长度
}SqList;
InitList(SqList &L)
{
L.elem=(ElemType *)malloc(MAXSIZE * sizeof(ElemType)); //为顺序表分配空间
if(!L.elem) exit(OVERFLOW); //存储分配失败
L.length=0; //空表长度为0
return OK;
}
void DestroyList(SqList &L)
{
if (L.elem) free(L.elem);
}
int ListEmpty(SqList L)
{
if(L.length==0)
return 1;
else
return 0;
}
int ListLength(SqList L)
{
return L.length;
}
int GetElem(SqList L,int i,ElemType &e)
{
if (i<1 || i>L.length) //无效的i值返回0
return ERROR;
else
{
e=L.elem[i-1]; //取元素值并返回1
return OK;
}
}
void DisplayList(SqList L)
{
if(L.length==0)
return;
else
{
for(int i=0;i<L.length;i++)
printf("%d ",L.elem[i]);
printf("\n");
}
}
int LocateElem(SqList &L,ElemType e)
{
int i;
for (i=0;i< L.length;i++)
if (L.elem[i]==e) return i+1;
return 0;
}
int ListInsert(SqList &L,ElemType e,int i)
{
int j;
if(i<1 || i>L.length+1) return ERROR; //i值不合法
if(L.length==MAXSIZE) return ERROR; //当前存储空间已满
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(SqList &L,int i,ElemType &e)
{
int j;
if((i<1)||(i>L.length)) return ERROR; //i值不合法
e=L.elem[i-1];
for (j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1
return OK;
}
//逆置
void ReverseList(SqList &L){
int t;
for(int i = 0; i < L.length/2; i++){
t = L.elem[i];
L.elem[i] = L.elem[L.length-1-i];
L.elem[L.length-1-i] = t;
}
}
void menu() //菜单函数,显示实验中的主菜单
{
printf("----------顺序表的定义和基本操作----------\n");
printf("- 1 初始化顺序表 -\n");
printf("- 2 销毁顺序表 -\n");
printf("- 3 判断表是否为空 -\n");
printf("- 4 求表长 -\n");
printf("- 5 输出顺序表内容 -\n");
printf("- 6 按位置取值 -\n");
printf("- 7 按值查找 -\n");
printf("- 8 插入数据元素 -\n");
printf("- 9 删除数据元素 -\n");
printf("- 10 顺序表的逆置 -\n");
printf("- 0 退出 -\n");
printf("请输入菜单对应的数字:");
}
int main() //主函数
{
SqList L; //实参:顺序表L的指针
ElemType e; //实参:用来接收或上传顺序表元素的值
int i,k; //实参:i用来接收或提交顺序表元素的位置,k是菜单选择编号
for(;;)
{
menu(); //调用菜单函数
scanf("%d",&k);
switch(k)
{
case 1: InitList(L);
printf("顺序表L已初始化,当前表长为%d。\n",ListLength(L));
system("pause"); //系统函数,暂停界面,显示结果,按任意键继续
system("cls"); //系统函数,清除屏幕上的运行结果和上一次输出的菜单
break;
case 2: DestroyList(L);
printf("顺序表L已销毁。\n");
system("pause");
system("cls");
break;
case 3: if(ListEmpty(L))
printf("当前顺序表为空。\n");
else
printf("当前顺序表非空。\n");
system("pause");
system("cls");
break;
case 4: printf("当前顺序表表长为:%d\n",ListLength(L));
system("pause");
system("cls");
break;
case 5: printf("当前顺序表中的数据为:");
DisplayList(L);
system("pause");
system("cls");
break;
case 6: printf("请输入查找位置1-%d:",ListLength(L));
scanf("%d",&i);
if(GetElem(L,i,e))
printf("%d位置上的数据是%d\n。",i,e);
else
printf("没有找到,请核实查找位置是否正确。\n");
system("pause");
system("cls");
break;
case 7: printf("请输入要查找的数据:");
scanf("%d",&e);
if(i=LocateElem(L,e))
printf("%d是顺序表中的第%d个数据。\n",e,i);
else
printf("%d不存在此顺序表中。\n",e);
system("pause");
system("cls");
break;
case 8: printf("请输入要插入的数据:");
scanf("%d",&e);
printf("请输入要插入的位置(1-%d):",ListLength(L)+1);
scanf("%d",&i);
if(ListInsert(L,e,i))
printf("插入成功!\n");
else
printf("插入失败,请核实插入位置。\n");
system("pause");
system("cls");
break;
case 9: printf("请输入要删除的数据位置(1-%d):",ListLength(L));
scanf("%d",&i);
if(ListDelete(L,i,e))
printf("删除成功!你删除的数据是:%d\n",e);
else
printf("删除失败,请核实插入位置。\n");
system("pause");
system("cls");
break;
case 10: DisplayList(L);
ReverseList(L);
printf("顺序表L的逆置\n");
DisplayList(L);
system("pause");
system("cls");
break;
case 0: return 0; //输入0的时候退出主
}
}
}
实现顺序表的逆置
最新推荐文章于 2024-10-05 18:40:57 发布