计算机软件技术基础实验一顺序表.docx
《计算机软件技术基础实验一顺序表.docx》由会员分享,可在线阅读,更多相关《计算机软件技术基础实验一顺序表.docx(15页珍藏版)》请在冰豆网上搜索。
![计算机软件技术基础实验一顺序表.docx](https://file1.bdocx.com/fileroot1/2022-11/27/67d8e83c-5900-459f-b762-ecea1c79dd9f/67d8e83c-5900-459f-b762-ecea1c79dd9f1.gif)
计算机软件技术基础实验一顺序表
北京联合大学
实验报告
课程(项目)名称:
计算机软件技术基础实验一(顺序表)
学院:
自动化专业:
信息处理与智能技术
班级:
0910030206成绩:
学号:
2009100302638姓名:
徐琪
学号:
2009100302632姓名:
李京
2010年11月30日
一.目的:
(1).掌握线性表的概念.
(2).熟练掌握线性表的顺序存储结构.
(3).熟练掌握线性表在顺序存储结构上的运算.(4).了解测试的思想.
二.内容:
(1).编写算法实现顺序表中元素的逆置。
要求按用户输入的数据建立一个顺序表。
在逆置的过程中使用最少的辅助存储单元。
测试要求:
在空表、长度为奇数和偶数的情况下测试程序运行情况。
(2).己知顺序表中的元素非递减有序排列,编写算法删除顺序表中值相同的多余的元素。
测试要求:
在空表、有1组相同元素、有2组连续相同元素、有2组以上不连续相同元素的情况下测试程序运行情况。
(3).编写算法,在非递减有序的顺序表中,插入一个给定的元素,插入后该顺序表仍然递增有序。
测试要求:
在空表、表头、表尾、表中间插入及位置非法的情况下测试程序运行情况。
(4).有两个顺序表A(有m个元素)和B(有n个元素),其元素均按从小到大的升序排列。
编写算法,将这两个顺序表合并成一个顺序表C,要求C也是按从小到大的升序排列。
测试要求:
在A与B均空、A与B一个为空、A与B均不空的情况下测试程序运行情况。
三.算法设计
1.数据结构
#include
#include
#include
#defineMAXSIZE30
structSList
{intData[MAXSIZE];
intLast;
}SList;
2.函数设计
(1).函数名称:
初始化
①.名字:
InitSList
②.功能:
初始化线性表
③.入口参数:
L
④.出口参数:
L
⑤.N-S图
⑥.源程序清单
/*初始化线性表*/
structSListInitSList()
{structSListL;
L.Last=-1;
returnL;
}
/*初始化线性表1*/
structSListInitSList1()
{structSListL1;
L1.Last=-1;
returnL1;
}
/*初始化线性表2*/
structSListInitSList2()
{structSListL2;
L2.Last=-1;
returnL2;
}
/*初始化线性表3*/
structSListInitSList3()
{structSListL3;
L3.Last=-1;
returnL3;
}
(2).函数名称:
建立
①.名字:
InputSList
②.功能:
建立无序线性表
③.入口参数:
L
④.出口参数:
L
⑤.N-S图
⑥.源程序清单
structSListInputSList(structSListL)
{intx=0;
printf("\n请输入数据,结束输入-1!
\n");
scanf("%d",&x);
while(x!
=-1)
{L.Data[++L.Last]=x;
if(L.Last==MAXSIZE-1)
{printf("\n顺序表已满!
\n");
break;
}
scanf("%d",&x);
}
returnL;
}
(3).函数名称:
建立1
①.名字:
InputSList1
②.功能:
建立有序线性表L1
③.入口参数:
L1,x
④.出口参数:
L1
⑤.N-S图
⑥.源程序清单
/*建立有序线性表1*/
structSListInputSList1(structSListL1)
{intx=0;
printf("\n请按从小到大顺序输入数据,结束输入-1!
\n");
scanf("%d",&x);
while(x!
=-1)
{if(L1.Last==-1)
L1.Data[++L1.Last]=x;
elseif(L1.Data[L1.Last]<=x)
L1.Data[++L1.Last]=x;
else
printf("\n请按从小到大顺序输入数据!
\n");
if(L1.Last==MAXSIZE-1)
{printf("\n顺序表已满!
\n");
break;
}
scanf("%d",&x);
}
returnL1;
}
/*建立有序线性表2*/
structSListInputSList2(structSListL2)
{intx=0;
printf("\n请按从小到大顺序输入数据,结束输入-1!
\n");
scanf("%d",&x);
while(x!
=-1)
{if(L2.Last==-1)
L2.Data[++L2.Last]=x;
elseif(L2.Data[L2.Last]<=x)
L2.Data[++L2.Last]=x;
else
printf("\n请按从小到大顺序输入数据!
\n");
if(L2.Last==MAXSIZE-1)
{printf("\n顺序表已满!
\n");
break;
}
scanf("%d",&x);
}
returnL2;
}
(4).函数名称:
输出
①.名字:
outputSList
②.功能:
输出顺序线性表数据L1
③.入口参数:
L1
④.出口参数:
L1
⑤.N-S图
⑥.源程序清单
/*输出顺序线性表1数据*/
voidoutputSList(structSListL1)
{intj;
printf("\n顺序表的数据为:
\n");
if(L1.Last!
=-1)
for(j=0;j<=L1.Last;j++)printf("%d",L1.Data[j]);
elseprintf("顺序表为空!
\n");
printf("\n");
}
/*输出顺序线性表2数据*/
voidoutputSList2(structSListL2)
{intj;
printf("\n顺序表2的数据为:
\n");
if(L2.Last!
=-1)
for(j=0;j<=L2.Last;j++)printf("%d",L2.Data[j]);
elseprintf("顺序表为空!
\n");
printf("\n");
}
(5).函数名称:
插入
①.名字:
InsertSList1
②.功能:
向有序顺序线性表L1中插入数据x
③.入口参数:
L1,x
④.出口参数:
L1
⑤.N-S图
⑥.源程序清单
structSListInsertSList1(structSListL1,intx)
{intj=0,i=0;
if(L1.Last==MAXSIZE-1)
{printf("theList1isfull\n");
returnL1;
}
while(L1.Data[i]=L1.Last+1)
{i++;}
for(j=L1.Last;j>=i;j--)
L1.Data[j+1]=L1.Data[j];
L1.Data[i]=x;
L1.Last++;
returnL1;
}
(6).函数名称:
逆置
①.名字:
nizhi
②.功能:
将顺序表L1中的元素逆置
③.入口参数:
L1
④.出口参数:
L1
⑤.N-S图
⑥.源程序清单
structSListnizhi(structSListL1)
{inti=0,j=L1.Last,k=0;
if(L1.Last<1)
return(L1);
while(i{k=L1.Data[i];
L1.Data[i]=L1.Data[j];
L1.Data[j]=k;
i++;j--;
}
returnL1;
}
(7).函数名称:
删除
①.名字:
shanchu
②.功能:
删除有序顺序表L1中值相同的多余的元素
③.入口参数:
L1
④.出口参数:
L1
⑤.N-S图
⑥.源程序清单
structSListshanchu(structSListL1)
{inti=0,j=0;
if(L1.Last<1)
returnL1;
while(i{if(L1.Data[i]==L1.Data[i+1])
{for(j=i+2;j<=L1.Last;j++)
L1.Data[j-1]=L1.Data[j];
L1.Last--;
}
elsei++;
}
returnL1;
}
(8).函数名称:
合并
①.名字:
hebing
②.功能:
合并有序顺序表1、2到有序顺序表3中
③.入口参数:
L1、L2、L3
④.出口参数:
L3
⑤.N-S图
⑥.源程序清单
structSListhebing(structSListL1,structSListL2,structSListL3)
{inti=0,j=0,k=0;
while(i<=L1.Last&&j<=L2.Last)
{if(L1.Data[i]{L3.Data[k]=L1.Data[i];
i++;k++;
}
else
{L3.Data[k]=L2.Data[j];
j++;k++;
}
}
while(i<=L1.Last)
{L3.Data[k]=L1.Data[i];
k++;i++;
}
while(j<=L2.Last)
{L3.Data[k]=L2.Data[j];
k++;j++;
}
L3.Last=k-1;
returnL3;
}
(9).函数名称:
主函数
①.名字:
main
②.功能:
③.入口参数:
无
④.出口参数:
无
⑤.N-S图
⑥.源程序清单
/*主菜单*/
voidmainmenu()
{
printf("|****************************************|\n");
printf("|请输入选项编号(0-7)|\n");
printf("|****************************************|\n");
printf("|1--建立有序顺序表1|\n");
printf("|2--在有序顺序表1中插入数据|\n");
printf("|3--将有序顺序表1中元素逆置|\n");
printf("|4--删除顺序表1中值相同的多余的元素|\n");
printf("|5--建立无序顺序表|\n");
printf("|6--建立有序顺序表2|\n");
printf("|7--合并有序顺序表1.2到顺序表3中|\n");
printf("|0--退出系统|\n");
printf("|****************************************|\n");
}
/*主函数*/
voidmain()
{structSListL;
structSListL1;
structSListL2;
structSListL3;
intx;
chari,choose;
do
{mainmenu();
choose=getch();
switch(choose)
{case'1':
L1=InitSList();//建立有序顺序表1
L1=InputSList1(L1);
outputSList(L1);
break;
case'2':
printf("请输入要插入的数据x:
");//向有序顺序线性表1中插入数据x
scanf("%d",&x);
L1=InsertSList1(L1,x);
printf("插入后");
outputSList(L1);
break;
case'3':
L1=nizhi(L1);//将有序顺序表1中元素逆置
printf("逆置后");
outputSList(L1);
break;
case'4':
L1=shanchu(L1);//删除顺序表1中值相同的多余的元素
printf("删除后");
outputSList(L1);
break;
case'5':
L=InitSList();//建立无序顺序表
L=InputSList(L);
printf("建立的无序顺序表为\n");
outputSList(L);
break;
case'6':
L2=InitSList2();//建立有序顺序表2
L2=InputSList2(L2);
outputSList(L2);
break;
case'7':
L3=InitSList3();//合并有序顺序表1.2
L3=hebing(L1,L2,L3);
printf("合并后的顺序表3为");
outputSList(L3);
break;
case'0':
exit(0);//返回主菜单
default:
printf("\n%c为非法选项!
请重新输入!
\n",choose);
break;
}
printf("\n按0返回主菜单\n");
i=getch();
}
while(i=='0');
}
四.调试过程
1.问题名称:
逆置出错
问题现象:
例如输入1234,逆置后为4231
解决方法:
将逆置源程序中的if(i2.问题名称:
逆置问题
问题现象:
逆置后无显示
解决方法:
将主函数中nizhi(L)改为nizhi(L1)
3.问题名称:
删除问题
问题现象:
例如有序顺序表1122,删除后为122
解决方法:
将if(i4.问题名称:
合并问题
问题现象:
errorC2018:
unknowncharacter'0xa3'
解决方法:
if后无分号
5.问题名称:
合并问题
问题现象:
合并时将无序顺序表与有序顺序表2合并
解决方法:
将无序顺序表和有序顺序表1重新命名
6.问题名称:
插入问题
问题现象:
例如在有序顺序表1234中插入字母f后,显示-8589934601234
解决方法:
未解决
五.运行结果分析
1.运行界面
建立有序顺序表1
在有序顺序表1中插入数据
将有序顺序表1中元素逆置
删除顺序表1中值相同的多余的元素
建立无序顺序表
建立有序顺序表2
合并有序顺序表1.2到顺序表3中
2.测试结果
(1).将有序顺序表1中元素逆置
测试项
原始数据
输入
输出
存在问题
空表
无
无
空
无
表长=5(奇数)
12345
无
54321
无
表长=6(偶数)
123456
无
654321
无
(2).删除顺序表1中值相同的多余的元素
测试项
原始数据
输入
输出
存在问题
空表
无
无
空
无
有1组相同元素
12234
无
1234
无
有2组连续相同元素
122334
无
1234
无
有2组以上不连续相同元素
11223344
无
1234
无
(3).向有序顺序线性表1中插入数据x
测试项
原始数据
输入
输出
存在问题
空表
无
2
2
无
表头
1234
1
11234
无
表尾
1234
4
12344
无
表中间
1234
3
12334
无
位置非法
1234
(4).合并有序顺序表1、2
测试项
原始数据
输入
输出
存在问题
1、2均为空表
无
无
空
无
1为空表,2非空
L2:
234
无
234
无
1非空,2为空表
L1:
123
无
123
无
1、2均非空
L1:
123
L2:
234
无
122334
无
六.小结
通过本次实验,我们对顺序表这部分知识有了更加深入的了解与掌握。
在程序编译过程中,我们碰到了很多问题,有时会出现几十个错误,但我们还是一步步认真检查,有时不会的地方询问班里的其他同学,一起讨论,最终完整无误的改正了所有问题。
有时也有很低级的错误出现,说明我们的基础还不够牢固,还需要努力学习。
可能我们的报告中还存在着某些问题,程序也不够尽善尽美,但这次实验让我们都学到了很多,团队的合作,相互的帮助,都是完成一项任务中必不可少的。
我们也将尽我们最大的努力完成今后的每一次实验。