计算机软件基础实验1.docx
《计算机软件基础实验1.docx》由会员分享,可在线阅读,更多相关《计算机软件基础实验1.docx(18页珍藏版)》请在冰豆网上搜索。
计算机软件基础实验1
北京联合大学
实验报告
课程(项目)名称:
计算机软件技术基础实验一(顺序表)
学院:
自动化专业:
信息处理与智能技术
班级:
0910030204成绩:
学号:
*************姓名:
韩禹辉
2010年11月20 日
一.实验目的
(1)掌握线性表的概念。
(2)熟练掌握线性表的顺序存储结构。
(3)熟练掌握线性表在顺序存储结构上的运算。
(4)了解测试的思想。
二.实验内容
1.逆序元素——编写算法实现顺序表中元素的逆置。
要求按用户输入的数据建立一个顺序表。
在逆置的过程中使用最少的辅助存储单元。
2.删除多余元素——己知顺序表中的元素非递减有序排列,编写算法删除顺序表中值相同的多余的元素。
3.插入元素——编写算法,在非递减有序的顺序表中,插入一个给定的元素,插入后该顺序表仍然递增有序。
4.合并顺序表——有两个顺序表A(有m个元素)和B(有n个元素),其元素均按从小到大的升序排列。
编写算法,将这两个顺序表合并成一个顺序表C,要求C也是按从小到大的升序排列。
三.算法设计方案
1.
1)函数名:
InputSList1类型:
SList
2)入口参数:
无
3)出口参数:
L
4)功能:
初始化线性表
5)源程序清单:
structSListInitSList()
{
structSListL;
L.Last=-1;
returnL;
}
2.
1)函数名:
InputSList1类型:
SList
2)入口参数:
L
3)出口参数:
L
4)功能:
建立无序顺序表
5)设计思路:
定义顺序表结构体,从键盘输入数据给x,用指针指向顺序表的表尾元素,在表满之前,每输入一个新的不为一数据时,尾指针后移一位,直到输入的数据为负一或表满时完成建立。
6)流程图
7)源程序清单
structSListInputSList1(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)函数名:
InputSList类型:
SList
2)入口参数:
L
3)出口参数;L
4)功能:
向线性表中输入数据
5)设计思路:
创建空线性表,从键盘输入数据到线性表中,以-1结束,然后修改表长,输出线性表。
6)源程序清单
structSListInputSList(structSListL)
{
inti=0;
intnumber=0;
printf("\n请输入顺序表的初始化数据,以-1表示结束\n");
while(i<30)
{
scanf("%d",&number);
if(number==-1)
{
break;
}
L.Data[i]=number;
L.Last++;
i++;
}
for(intj=0;j<=L.Last;j++)
{
printf("%d",L.Data[j]);
}
returnL;
}
7)流程图:
4.
1)函数名:
outputSList类型:
SList
2)入口参数:
L
3)出口参数:
无
4)功能:
输出顺序表
5)设计思路:
定义指针j指向顺序表中下标为0处,当表不为空时,指针依次向后移动,每移动到一个数据所在的位置时将其输出,直到移动到表尾将所有数据输出后为止。
6)源程序清单
voidoutputSList(structSListL)
{intj;
printf("\n顺序表的数据为:
\n");
if(L.Last!
=-1)
for(j=0;j<=L.Last;j++)printf("%d",L.Data[j]);
elseprintf("顺序表为空!
\n");
printf("\n");
}
7)流程图:
5.
1)函数名:
reverse类型:
SList
2)入口参数:
*L
3)出口参数:
无
4)功能:
将顺序表中元素的逆置
5)设计思路:
定义两个指针变量i,j和结点t。
i指向下标为0处,j指向下标为L.length-1处,i++,j--,利用循环将i、j所指向的数据交换。
6)源程序清单
voidreverse(SList*L)
{inti,j;
datatypet;
for(i=0,j=L->length-1;i{t=L->data[i];L->data[i]=L->data[j];L->data[j]=t;}
}
7)流程图:
6.
1)函数名:
delete类型:
SList
2)入口参数:
L
3)出口参数;无
4)功能:
删除顺序表中值相同的多余的元素
5)设计思路:
i++,利用循环,将第i个元素后面的元素和此元素进行比较,若有和此元素想等的元素,利用a[k]=a[k+1]的思想将其删除。
6)流程图:
7)源程序清单:
voiddelete(structSListL)
{
inti=0,j=0,k=0;
for(i=0;i<=L.Last;i++)
{
for(j=i+1;j{
if(L.Data[i]==L.Data[j])
{
for(k=j;kL.Data[k]=L.Data[k+1];
L.Last--;
j--;
}
}
}
for(j=0;j<=L.Last;j++)
{
printf("%d",L.Data[j]);
}
}
7.
1)函数名:
insert类型:
SList
2)入口参数:
L,x
3)出口参数:
L
4)功能:
插入元素x到非递减有序的顺序表中
5)设计思路:
通过一个while循环查找适合x插入的位置,利用一个for循环将该位置后的所有数据后移一位给要插入的x留出位置,再将x放入该位置,最后修改表长。
6)源程序清单:
voidinsert(SList*L,intx)
{inti,k;
i=0;
while((ilength-1)&&(x>=L->data[i]))i++;
for(k=L->length-1;k>=i;k--)L->data[k+1]=L->data[k];
L->data[i]=x;
L->length++;
}
7)流程图:
8.
1)函数名:
unit类型:
SList
2)入口参数:
L,L2,L3
3)出口参数:
L3
4)功能:
将两个有序顺序表合并
5)设计思路:
6)源程序清单(程序应添加必要的注释)
voidunit(structSListL,structSListL1,structSListL2)
{
inti=0,j=0,k=0,m=0;
while(i<=L1.Last&&j<=L2.Last)
{
if(L1.Data[i]L.Data[k++]=L1.Data[i++];
else
L.Data[k++]=L2.Data[j++];
}
while(i<=L1.Last)
{
L.Data[k++]=L1.Data[i++];
}
while(j<=L2.Last)
{
L.Data[k++]=L2.Data[j++];
}
L.Last=k-1;
for(m=0;m<=L.Last;m++)
{
printf("%d",L.Data[m]);
}
printf("\n");
}
7)流程图:
四.调试过程
(1)编译出现的主要问题及解决方法
L->data[i]=t;L->data[i]=L->data[j];L->data[j]=t
t=L->data[i];L->data[i]=L->data[j];L->data[j]=t
for(i=0;i<=L1.length;i++)
for(i=0;i<=L1.length-1;i++)
L.Data[k+1]=L.Data[k];
L.Data[k]=L.Data[k+1];
scanf(%d,&data)
scanf("%d",&data)
(2)运行出现的主要问题及解决方法
五.运行结果分析
(1)运行结果
逆置:
删除多余元素:
插入:
合并:
(2)运行结果分析
逆置
测试项
输入参数
输出参数
存在问题
空表
无
无
无
表长=5(奇数)
12345
54321
无
表长=6(偶数)
123456
654321
无
删除相同元素
测试项
输入参数
输出参数
存在问题
空表
无
无
无
有1组相同元素
122345
12345
无
有2组相同元素
122334
1234
无
有3组相同元素
1122334
1234
无
插入
测试项
输入参数
输出参数
存在问题
空表
无
无
无
在表头插入
向34567中插入1
134567
无
在表尾插入
向25689中插入4
245689
无
在表中间插入
向34678中插入5
345678
无
合并
测试项
输入参数
输出参数
存在问题
1,2均为空
无
无
无
1空2不空
1:
无
2:
23456
23456
无
1,2均不空
1:
13579
2:
2468
123456789
无
六、体会
通过本次实验,收获了很多,使我对计算机软件技术有了更深的了解,在学习探索的过程中,更发现了许多自己的不足。
在编程过程中,遇到了很多的困难,因为C语言知识不是很扎实,导致这次实验不是很顺利,但是在老师和同学的帮助下,最后终于能及时的完成这次实验,谢谢老师和同学们的帮助!
仔细推敲之后,才发现这个实验并不是很难。
只要勇敢的面对它,就能克服一切困难。
通过这次实验,更深刻的理解并掌握了线性表的概念;熟练掌握线性表的顺序存储结构和线性表在顺序存储结构上的运算;了解测试的思想。