北航计算机软件技术基础实验报告1线性表的插入与删除资料.docx
- 文档编号:27382799
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:23
- 大小:471.27KB
北航计算机软件技术基础实验报告1线性表的插入与删除资料.docx
《北航计算机软件技术基础实验报告1线性表的插入与删除资料.docx》由会员分享,可在线阅读,更多相关《北航计算机软件技术基础实验报告1线性表的插入与删除资料.docx(23页珍藏版)》请在冰豆网上搜索。
北航计算机软件技术基础实验报告1线性表的插入与删除资料
实验报告
实验名称
线性表的插入与删除
班级
学号
名
绩
实验概述:
【实验目的及要求】
1.实验目的
掌握线性表在顺序分配下的插入与删除运算;掌握线性表的链式存储结构;掌握
插入排序的方法;并掌握一种产生随机数的方法。
2.实验内容
产生1000个0至999间的随机整数,并以产生的次序存入一个数据文件中。
编制一个程序,依次实现以下功能:
定义一个有序(非递减)线性表,其最大容量为1000,初始时为空。
从由1产生的数据文件中依次取前N个随机整数,陆续插入到此线性表中,并要求在每次插入后保持线性表的有序性。
最后将此有序线性表打印输出。
在由
(2)产生的线性表中,依在1中产生的次序逐个将元素删除,直至表空为止。
以N=100及N=400分别运行2的程序,并比较它们的运行时间。
编写一个程序,用插入排序依次将1中产生的1000个随机整数链接成有序链表(不改变原随机数在存储空间中的顺序)。
3.实验步骤和要求
事先编制好实验内容中1、2、4的程序(可参考本实验中的方法说明),并调试通过。
运行1的程序,生成1000个0至999之间的随机整数的数据文件,并打印输出此数据文件。
以N=100运行2的程序,并记下运行时间。
以N=400运行2的程序,并记下运行时间。
运行4的程序。
整理程序清单和运行结果,写出实验报告。
【实验原理】
1•随机整数的产生
产生随机整数的方法有很多,下面只介绍一种方法:
设m=216,初值y0=0,则递推公式yi=mod(20530+13849,m)产生0至65535之间的随机整数。
如要产生0至999之间的随机整数,只需做运算xi=INT(1000yi/m)。
其中mod(*)是模运算,INT(*)是取整函数。
2.线性表的插入与删除
在本实验中线性表是动态增长的。
插入一个新元素后,为了使线性表仍保持有序,必须要找到新元素应插入的位置。
实际上这是一个插入排序的问题。
为了要将新元素插入到一个有序的线性表中,可以从原有序表的最后一个元素开始,往前逐个与新元素比较,并将大于新元素的所有元素都往后移动一个位置,直到找到新元素应插入的位置为止。
显然,插入一个新元素后,表的长度也增加了1。
现假设用一个数组L(1:
m)来存储线性表,其中m为最大容量(在本实验中为m=1000);用一个变量n表示线性表的长度(在本实验中,其初值为n=0)。
则可以得到将新元素插入到有序线性表的算法如下。
输入:
数组L(1:
m),有序线性表L(1:
n),需插入的新元素b。
其中*m。
输出:
插入b后的有序线性表L(1:
n)。
IFn=mTHENOUTPUT"overflow"
ELSE{
IFn=0THENL(n+1)b
ELSE{
in
WHILE(i>0)and(L(i)>b)DO{L(i+1)L(i);ii-1}
L(i1)b
}
nn1
}
RETURN
要在原线性表中删除一个元素b(在本实验中,保证b在线性表中),且仍保持线性表的顺序存储结构,可以从线性表的第一个元素开始,往后逐个与新元素相比较,直到发现一个元素与新元素相等。
然后从当前位置的下一个元素开始,将后面所有元素都往前移动一个位置,直到线性表的最后一个位置为止。
显然,删除一个元素之后,线性表的长度减小了1。
其算法如下。
输入:
线性表L(1:
n),n为线性表的长度,删除的元素b(—定在线性表中)。
输出:
删除b后的线性表L(1:
n)。
IFn=0THENOUTPUT"underflow"
ELSE{
i1
WHIL
E(in)and(L(i)
b)
DOi
ii1
IFi
nTHENOUTPUT
"not
this
element"
ELSE{
IF
inTHEN
FORjiTOn-1
DO
L(j)
L(j1)
n
n1
}
}
RETURN
在上述算法中,从线性表的第一个元素开始寻找要删除的元素b,实际上我们
还可以从线性表的最后一个元素开始寻找b,其算法留给读者自行考虑。
3.线性链表的插入排序
定义一个二列数组A(1:
1000,1:
2),其中,A(i,1)(i=1,2,…,1000)依随机数产生的顺序存放1000个数据,A(i,2)(i=1,2,…,1000)为链接指针,将1000个随机数链接成有序链表。
其插入排序的方法如下。
依次从数据文件中读入一个数据,将它按行顺序存放到数组A的第一列中,
然后通过相应行的第二列将它链接到已经有序的链表中。
其过程为:
将读入的数
据依次与链表中各元素进行比较,找到其应该插入的位置后,适当改变链指针,将其插入。
其算法如下:
输入:
1000个随机整数。
输出:
头指针为H的有序链表。
H1;READx;A(1,1)x;A(1,2)0
FORk2TO1000DO{
READx;A(k,1)x
IFA(H,1)xTHEN{A(k,2)H;Hk}
ELSE{
iH
WHILE(A(i,2)0)and(A(A(i,2),1)x)DOiA(i,2)
A(k,2)A(i,2);A(i,2)k
}
}
RETURN
【实验环境】(使用的软硬件)
处理器英特尔Corei5-4200M@2.50GHz双核
内存4GB(记忆科技DDR3L1600MHz)
操作系统Windows10专业版64位(DirectX12)
编译环境Dev-C++5.6.1
编译语言C
实验内容:
【实验方案设计】
1.利用递推公式yi=mod(2053yi-1+13849,m)产生0至65535之间的随机整数。
如要产生0至999之间的随机整数,只需做运算xi=INT(1000yi/m)。
将数据写入D:
\\data.txt中
2.从1中产生的文件中依次读出数据,以数组形式创建一个空白线性表,以插入
排序算法依次将数据茶如有序线性表中,最后打印输出。
再从文件中依次读取数
据,与线性表中元素对比,删除该元素。
删除方法为:
将线性表后一个元素的值赋给当前元素。
最终达到清空线性表的目的。
3.以N=100和N=400分别运行2中的程序,比较运行时间。
4.以二维数组的形式创建一个静态链表,第一维存放从文件中读取的数据,第二维存放指向下一个元素位置的指向记号,链表开始的标志是指向记号指向最小元素,链表结束的标志是指向记号置-1。
用插入排序的方法将数据存入数组中并形成链表结构。
5.整理实验结果,写出实验报告
【实验过程】(实验步骤、记录、数据、分析)
实验一:
源代码:
/*
实验1:
产生1000个0至999间的随机整数,并以产生的次序存入一个数据文件中
*/
#include
#include
#inelude
intmain()
{
longm=65536,y=0;
intx,i;
//定义一个文件类型的指针
FILE*fp;
//用fopen函数新建一个文件,失败则返回0]
if((fp=fopen("D:
\\data.txt","w"))==NULL){
fprintf(stderr,"Erroropeningfile.");
exit(0);
printf("ThedatahasbeenoutputtoD:
\\data.txt!
\n");
printf("Alldataisasfollows!
\n\n");
//递归创造1000个0~999之间的随机数
for(i=0;i<1000;i++)
{
y=(2053*y+13849)%m;
x=(int)(1000*y/m);
fprintf(fp,"%d\n",x);
printf("%d:
%d\t",i+1,x);
}
//关闭文件
fclose(fp);
exit
(1);
}
运行结果:
Th#datahasbtenoutputtc□:
\dBtB.txtAlldataimasfollows*
exitedHithreturnualuv1r»ssanyksytocontinu#...
实验二、实验三:
源代码:
/*
实验2:
编制一个程序,依次实现以下功能:
1.定义一个有序非递减线性表,其最大容量为1000,初始时为空。
2.从由1产生的数据文件中依次取前N个随机整数陆续插入到此线性表中并要求在每次插入后保持线性表的有序性。
最后将此有序线性表打印输出。
3.在由2产生的线性表中,依在1中产生的次序逐个将元素删除直至表空为止。
实验3:
以N=100及N=400分别运行2的程序,并比较它们的运行时间
*/
#include
#include
#include
#define
N1000
voidmain()
{
//新建时钟变量,得到程序从开始运行到某时刻经过的时钟周期数
clock_tstart,finish;
FILE*fp;
inta[1000];
inti,j,n,temp;
doubleduration;
//Part1:
创建一个有序线性表
start=clock();
if((fp=fopen("D:
\\data.txt","r"))==NULL){
fprintf(stderr,"Erroropeningfile.");
exit(0);
}
//判断插入顺序是否合理
elseif(n=N>1000)
{
printf("Dataoverflow!
Pleasetryagain!
");
exit(0);
}
//比较插入元素与有序表中元素位置并插入
esefor(n=0;n { fscanf(fp,"%d",&temp); if(n==0) a[0]=temp; //将比a[i]大的数向后移动一格,将a[i]放入线性表 else for(i=n;(i>0)&&(a[i-1]>temp);i--) } //判断删除位置是否合理 if(n==0) { printf("Dataunderflow! Pleasetryagain! "); exit(0); } //在线性表中利用顺序查找法找到元素位置 elsefor(;n>0;n--) { fscanf(fp,"%d",&temp); for(i=0;i =temp;i++); if(i>=n) printf("ThiselementCANNOTbefound! "); 若位 //若要删除元素不是位于顺序表最后一位,则将后面的元素前移一位;于最后一位,直接令n--即可,不必再移动 elseif(i for(j=i;j a[j]=a[j+1]; else; } //打印清空后的顺序表 for(i=0;i printf("%d\t",a[i]); finish=clock(); duration=(double)(finish-start)/CLOCKS_PER_SEC printf("\nThesortedlinearlisthasbeencleared! 'n"); printf("Thelengthofitis%d.\n",n); printf("Timetaken: %fs\n",duration); fclose(fp); exit (1); } 运行结果: 实验二: oI"O1235&T60-12235&89 8888388899339939 0303570^18925B2 8382u- 13M67 88888 14019 7i1? -o3 13H67 88888 53716&蚩1C08TE6守QJ.1斗一5了^■310门1213 78''IIII 0526956 3u"56739 8ss8889 H12& 2uis6 8888 87 M65 33715 12356s8sg8 2962 2-^45 9339 7e 9 33 29G1Z35&7-8G12^^SG83788888-83839939SS39 口scrlinearhasbooncreated! Thelengthofit1606. Prowlstxitttdwithreturnvb1q»Ianykvijtocentiinu*... 939 咖 943 屈 也 352 95? 953 35G 367 970 9T0 aro eei 9S3 歸 983 磁 S9J 郵 Asortedlin-eor list hatbetn cr»*t»dt T2 lengthofit i& fQGO, SM S45 軸8 ase 951 952 958 853 3G4 如 9? 1+ 9T6 9TB 979 38G 3B0 朋5 9輻 987 931 992 998 S99 99& 999 •M fhff«ort»d1inearli$tha$bvvnclsar^d*h«lengthpfiti$G. Procfl^a4xit»dwithreturnualu«1frsssanykeytocontinu«... 793 79S 8G) 808 BOB 81e etc 扪5 St? B20 ®31 831 AA1 8*7 848 851 851 A52 8S4 «65 B6G S£B 875 AB; ee>t S«4 asr 8fi7 盼 697 SOfl 9011 M5 MT 9诂 915 扪5 91B 91T 313 422 S25 327 42S 93£ 937 93& 919 mo 抽3 951 452 159 9G1| SG4 9E5 970 170 97D 97G 97« SOI 9S3 9&7 球 392 颁 335 b»rt*dIin*arb*«ncreat*4T Th# lengthOf itisH6G "inp taktn: 6 93frBGBa IS 38 53 5S J*I3 2&3 27G 231 32H 訓8 425 讪 521 522 6C6 7H7 745 917 The ^ortmd1l n»ar1iat hasbeen clsared! Thplengthofitis26.tiaetaken: &Q329G0s Processexitedwithreturnz吉丄uo1Pr#e«anyktytocotitinue... (此图将原程序中for(;n>0;n--)改成了for(;n>20;n--),即删除至 剩20个数据的线性表,目的为验证删除一些元素后线性表仍保持有序) 实验三: 1.N=100 35 37 2 8B95 56? ^# o- re 9 li&t &ort#dlinear ofitisiee a095000s rhelengthrinetaken sorted Fhfllength Tiaetak»n.Q031960s 1inearlisthasbavncleared! ofitis6. row^swithreturnualu«1 anyk»ytocontinue... t1=0.005000st2=0.001000s 2.N=400 G7 3 G7 6H 3G 99. 92 sui 03 77 G9 T 8 6 8 85 _77 9 _7 SI 7 8 ff 6 91 76 9 83360563^78353^3891M5€7-9 G235o2H6? ? ? 7 0736 B2uis T? TT G <499 Iscrtlinearlisthasbe«ncreatpd! h»lengthofitis4S8. ! ■«tak&n.0.Q499603 h»sortedlinearlistha&b««ncleared*lengthofitimG. i»tak0n;6.9S1BQde roc*? swithrttur^nualu*1 r*t)5onuk»utoc&titinut.., t1=0.049000s 实验四: 源代码: t2=0.001000s /* 实验4: 编写一个程序,用插入排序依次将1中产生的1000个随机整数链接成有序链表 不改变原随机数在存储空间中的顺序。 */ #include #include #defineN1000 intmain() { FILE*fp; inta[N][2]; intH,i,k,x; if((fp=fopen("D: \\data.txt","r"))==NULL) {I fprintf(stderr,"Erroropeningfile."); exit(0); } //定义头节点位置 H=0; fscanf(fp,"%d",&x); a[0][0]=x; //定义链表结束标志 a[0][1]=-1;[ //逐一插入元素并与原链表内元素比较以确定位置
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 计算机软件 技术 基础 实验 报告 线性 插入 删除 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)