2023年软件基础实验报告_第1页
2023年软件基础实验报告_第2页
2023年软件基础实验报告_第3页
2023年软件基础实验报告_第4页
2023年软件基础实验报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机软件技术基础实验报告姓名:XXX班级:XX0X01学号:30X05050XX实验一线性表:1、建立单向链表,表长任意;2、可交互输出单链表中的内容;3、编写算法计算出自己所建单链表的长度并输出;4、删除自己所建单链表中的第K个结点,并将剩余结点输出;5、将单链表倒排,输出结果。源程序如下:#include<stdio.h>#include<malloc.h>typedefintdatatype;typedefstructnode//链表结构体//{datatypedata;structnode*next;}linklist;linklist*creatlist()//建立链表//{intx;linklist*head,*s;head=NULL;printf("\n输入链表数据:");scanf("%d",&x);while(x!=0){s=malloc(sizeof(linklist));//为链表开辟一系列的空间//s->data=x;s->next=head;head=s;printf("\n输入链表数据:");scanf("%d",&x);}returnhead;}voidlistContent(linklist*h)//输出链表内容//{linklist*s;s=h;while(s!=NULL){printf("%4d",s->data);s=s->next;}}intlistLong(linklist*h)//计算链表长度//{inti=0;linklist*s;s=h;while(s!=NULL){i++;s=s->next;}return(i);}voidDeleteNode(linklist*h,intk)//删除第K个节点//{inti=0;linklist*p,*q;p=h;if(k==1){h=h->next;free(p);}else{while(i<k-1&&p!=NULL){i++;q=p;p=p->next;}q->next=p->next;free(p);}}linklist*DaoXu(linklist*h)//逆序排列链表//{linklist*r,*q,*p;r=h;p=r->next;q=p->next;if(h==NULL)printf("链表为空\n");while(q!=NULL&&h!=NULL){p->next=r;r=p;p=q;q=q->next;}h->next=NULL;p->next=r;return(p);}main(){intk,x;linklist*h;do{printf("\n功能:\n");printf("1.建立链表\n");printf("2.输出链表内容;\n");printf("3.获得链表长度\n");printf("4.删除第K个节点\n");printf("5.将链表倒序输出\n");printf("6.退出\n");printf("请输入功能号:\n");scanf("%d",&x);if(x<1||x>6)printf("错误!\n");elseswitch(x){case1:h=creatlist();break;case2:listLong(h);break;case3:printf("链表的长度是:%d",listLong(h));break;case4:printf("请输入要删除的节点:\n");ﻩscanf("%d",&k);ﻩDeleteNode(h,k);listContent(h);break;case5:h=DaoXu(h);listContent(h);break;case6:exit(0);break;}}while(1);}运营结果:实验总结:1.在编写倒排链表的程序时,对于循环的计数的控制没有搞好,以致无法得到想要的链表;2.要给一个指针创建空间之后才干调用它,否则会犯错。解决办法:1.通过单步调试程序,调整循环次数,来使循环中的个参数达成自己想要的通过查阅资料,完毕对链表程序的实现。在写每一个子函数时,经常会漏掉小的判断条件,比如漏掉了判断是否为空等;尚有就是在对指针操作时,有时多加了*,或者分号写成逗号;在调试程序的过程中有很多小的错误或者判断条件错误等。实验二在交互方式完毕下列任务:1、动态交互建立二叉树,结点个数任意;2、分别用DLR、LDR、LRD三种方式对二叉树进行便利并输出结果;3、计算二叉树中的结点个数并输出;4、计算二叉树的深度并输出;源程序如下:#include"stdio.h"#include"malloc.h"structBTNode{intdata; structBTNode*Lchild,*Rchild;};structBTNode*build(structBTNode*p);structBTNode*creatrent(structBTNode*p);voidDLR(structBTNode*T);structBTNode*creatrent(structBTNode*p){ﻩintx; ﻩprintf("输入根:rent=");ﻩ ﻩscanf("%d",&x); ﻩif(x==1000){p=NULL;} else ﻩ{ﻩﻩp->data=x;ﻩﻩ p->Lchild=(structBTNode*)malloc(sizeof(structBTNode)); p->Rchild=(structBTNode*)malloc(sizeof(structBTNode)); ﻩ if(p==NULL)returnp;ﻩp->Lchild=build(p->Lchild); p->Rchild=build(p->Rchild); ﻩreturnp; }}structBTNode*build(structBTNode*p){ intx;ﻩprintf("输入数据(输入值为时,表达该结点为空):value="); scanf("%d",&x); ﻩif(x==1000){p=NULL;} else ﻩ{ p->data=x;ﻩﻩﻩp->Lchild=(structBTNode*)malloc(sizeof(structBTNode));ﻩp->Rchild=(structBTNode*)malloc(sizeof(structBTNode));ﻩ }if(p==NULL)returnp;ﻩp->Lchild=build(p->Lchild); p->Rchild=build(p->Rchild); ﻩreturnp; ﻩ}voidDLR(structBTNode*T){ if(T==NULL)return;ﻩprintf("%d",T->data);ﻩDLR(T->Lchild);DLR(T->Rchild);}voidLDR(structBTNode*T){ if(T==NULL)return;ﻩ LDR(T->Lchild);ﻩprintf("%d",T->data);LDR(T->Rchild);}voidLRD(structBTNode*T){ if(T==NULL)return; LRD(T->Lchild);ﻩLRD(T->Rchild); printf("%d",T->data);}voidmain(){ﻩstructBTNode*rent=NULL; intflag;ﻩwhile(1) { ﻩprintf("选择输入的操作:\n1:创建\2:先序\n3:中序\n3:后序\n");ﻩscanf("%d",&flag);ﻩswitch(flag) ﻩ{ﻩcase1: rent=(structBTNode*)malloc(sizeof(structBTNode));rent=creatrent(rent);ﻩbreak;ﻩcase2:DLR(rent);printf("\n");break; case3:LDR(rent);printf("\n");break;ﻩ ﻩﻩcase4:LRD(rent);printf("\n");break;ﻩﻩ}ﻩ}}运营结果:实验总结:通过查资料完毕程序,还是在调试程序的过程中出现恩多的错误,除了一些基本的错误,也出现了判断错误,比如在进行先序,中序,后序遍历的时候都没加if(k!=NULL)这个条件,导致在执行程序的时候,只进行先序遍历,然后犯错退出。实验三在交互方式下完毕下列任务:1、根据教材上算法,完毕图的深度和广度优先遍历,规定任意给定起始点,输出结果;2、根据教材上算法,完毕图的单源最短途径的算法,规定任意给定源点,输出结果;源程序如下:#include<stdio.h>#include<malloc.h>#defineQ1000#defineVNum6structGLink{intNo;intRight;structGLink*Relat;};intG[VNum][VNum]=//对图进行初始化//{0,23,16,Q,45,Q, Q,0,15,50,10,Q, 20,Q,0,15,Q,Q, Q,20,Q,0,35,Q,ﻩQ,Q,Q,30,0,Q,Q,5,4,Q,Q,0};structGLink*GL[VNum];intVisited[VNum];voidCreateGLink(intG[VNum][VNum])//建立邻接表//{inti,j;structGLink*p,*q;for(i=0;i<VNum;i++){GL[i]=q=NULL;for(j=0;j<VNum;j++){if(i!=j) if((G[i][j]>0)&&(G[i][j]<K))//该两点存在有向途径// {p=(structGLink*)malloc(sizeof(structGLink));ﻩp->No=j;//将该点加入邻接表//ﻩp->Right=G[i][j]; if(GL[i]==NULL) GL[i]=p; elseﻩ q->Relat=p;ﻩq=p; }}}}voidDFS(intA[VNum][VNum],intV)//用于进行深度优先遍历的子函数,V是起点//{inti;printf("[%d]",V);Visited[V]=1;//将其标记为已访问//for(i=0;i<VNum;i++)if((A[V][i]>0)&&(A[V][i]<K)&&(Visited[i]!=1))//该结点未被访问过//DFS(A,i);//访问该点//for(i=0;i<VNum;i++)if(Visited[i]!=1)DFS(A,i);//仍有未必访问过的点,访问该点//}voidBFS(intA[VNum][VNum],intV)//用于广度优先遍历的子函数//{intCQ[VNum];inta=0,b,c;inti,k=1;for(i=0;i<VNum;i++)CQ[i]=K;Visited[V]=1;//标志为访问过//CQ[0]=V;printf("[%d]",V);//将该结点放入队列//while(k<6&&a<k)//仍有结点未被访问并且队列中仍有结点的后继结点未被访问//{b=CQ[a];for(c=0;c<VNum;c++)//依次将队列中以结点为首的邻接表中的结点插入队列//if(Visited[c]==0&&A[b][c]<K&&A[b][c]!=0){printf("[%d]",c);CQ[++k]=c;//未被访问过,将其插入到队列中//Visited[c]=1;//标志为访问过//}a++;}for(i=0;i<VNum;i++)if(Visited[i]==0)BFS(A,i);}voidShort(intA[VNum][VNum],intV)//用于计算最短途径的子函数,V是起点//{intDist[VNum],Path[VNum];intS=0;inti,k;intwm,u;for(i=0;i<VNum;i++){Dist[i]=A[V][i];//默认这两点之间即为最短途径//if(Dist[i]<K)Path[i]=V;//存储该途径//}S=S|(1<<V);for(k=0;k<VNum;k++){wm=K;u=V;for(i=0;i<VNum;i++)if(((S&(1<<i))==0)&&(Dist[i]<wm))//该两点间存在途径//{u=i;ﻩwm=Dist[i];}S=S|(1<<u);for(i=0;i<VNum;i++)ﻩif(((S&(1<<i))==0)&&((Dist[u]+A[u][i])<Dist[i])) {Dist[i]=Dist[u]+A[u][i];//找到新的最短途径// Path[i]=u;//更新途径长度//ﻩ}}for(i=0;i<VNum;i++)//输出该源结点到其他各点的最短途径//if((S&(1<<i))!=0){k=i;while(k!=V){printf("%d<-",k); k=Path[k];}printf("%d",V);printf("=%d\n",Dist[i]);}elseprintf("NoPath:%d",i);}main(){inti,j,a,b;CreateGLink(G);printf("1.深度优先遍历\n");//打印菜单//printf("2.广度优先遍历\n");printf("3.寻找单源最短途径\n");printf("4.退出\n");while(1)//完毕菜单功能//{printf("\n功能项选择从1到4:");scanf("%d",&a);if(a==1){for(i=0;i<VNum;i++)Visited[i]=0; printf("请输入第一个节点:"); ﻩscanf("%d",&j); printf("\n深度遍历DFS是:");DFS(G,j);printf("\n");}if(a==2){for(i=0;i<VNum;i++)Visited[i]=0;printf("请输入第一个节点:");ﻩ scanf("%d",&j);ﻩﻩprintf("\n广度遍历结果BFS是:");ﻩﻩBFS(G,j);printf("\n"); }if(a==3){printf("请输入源点:");scanf("%d",&b);printf("\n单源最短途径是:\n");Short(G,b);}if(a==4)break;}}运营结果:实验总结:1运营时,2表达深度优先遍历,3表达广度优先遍历。碰到问题:1.建立图时,指针太过复杂,很容易搞混;2.广度优先遍历中,编写时,打印输出进入死循环;解决办法:1.通过单步调试找出赋值错误和参数调用的错误;2.将函数中的q移位移到循环外面。实验四检索和排序在交互方式下完毕下类任务:任意给定无序系列,用快速排序法对其进行排序,并记录互换次数。任意给定的无序序列,用对半检索法交互检索任意给定的关键字KEY任意给定无序系列,用冒泡排序法对其进行排序,并记录互换次数和排序的趟数源程序如下:#include<stdio.h>intji;voidduiban(inta[10],intn,intkey){intlow,high,mid,flag;low=0;high=n-1;flag=0;while(low<=high){mid=(low+high)/2;if(a[mid]==key){flag=1;break;}elseif(key>a[mid])low=mid+1;elsehigh=mid-1;}if(flag==1)printf("是第%d个元素",mid+1);elseprintf("E");}voidmaopao(inta[10],intn){inti,j,temp,flag;intjiao,tang;jiao=tang=0;for(i=0;i<n-1;i++){flag=1;for(j=0;j<n-i-1;j++)ﻩ if(a[j+1]<a[j]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;jiao++;flag=0;}ﻩtang++; if(flag==1)break;}printf("\n互换次数和排序趟数分别是%d和%d",jiao,tang);}voidkuaishu(inta[10],intlow,inthigh){inti,j;inttemp;if(low>=high)return(0);i=low;j=high;temp=a[i];while(i!=j){while((a[j]>=temp)&&(j>i))j--;if(j>i){a[i++]=a[j];ji++;}while((a[i]<=temp)&&(j>i))i++;if(j>i){a[j--]=a[i];ji++;}}a[i]=temp;kuaishu(a,low,i-1);kuaishu(a,i+1,high);}main(){inti,a[10],n,q,p,t;do{printf("\n1.用对半检索法,交互检索任意给定的关键

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论