1.(80%)完成顺序表的基本运算:初始化、显示、求长度、判空、判满、插入、删除、取元素等,并编写主函数测试算法。
2.(90%)设计算法:将一个元素插入到有序的顺序表中,使顺序表仍有序,并编写主函数测试算法。
3.(100%)设A和B两个顺序表,其元素按从小到大的顺序排列。编写一个A和B中所有元素组成一个新的从小到大的有序顺序表C的算法,并编写主函数测试算法。
提示:(1)算法:有序表合并。
(2)有序表的产生,可以人为输入,也可以调用内容2的算法实现。
//包含实验三个实验内容,part 1,2,3
#include
#include
#include //采用非阻塞式输入,方便选项跳转
#include //用于产生随机数模拟有序数列
#define MAXSIZE 1000 //设置最大数列大小
typedef int elemtype; //定义元素类型
typedef struct //定义结构体数列
{
elemtype data[MAXSIZE];
int last;
} datalist;
//函数声明区
//-----------------------------------------------------------------------
//第一部分
int part1(void);
//选择菜单
char choiceitem();
//初始化数列
datalist * defaultlist(void);
//追加元素到列表
int addinfo(datalist * pl,int times);
//从列表删除元素
int deleteinfo(datalist * pl,int space);
//检查列表是否为空,空返回1否则0
int ifempty(datalist * pl);
//检查列表是否已满,满返回1否则0
int iffull(datalist * pl);
//改变元素的值
int changeinfo(datalist * pl,int space,int change);
//输出列表
void outputlist(datalist * pl);
//返回列表长度
int lenthlist(datalist * pl);
//插入元素到列表
int insertinfo(datalist * pl,int space,int num);
//清空列表
void deletelist(datalist * pl);
//-----------------------------------------------------------------------
//第二部分
int part2(void);
//产生一个随机有序数列
void rulenummade(datalist * pl);
//计算插入值应该插入的位置
int findspace(datalist * pl,int num);
//-----------------------------------------------------------------------
//第三部分
int part3(void);
//顺序表合并到新表
datalist * doublerulelistcontact(datalist * pc,datalist * pa,datalist * pb);
int main(void)
{
system("color f0");
system("title Main 功能选择 dev: Ice2Faith");
char sel;
do //直到用户需要退出程序退出循环结束程序
{
printf("\twelcome here\n\n");
printf("\t算法与数据结构 顺序表\n\n");//功能提示输出和获取进去功能版块
printf("---------------------------------\n");
printf("请选择功能:\n");
printf("\t1.第一部分\n");
printf("\t2.第二部分\n");
printf("\t3.第三部分\n");
printf("\t0.退出程序\n/> ");
do //直到获取到正确的选项值退出循环
sel=getch();
while(sel<'0'||sel>'3');
system("cls"); //清屏进入功能版块
switch(sel)
{
case '1':
part1();
break;
case '2':
part2();
break;
case '3':
part3();
break;
case '0':
break;
}
}while(sel!='0');
return 0;
}
//第一部分
int part1(void)
{
system("title Part 1 常规顺序表操作 dev: Ice2Faith");
datalist * pl=defaultlist(); //初始化数列
char chioce;
do //直到用户需要退出该循环为止退出循环
{
chioce=choiceitem(); //调用选择方法获得选择项的值
switch(chioce) //进入选择项跳转
{
case '1':
outputlist(pl); //输出数列
break;
case '2':
{
int times; //追加数列
fflush(stdin);
printf("请问您需要添加几个元素:\n/> ");
scanf("%d",×);
printf("请输入 %d 个元素:\n/> ",times);
if(addinfo(pl,times)==-1)
printf("操作失败,元素个数将会超出\n\n");
break;
}
case '3':
{
int space; //删除元素
fflush(stdin);
printf("您想删除第几个元素:\n/> ");
scanf("%d",&space);
if(deleteinfo(pl,space)==-1)
printf("操作失败,该位置不合法\n\n");
break;
}
case '4':
{
int space1,change; //改变元素的值
fflush(stdin);
printf("您要改变第几个元素:\n/> ");
scanf("%d",&space1);
fflush(stdin);
printf("要将它改变为多少:\n/> ");
scanf("%d",&change);
if(changeinfo(pl,space1,change)==-1)
printf("操作失败,该位置不合法\n\n");
break;
}
case '5':
{
int space2,num; //插入元素
fflush(stdin);
printf("您想插入到第几个位置:\n/> ");
scanf("%d",&space2);
fflush(stdin);
printf("请输入您要插入的值:\n/> ");
scanf("%d",&num);
if(insertinfo(pl,space2,num)==-1)
printf("操作失败,该位置不合法\n\n");
break;
}
case '6':
deletelist(pl); //清空数列
break;
case '7':
system("cls"); //清屏
break;
case '8':
system("mode con cols=55 lines=40"); //设置合适窗口大小
break;
}
if(chioce=='0') //退出版块提示
printf("您这样做将会失去我!\n");
if(chioce!='7'&&chioce!='8') //控制下一选项前的暂停
{
printf("\n");
system("pause");
}
}while(chioce!='0');
free(pl); //释放pl空间
system("cls");
return 0;
}
//选择菜单
char choiceitem()
{
char choice;
printf("\twelcome here\n\n"); //输出选择项和说明
printf("请选择:\n\n");
printf("---------------------------------\n");
printf("\t1.查看顺序表\n");
printf("\t2.添加元素\n");
printf("\t3.删除元素\n");
printf("\t4.改变元素\n");
printf("\t5.插入元素\n");
printf("\t6.清空顺序表\n");
printf("\t7.清屏\n");
printf("\t8.调整窗口到建议大小\n");
printf("\t0.退出本部分\n\n");
printf("---------------------------------\n/> ");
do //获取选择项,直到选择项合法为止并输出选择项
{
choice=getch();
}
while(choice<'0'||choice>'8');
printf("%c\n",choice);
return choice;
}
//初始化数列
datalist * defaultlist(void)
{
datalist * pl;
pl=(datalist *)malloc(sizeof(datalist)); //申请并初始化一个datalist型空间且返回空间地址
pl->last=0;
return pl;
}
//追加元素到列表
int addinfo(datalist * pl,int times)
{
//check whether more than maxsize
if(pl->last+times>MAXSIZE-1) //检测追加元素会不会溢出,不会则进行添加操作,长度增加
return -1;
for(int i=0;i<times;i++)
{
scanf("%d",&(pl->data[pl->last+i]));
}
pl->last+=times;
return 1;
}
//从列表删除元素
int deleteinfo(datalist * pl,int space)
{
space-=1;
if(space<0 ||space>=pl->last) //检查删除元素是否合法,合法则进行移位覆盖删除,长度-1
return -1;
for(int i=space;i<=pl->last;i++)
pl->data[i]=pl->data[i+1];
pl->last--;
return 1;
}
//检查列表是否为空,空返回1否则0
int ifempty(datalist * pl)
{
return pl->last==0?1:0; //检查数列是否为空,空则返回1否则返回0
}
//检查列表是否已满,满返回1否则0
int iffull(datalist * pl)
{
return pl->last==MAXSIZE-1?1:0; //检查数列是否已满,满则返回1否则返回0
}
//改变元素的值
int changeinfo(datalist * pl,int space,int change)
{
space-=1;
if(space<0 ||space>pl->last-1) //如果改变值部分合法则进行修改
return -1;
pl->data[space]=change;
return 1;
}
//输出列表
void outputlist(datalist * pl)
{
printf(">>> \t");
if(pl->last==0) //判断长度是否为空,并提示
printf("此处为空,请添加!!");
for(int i=0;i<pl->last;i++) //格式化输出数列并换行
printf("[%d]\t",pl->data[i]);
printf("\n");
}
//返回列表长度
int lenthlist(datalist * pl)
{
return pl->last; //返回数列长度
}
//插入元素到列表
int insertinfo(datalist * pl,int space,int num)
{
space-=1;
if(space<0 ||space>pl->last) //检查插入位置是否合法
return -1;
for(int i=pl->last;i>space;i--) //将插入位置以后的数列向后移动一位
pl->data[i]=pl->data[i-1];
pl->data[space]=num; //插入需要插入的值,数列长度+1
pl->last++;
return 1;
}
//清空列表
void deletelist(datalist * pl)
{
pl->last=0; //重置数列长度
}
//-----------------------------------------------------------------------
//第二部分
int part2(void)
{
system("title Part 2 插入元素到有序顺序表 dev: Ice2Faith");
datalist * pl; //为pl数列申请空间做初始化
pl=defaultlist();
char con='c';
rulenummade(pl); //调用方法得到一个有序数列
do //直到用户需要退出(输入q)该部分
{
printf("已为您准备好一切,开始:\n\n");
printf("---------------------------------\n");
printf("这是您的默认有序列表\n\n"); //输出初始有序数列
outputlist(pl);
printf("---------------------------------\n");
printf("请输入需要插入的值:\n/> "); //获得用户需要插入的值并进行调用方法插入
int num;
fflush(stdin);
scanf("%d",&num);
insertinfo(pl,findspace(pl,num),num);
printf("这是您插入值之后的结果\n\n");
outputlist(pl);
printf("---------------------------------\n");
printf("如果您想退出第二部分, 请输入 \'Q\',否则继续:\n/> "); //获得用户是否需要退出该部分
fflush(stdin);
con=getch();
if(con!='Q'||con!='q')
system("cls");
}while(con!='Q'&&con!='q');
free(pl);
return 0;
}
//产生一个随机有序数列
void rulenummade(datalist * pl)
{
srand((unsigned)time+rand());
int lenth=rand()%300+10; //决定所产生的随机有序数列的元素个数
int before=rand()%20+1; //决定初始随机数大小及后面进行迭代存储
for(int i=0;i<=lenth;i++) //循环lenth次,传入一个有序数列,每个元素在之前元素基础上随机加一个整数
{
srand((unsigned)time+rand());
pl->data[i]=before;
before+=rand()%8;
}
pl->last=lenth+1; //记录数列长度
}
//计算插入值应该插入的位置
int findspace(datalist * pl,int num)
{
int i=0; //遍历找到应该插入的位置
while(num>pl->data[i]&&i<pl->last)
i++;
return i>pl->last?pl->last:++i; //如果遍历结束还没有找到位置,则应插入到最后位置,否则返回找到的位置
}
//-----------------------------------------------------------------------
//第三部分
int part3(void)
{
system("title Part 3 两个有序数列的整合合并 dev: Ice2Faith");
datalist * pl; //申请并初始化两个数列pl,pk
pl=defaultlist();
datalist * pk;
pk=defaultlist();
datalist * pc;
pc=defaultlist();
char con='c';
do //用户不退出则继续循环
{
rulenummade(pl); //调用方法产生两个随机有序数列
rulenummade(pk);
printf("已为您准备好一切,开始:\n\n");
printf("---------------------------------\n");
printf("您的默认有序数列:\n\n"); //输出初始的随机有序数列
outputlist(pl);
printf("---------------------------------\n");
outputlist(pk);
printf("---------------------------------\n");
printf("请继续,即将开始合并:\n");
system("pause");
printf("合并之后的有序数列:\n\n"); //输出合并后的有序数列一pl
outputlist(doublerulelistcontact(pc,pl,pk)); //调用合并方法合并数列到pc返回给输出函数输出结果
printf("---------------------------------\n");
printf("如果您想退出第三部分, 请输入 \'Q\',否则继续:\n/> "); //提示用户选择是否退出第三部分,输入‘q'退出
fflush(stdin);
con=getch();
if(con!='Q'||con!='q')
system("cls");
}while(con!='Q'&&con!='q');
free(pl); //释放pl,pk的空间
free(pk);
free(pc);
return 0;
}
//顺序表合并到新表
datalist * doublerulelistcontact(datalist * pc,datalist * pa,datalist * pb)
{
int i,j,k;
i=0;
j=0;
k=0;
while(pa->last>i && pb->last>j) //循环到两数列其中一个结束并排序到存储数列中
{
if(pa->data[i]<pb->data[j])
pc->data[k++]=pa->data[i++];
else
pc->data[k++]=pb->data[j++];
}
while(pa->last>i) //两个循环将剩下一个未结束的数列复制到存储数列中
pc->data[k++]=pa->data[i++];
while(pb->last>j)
pc->data[k++]=pb->data[j++];
pc->last=pa->last+pb->last; //更改存储数列的长度
return pc; //返回结果数列
}