以顺序存储结构实现线性表的就地逆置。
注:线性表的就地逆置就是在原表的存储空间内将线性表(a1,a2,a3,…,an)逆置为(an,an-1,…,a2,a1)。
基本要求及提示
(1)从键盘输入数据,建立顺序表。
(2)实现顺序表逆置。
(3)输出顺序表中所有结点值,观察输出结果。
(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define scanf_s scanf
#define ERROR 0
#define OK 1
#define FALSE -1
#define TRUE 1
#define MAX 100 //顺序表的最大长度
typedef struct {
int data[MAX];
int last; //记录最后一个元素的在data中的下标值。
} LIST;
int menu_select(); //菜单驱动程序
void Inverse(LIST *list);
int menu_select() //菜单驱动程序
{
int sn;
printf("顺序表的逆置\n"); //显示菜单
printf("==============================\n");
printf("1、顺序表的建立\n");
printf("2、顺序表的逆置结果\n");
printf("0、退出\n");
printf("==============================\n");
printf("请选择0--2:");
for (;;) //菜单功能选择
{
scanf_s("%d", &sn);
getchar();
fflush(stdin);
if (sn < 0 || sn > 2)
printf("\n\t输入选择错误,请重新选择 0--2:");
else
break;
}
return sn;
}
/*
TODO: 将list中的元素进行逆序。
参数说明:list是线性表
比如:list中原来data数组是{1,2,3,4,5},进行逆序后,list中data变为{5,4,3,2,1}
*/
void Inverse(LIST *list)
{
int n;
for(int i=0;i<(list->last+1)/2;i++)
{
n=list->data[i];
list->data[i]=list->data[list->last-i];
list->data[list->last-i]=n;
}
}
void main() {
LIST list;
int i, n;
list.last = -1;
for (;;) // 无限循环,选择0 退出
{
switch (menu_select()) // 调用菜单函数,按返回值选择功能函数
{
case 1:
list.last = -1;
printf("建立并输入顺序表:\n");
printf("请输入个数:");
scanf_s("%d", &n);
printf("请输入数据:");
for (i = 0; i < n; i++) {
scanf_s("%d", &list.data[i]);
list.last++;
}
break;
case 2:
Inverse(&list);
printf("逆置的结果是:\n");
for (i = 0; i < n; i++) {
printf("%d ", list.data[i]);
}
printf("\n");
break;
case 0:
printf("再见!\n"); //退出系统
return;
} // switch语句结束
} // for循环结束
} // main()函数结束