软件基础试验报告.doc

上传人:scccc 文档编号:12631019 上传时间:2021-12-05 格式:DOC 页数:29 大小:253.50KB
返回 下载 相关 举报
软件基础试验报告.doc_第1页
第1页 / 共29页
软件基础试验报告.doc_第2页
第2页 / 共29页
软件基础试验报告.doc_第3页
第3页 / 共29页
软件基础试验报告.doc_第4页
第4页 / 共29页
软件基础试验报告.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《软件基础试验报告.doc》由会员分享,可在线阅读,更多相关《软件基础试验报告.doc(29页珍藏版)》请在三一文库上搜索。

1、软件基础实验报告作者: 日期:计算机软件技术基础实验报告姓名:X XX班级:XX 0X01学号:30X05050XX实验一线性表:1、建立单向链表,表长任意;2、可交互输出单链表中的内容;3、编写算法计算出自己所建单链表的长度并输出;4、 删除自己所建单链表中的第K个结点,并将剩余结点输出5、将单链表倒排,输出结果。源程序如下:# in c lud e <stdio.h>#inclu d ev mall o c.h>t ypedef i n t da t aty p e;typed ef st ru ct no de/链表结构体 /dataty pe da t a;st r

2、uct no de *ne x t;li nk 1 ist ;li n k1 ist *creat 1 i s t()/ 建立链表/ /i nt x ;1 in k l is t * h e a d, *s ;he a d=N ULL;p r intf("n输入链表数据:");scan f ("%d",& x );whi 1 e (x!=0 )s=ma 1 lo c(si zeof( 1 in klist) ;/ 为链表开辟一系列的空间 /s-> da t a = x;s > n ext=he a d;head=s;p r i ntf

3、("n输入链表数据:");s can f(" %d" ,&x);re t ur n h e ad;v oid lis t Con te nt (li n k 1ist *h )/ / 输出链表内容 /link 1 ist * s;s=h;w hi l e (s!=NULL )p r int f ("%4 d ",s- > data);s= s -> n ext;i nt 1i stLon g (li n klist *h )/ / 计算链表长度 /i n t i=0;lin klist *s;s=h;while(s

4、!=N U LL )i+;s = s ->next;retur n (i);vo id DeleteN o de (li nk 1i st * h ,in t k)/ / 删除第 K 个节点/ /in t i = 0;lin k li st *p, * q;P =h;i f (k=1)h = h>n ext;free (p);el s ew h ile(i< k -1&&p! =N UL L)i +;q=p;P =p->ne xt ;q >next=p- >n ext;fre e (p);lin k li s t *DaoXu(linklis

5、t *h )/ 逆序排列链表 / /l i nkli s t *r, *q p;r=h;p =r> ne x t;q=p->n ext;i f (h=NULL)p r i nt f("链表为空n ");while(q ! =N ULL&& h! = N U LL)p- > n ex t =r;r =p;p=q;q=q- >n ext;h-> n ext= N U L L;p _>next= r;return(p);ma in ()i n t k,x;linkli s t *h ;dopr i n tf ("n 功

6、能:n ");p r i nt f ("1 建立链表 n");pr in t f( "2.输出链表内容;n");printf("3.获得链表长度n”);pr intf ("4删除第K个节点n ");p ri nt f (" 5将链表倒序输出n");p r intf(" 6 .退出 n");p r i ntf("请输入功能号: n");scan f("%d", & x);if(x<1|x > 6)printf(&quo

7、t;错误! n");elseswitch(x)ca se 1: h= crea tl i st();break;c ase 2:list L o n g( h );break;c a s e3: pr in t f ("链表的长度是:%d", li stLong (h) ); break;ca se 4:p ri ntf("请输入要删除的节点:n");'sc anf("%d",&k);'Del e te Node (h,k);lis t Con tent (h ); b re a k; cas e 5

8、: h =DaoXu(h);listC onte nt ( h);b r e a k; cas e 6: e xit(O);bre a k;whil e (1 );运行结果:安箱跑5K骨也+ +姑烤丟出入输入搭表数据;為 输入错表数据目叫 输入槌表数据沖弓 输入槌表数据:" 输入错耒数据:騎 输入镇表数据個畫表灯倒 的:T7WW出人 3辟功2_* - - -fe'nr3 1 « -r-J 1号LZJ功二逢玄链表變出锈表内容:|8|5%: 内长代序# 衷奠眄倒能 槌餐量功 :立出出入 ' D:宝M牧祇仁丰4富權文阵夹8卵輕一巧实验总结:1 .在编写倒排链表的程

9、序时, 对于循环的计数的控制 没有搞好,以致无法得到想要的链表;2.要给一个指针创立空间 之后才能调用它,否则会出错。解决办法:1.通过单步调试程序,调整循环次数,来使循环中的 个参数达到自己想要的 通过查阅资料,完成对链表程序的实现。在写每一个子函数时,常常会遗漏小的判断条件, 比如遗漏了判 断是否为空等;还有就是在对指针操作时,有时多加了 *,或者分号写成逗号;在调试程序的过程中有很多小的错误或者判断条件错 误等。实验二在交互方式完成下列任务:1、动态交互建立二叉树,结点个数任意;2、分别用DLR LD R、LR D三种方式对二叉树进行便 利并输出结果;3、计算二叉树中的结点个数并输出;4

10、、计算二叉树的深度并输出;源程序如下:# incl u de "stdio . h"# inc 1 ud e " mal 1 o c .h"str uct BTN odei nt d a t a ;?struc t BTN o de *Lch i1 d,*R c hi 1d ;st ruct BTNode *build(st r uc t BTNode *p);s truct B TN o de *creatren t (struc t BTNod e *p );void DLR(s tru c t BTNode *T);str uct B TNode

11、*crea tr ent(st r uc t BTNod e *p)?int x;? pr in t f("输入根:rent=");?scanf ("% d", &x);? if(x= 1 00 0 ) p=N U LL; e Ise?p-> da ta=x;p> Lch i I d =(s t ru ct B TNod e *) malloc(s i zeof(st ructBTNode);?retup- > Rchil d =( s tr u ct BTNod e *) i f ( p=NULL) r eturn p ;p&

12、gt; Lch il d =build(p >Lchi p->Rchil d =build( p >Rch il d ); r n p;m a lloc(size o f (struc t BT Node);Id ); st r? iuctBTNo de *bui 1 d( s truct BTN o d ent x ;printf("输入数据(输入值为时,表示该结点为空 sc a nf ("%d", &x);? i f(x= 1 0 00) p =NUL L;e lsep >d at a = x;? p -> L child

13、= (s tru ct BT N o de *)m al loc( s p >Rch ild = (st r uct B T Nod e *) m all):v a lue=");?i zeof( s true t oc (sizeof(s trBTNode); u ct B TNod e );? i f( p =NULL) r etur n p;p >Lchi1 d= build(p- > Lch il d); p->Rchild= b u i ld(p- > Rchi ld);?retur n p;?vo i d DLR(st r u ct BTNo

14、d e *T)i f(T= NU LL)r et ur n;p r int f ("% d ", T->da t a );DLR(T > Lch ild);DL R(T >Rc h i ld);v o i d LD R(s tr u ct BTNod e *T)?if (T =NUL L) r et u rn;LD R (T->L chi 1 d)?pr i ntf("%d", T ->da t a);LDR(T >Rchi 1 d);voi d LR D(s t rue t BTN o d e * T )?i f (

15、T= =N ULL) re turn ;?LRD (T >Lc h i1 d);?LRD(T->R h i1 d);? p r i ntf(” %d ",T->dat a );v o id m ai n ()?struct B TNo d e * r en t =NU LL;int flag ;?while( 1 )?n3 :后序 n ")BT Node);? prin t f("选择输入的操作:n 1:创建2 :先序n 3:中序 ?scanf("%d",& f la g );?swi tch (flag)? case

16、 1 :? r ent=( s truc t B TNode *) ma lloc( s iz e of( s t r uct rent=crea tr en t(rent);?br e a k;ca se 2 :DLR(rent) ;printf("n " ) ;br e ak ;case 3: LDR ( r en t);p r intf ("n") ; br e ak ;?ca se 4:L RD(re n t);pri nn") ;b re ak;运行结果: 5 AUserspU«5ktopL>ebug-,e11入入入入

17、入择 心刖一 刖 j 刖.!_刖. .刖II刖.1-!.-刖4 刖.>._ 刖二刖二- :为旺为 Hl 000! 为 0- 1000. jAjK1000l, 为辰,为 H10H0P为詁 为氐为* 1她,1000,1000,1000,1080,1Q00,寛工空空空空空空空工 占善苦苫苫RE占苫苫警小 士 口士 口士 口士口士 口士 口士 口士口士 口士 n 该该阂雷囂该该该 丞疋示示-巫血亦示示亦 Ex ulKjllyEv.-.-V my _!/_<valiia=l vlue=10B0 u alkie =2=5 ualue =1000 uluc =10B0 ualue=1000MAl

18、ue -8 value=1000 value=100H总作操石的卫彎先中后8 B8.liI I实验总结:通过查资料完成程序,还是在调试程序的过程中出 现恩多的错误,除了一些基本的错误,也出现了判断错误,比 如在进行先序,中序,后序遍历的时候都没加 i f ( k ! = NU LL)这个条件,导致在执行程序的时候,只进行先序遍历,然后 出错退出。实验三在交互方式下完成下列任务:1、根据教材上算法,完成图的深度和广度优先遍历,要求任意给定起始 点,输出结果;2、根据教材上算法,完成图的单源最短路径的算法,要求任意给定源 点,输出结果;源程序如下:#i n cl ude <stdi o .

19、h># in elude <m a llo c. h> #def i ne Q 1 0 0 0 #d e f i ne VNum 6st r u ct GLink i nt No; in t Right;s t ruct G Lin k *Relat; ;int G VNu mVN um =/对图进行初始化/ /0 ,23,1 6 ,Q , 4 5 , Q,? Q,0,15,5 0,1 0 ,Q,2 0,Q,0,1 5,Q,Q,Q,2 0,Q, 0,35,Q,? Q,Q,Q,30,0,Q,Q,;5 ,4,Q,Q, 0s truct GLink * GLV Num;int Vi

20、sitedVNum;v o id Creat e GLink(int GVNumVNum ) 立邻接表/ in ti, j;f or ( i =0 ;i v VNum; i +)GLi =q = NULL;fo r (j = 0 ; j v VNu m ; j+)if (i != j)if (Gi: j > 0 )&&(Gij < K)/点存在有向路径/? p = (struc t GL ink *)m al loc(si z eof(struct G L in k );p->N o = j ;/ /点加入邻接表/?p->Righ t = G i: j;

21、if (GLi = = N ULL)?GLi = p;?e l se?q >Re l a t = p;q = p;/建该两将该s tru ct G L i n k * p,* q;vo id DF S(int A V Nu m VN um, int V) 起点/用于进行深度优先遍历的子函数 ,是访问/ /int i;print f (" %d ", V);Vi s ited : V = 1;/for (i =0; i < VN um; 1 +)i > 0)&& (A Vi v K) && (V isite/将其标记为已1 f

22、 (A V/该结点未被访问过d 1 != 1)DFS(A,);/访问该点/ /fo r (1= 0;1 f (Visitedi 点,访问该点/i < V Num; 1 +)=1) DFS(A,i);/ /仍有未必访问过的/用于广度v o 1 d B FS(int AVN u m VNum , i n t V)优先遍历的子函数/1 nt CQVNum ;i n t a 0,b,c;int i,k= 1;fo r (i= 0 ;i<VNu m ;i+)CQ1 =K;Vi s i t ed V = 1;志为访问过/CQ : 0 = V;pr 1 ntf(" %d ",

23、V);放入队列/while(k v 6&& a <k) /仍有结点未被访问并且队列中仍有结点的后继结点未被/ 标/ /将该结点访问/b=C Q a ;for(c=0 ; cv VNum; c+ +) /依次将队列中以结点为首的邻接表中的结点插入队列/ /f(Vis 1 ted prCQ:c=0&& A b c<K&& A b c! = 0) in t f ("%d", c);+ +k=c;/未被访问过,将其插入到队列中/Vi sit ed c =1;/标志为访问过/a+ ;for(i=0;if(V 1 sit e

24、di=0) BF S(A, i);v VNu m;i+)void Short(i nt A V NumV N um , i nt V) 起点/用于计算最短路径的子函数,V是 int Di s tV N um, PathVNum;int S = 0;in t i, k ;i n t wm, u;for (i=0;i<VN um; i + +) D ist i = A Vi;/ /默认这两点之间即为最短路径/if (Dis t i< K)P athi: = V;/ 存储该路径/S = S 1(1 VV V);for ( k = 0 ; k<VNum;k+ +) wm = K;u

25、= V;fo r (i = 0; iv VNu m; i + +)if (S &(1 v < i)=0)&& (Dis t : i < wm)/该两点间存在路径/ /u = i;?wm = Di st i;S = S |(1 << u);fo r (i = 0; iv VNum; i+)if (S &(1 v < i)=0) & & (D istu: + A ui) v Disti)? Di s t : i = Distu + Au: i ;/ 找到新的最短路径 /P at h i = u;/更新路径长度/? f o

26、 r (i = 0 ; iv VN um; i+)/ 输出该源结点到其他各点的最短路径 /if (S &(1 << i)!= 0)k = i;w h i le ( k !=V) p r in t f("%d <-" , k);?k = Pat hk;print f (" %d ",V);p r i n t f("n ", Di sti);else pr i ntf (" No Path : %d", i);m a in ()in t i, j, a, b;Cre ateGLin k (G)

27、;p rint f ("1 .深度优先遍历n");/打印菜单/ /p r i nt f ("2.广度优先遍历n");p ri ntf(" 3 寻找单源最短路径n ")prin tf ("4 .退出 n");/w h ile(1)完成菜单功能/ / print f ("n功能项选择从1到 4 :”);scanf ("% dH, & a );if (a=1) fo r (i=0; i <VNum; i + +)Vis i ted : i = 0;?printf(”请输入第一个节点:&q

28、uot;);sc anf("%d", & j);?prin t f n 深度遍历 DFS是:");DFSG ,j);p rint f( "n");i f (a=2) fo r (i= 0 ; i<VNum ;i+)Visite d i = 0 ; p rin t f ("请输入第一个节点:");?sc anf(” d ",& j);?p rint f ("n广度遍历结果 BFS是:");?BFS(G,j);pr in tf("、n");? if (a=3

29、)printf("请输入源点:");sc a nf(" %d", &b);p r int f(" n单源最短路径是:n ");Short(G,b);if (a= =4) bre a k;运行结果:jgDebugkjh7.exc,-search the grapl deejj first.sedvch tliebt'oad fIvst-find the sfiortest path-exitplease inyut a nun from 1 to 4 :1lease ih)put tlie F±Vst node

30、 = 1The Result of DFS is: 112 J 101413 J 51jpljease 土npu七 己 num £rom 1 to 4 :2lease infjut tlie first node = 1The Result of BFS is:lJ 12J 3J<J0J5Jplease input a num front 1 tn 4 S 3input tlie source node ;1The Eesult of Shortest path is:M <-2 <-1= 351 = 62 <-1= 153 <-2 <-1= 30

31、4 <-1- 10Ng Path - Eplease input a nunt From 1 to 4 ;4i*bss ani/ kev to continue实验总结:1运行时,2表示深度优先遍历,3表示广度优先遍历。碰到问题:1 建立图时,指针太过复杂,很容易搞混;2.广度优先遍历中,编写时,打印输出进入死循环;解决办法:1 通过单步调试找出赋值错误和参数调用的错误;2.将函数中的q移位移到循环外面。实验四检索和排序在交互方式下完成下类任务:1、任意给定无序系列,用快速排序法对其进行排序,并统计交换次数。2、任意给定的无序序列,用对半检索法交互检索任意给定的关键字K EY3、任意给定

32、无序系列,用冒泡排序法对其进行排序,并统计交换次数和排序的趟数源程序如下:# inclu d e vs td io .h>i n t ji;vo id duiban(int a10,i n t n,in t ke y)i nt l ow , h ig h ,mid ,f lag ;1 ow=0; h igh= n -1 ;flag=0;while( 1 ow<=hi gh)m id=(low+ h igh)/2;if(a mid = = key ) flag=1; b re a k;e lse i f( k e y >am i d) 1 ow= m i d+1 ;el se

33、high=mi d -1;i f(flag = = 1) pri n tf("是第 %d 个元素 ”,mid+1);el se pri n tf ("E");v oid mao pa o(i n t a10 ,in t n ) in t i,j,temp, f la g;int jia o ,ta n g;j i a o=ta n g=0;f o r (i= 0; i<n-1 ;i+ +) f la g=1;for(j=0;j<n_i_ 1; j+)?if (aj+1: <aj) tem p = aj:; a: j = aj+1;a : j+1=

34、t e mp;jiao + +;fl a g=0; ?ta ng+;if(fla g = 1 ) b r eak;pri nt f(”n交换次数和排序趟数分别是%d和小",jiao,t a ng);vo id kuaishu (i nt a : 10 ,in t 1 ow,i n t h ig h )in t i,j;i nt t e mp;i f (lo w>=h i gh ) retu rn(0);i=low;j=hig h ;temp=ai ;while(i! = j) w hil e(a j> = temp ) &&(j>i ) j;if(j

35、 > i) a i+= a j;ji+; while(a i <=temp)&&( j >i ) i + +;i f( j >i) a :j - -=ai;ji + +;ai = temp;kua is hu(a,low,i 1);kua i shu ( a ,i+ 1,h i gh);ma in ()int i, a 10,n, q, p, t ;d o prin t n 1用对半检索法,交互检索任意给定的关键字KEY");pri n tf (" n2用快速排序法对其进行排序,并统计交换次数");p ri ntf( n 3

36、.用冒泡排序法对其进行排序,并统计交换次数和排序的趟数");pr in plea se w rite th e or der:");scan f("%d", & i);w h il e(i< 1 |i>4)prin t f(" n T h e o r d e r you print is wron g! ,please print a g ai n!"); scan f("%d" , &i);swi t ch (i) cas e 1:p r int f ("please i n

37、 put : n");f o r( n =0;nv 10; n+ +) s ca nf (" %d" ,&an);dop ri n tf ("please inp u t : n");?sc anf ("%d",&q);duiban (a ,10, q);?p r int f (":n ");? sc an f ("% d ",& p );?while( p =1);b r eak ;case 2: j i=0;?pri n tf(" pl ease

38、i np u t d at a: n ");for (n=0; n<8;n+) s can f ("%d", &an);k uai sh u(a, 0 , 9);pri n tf ("n快速排序的交换次数是 % d ",ji);printf ("n 结果是");? f o r (n=0; n<10;n + + ) printf (" % d ",a n );break ; case 3:?printf("p l ease inp ut data:n");f o r

39、(n=0; n <10;n+) scanf ("% d" ,& a n );?m a opa o (a, 1 0);pri nt f("n 结果是");? for( n= 0;n <10; n +) p r in tf("%d ",a n);?bre a k;c ase 4: p ri n t f(" GOOD BY E! !");whil e (i !=4);运行结果:用9 ffi交换次数和排序的趟数排序;莽绕世please write the order: 1please in put :1

40、2 24 35 17 27 38 46 5? 6K 22 please input :蔓第弓个元素:2KE数数 字次次 键餐 关芻 的Ttt 定统统 r手幵 意: 任星 Iff- 互进进" 交苴苴« 柱袪法 半速泡冒 用ffi1用 " 1 2 3TJLJ e又叉h-tee1P75 0 8 t 6 a.d 73 tu 6 p 2 ni 7i es B a 2 e1 6 p 3怅数数 宇次次 EX交亠X 6的菲 68定统统 J耳: 处任序It-速果用用用“7 : 7 3?er 是35互进进皿 数8交苴苴O 次2 ,菲he 梅26i±法法t 交 ZMte 的

41、2ri 序17半速泡W ;: « -'. J J- / e 齧1.2.3.P1please in put datai :14 25 16 17 27 39 49 3& 29 18交换体数和排序趟数分另1是1坯咛结果是:4 16 17 18 2S 27 29 99 39 491 騎半枚-2用虑班 氛用冒泡揶爺|隹彎越罰nleajse wi*lte the order-:KEV接次数和排序的趙数实验总结:子函数书上都有,所以主要函数都是参考书上的程序。 在计数时,计数的位置上出了点问题,通过认真读函数和一步一步 试,得到最终的结果。实验心得:三次计算机软件技术实验已经结束了,经过这次实验的锻炼,让我学到了许多东西,也认识到了自己在学习 及编程方面的i些不足之处。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1