1、计算机软件技术基础实验报告姓名:XXX班级:XX 0X01学号: 30X05050XX实验一线性表:1、建立单向链表,表长任意;2、可交互输出单链表中的内容;3、编写算法计算出自己所建单链表的长度并输出;4、删除自己所建单链表中的第 K 个结点,并将剩余结点输出;5、将单链表倒排,输出结果。源程序如下:#include#includetypedef int datatype;typedef struct node /链表结构体 / datatype data;struct node *next;linklist;linklist *creatlist() /建立链表/ int x;linkli
2、st *head, *s;head=NULL;printf(“n 输入链表数据:“);scanf(“%d“,while(x!=0)s=malloc(sizeof(linklist); /为链表开辟一系列的空间/s-data=x;s-next=head;head=s;printf(“n 输入链表数据 :“);scanf(“%d“,return head;void listContent(linklist *h) /输出链表内容/ linklist *s;s=h;while(s!=NULL) printf(“%4d“,s-data);s=s-next;int listLong(linklist *
3、h) /计算链表长度 /int i=0;linklist *s;s=h;while(s!=NULL) i+;s=s-next;return(i);void DeleteNode(linklist *h,int k) /删除第 K 个节点/ int i=0;linklist *p,*q;p=h;if(k=1) h=h-next;free(p);elsewhile(inext;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)p
4、rintf(“链表为空n“);while(q!=NULLr=p;p=q;q=q-next;h-next=NULL;p-next=r;return(p);main() int k,x;linklist *h;doprintf(“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“,if(x6)printf(“错误!n“);elseswi
5、tch(x) case 1:h=creatlist();break;case 2:listLong(h);break;case 3:printf(“链表的长度是: %d“,listLong(h);break;case 4:printf(“请输入要删除的节点:n“);scanf(“%d“,DeleteNode(h,k); listContent(h);break;case 5:h=DaoXu(h);listContent(h);break;case 6:exit(0);break;while(1);运行结果:实验总结:1.在编写倒排链表的程序时,对于循环的计数的控制没有搞好,以致无法得到想要的链
6、表;2.要给一个指针创立空间之后才能调用它,否则会出错。解决办法:1.通过单步调试程序,调整循环次数,来使循环中的个参数达到自己想要的通过查阅资料,完成对链表程序的实现。在写每一个子函数时,常常会遗漏小的判断条件,比如遗漏了判断是否为空等;还有就是在对指针操作时,有时多加了*,或者分号写成逗号;在调试程序的过程中有很多小的错误或者判断条件错误等。实验二在交互方式完成下列任务:1、动态交互建立二叉树,结点个数任意;2、分别用 DLR、LDR、LRD 三种方式对二叉树进行便利并输出结果;3、计算二叉树中的结点个数并输出;4、计算二叉树的深度并输出;源程序如下:# include “stdio.h“
7、# include “malloc.h“struct BTNodeint data;struct BTNode *Lchild,*Rchild;struct BTNode *build(struct BTNode *p);struct BTNode *creatrent(struct BTNode *p);void DLR(struct BTNode *T);struct BTNode *creatrent(struct BTNode *p)int x;printf(“输入根:rent=“);scanf(“%d“,if(x=1000) p=NULL;else p-data=x;p-Lchild
8、=(struct BTNode *)malloc(sizeof(struct BTNode);p-Rchild=(struct BTNode *)malloc(sizeof(struct BTNode);if(p=NULL) return p;p-Lchild=build(p-Lchild);p-Rchild=build(p-Rchild);return p;struct BTNode *build(struct BTNode *p)int x;printf(“输入数据(输入值为时,表示该结点为空 ):value=“);scanf(“%d“,if(x=1000) p=NULL;else p-d
9、ata=x;p-Lchild=(struct BTNode *)malloc(sizeof(struct BTNode);p-Rchild=(struct BTNode *)malloc(sizeof(struct BTNode);if(p=NULL) return p;p-Lchild=build(p-Lchild);p-Rchild=build(p-Rchild);return p;void DLR(struct BTNode *T)if(T=NULL) return;printf(“%d “,T-data);DLR(T-Lchild);DLR(T-Rchild);void LDR(str
10、uct BTNode *T)if(T=NULL) return;LDR(T-Lchild);printf(“%d “,T-data);LDR(T-Rchild);void LRD(struct BTNode *T)if(T=NULL) return;LRD(T-Lchild);LRD(T-Rchild);printf(“%d “,T-data);void main()struct BTNode *rent=NULL;int flag;while(1)printf(“选择输入的操作:n1:创建2:先序n 3:中序n3:后序n“);scanf(“%d“,switch(flag)case 1:ren
11、t=(struct BTNode *)malloc(sizeof(struct BTNode);rent=creatrent(rent);break;case 2:DLR(rent);printf(“n“);break;case 3:LDR(rent);printf(“n“);break;case 4:LRD(rent);printf(“n“);break;运行结果:实验总结:通过查资料完成程序,还是在调试程序的过程中出现恩多的错误,除了一些基本的错误,也出现了判断错误,比如在进行先序,中序, 后序遍历的时候都没加 if ( k != NULL)这个条件 ,导致在执行程序的时候, 只进行先序遍
12、历,然后出错退出。实验三在交互方式下完成下列任务:1、根据教材上算法,完成图的深度和广度优先遍历,要求任意给定起始点,输出结果;2、根据教材上算法,完成图的单源最短路径的算法,要求任意给定源点,输出结果;源程序如下:#include #include #define Q 1000#define VNum 6struct GLink int No;int Right;struct GLink *Relat;int GVNumVNum = / 对图进行初始化 / 0, 23, 16, Q, 45, Q,Q, 0, 15, 50, 10, Q,20, Q, 0, 15, Q, Q,Q, 20, Q,
13、 0, 35, Q,Q, Q, Q, 30, 0, Q,Q, 5, 4, Q, Q, 0 ;struct GLink *GLVNum;int VisitedVNum;void CreateGLink(int GVNumVNum) / 建立邻接表 / int i,j;struct GLink *p,*q;for (i=0; i 0) / 将该点加入邻接表 / p-Right = Gij;if (GLi = NULL)GLi = p;elseq-Relat = p;q = p;void DFS(int AVNumVNum, int V) / 用于进行深度优先遍历的子函数,V 是起点 / int i
14、;printf(“ %d “, V);VisitedV = 1; / 将其标记为已访问 / for (i = 0; i 0) void duiban(int a10,int n,int key) int low,high,mid,flag;low=0;high=n-1;flag=0;while(lowamid) low=mid+1;else high=mid-1;if(flag=1) printf(“是第%d 个元素“,mid+1);else printf(“E“);void maopao(int a10,int n) int i,j,temp,flag;int jiao,tang;jiao=
15、tang=0;for(i=0;i=high) return(0); i=low;j=high;temp=ai;while(i!=j) while(aj=temp) if(ji) ai+=aj;ji+; while(aii) i+; if(ji) aj-=ai;ji+;ai=temp; kuaishu(a,low,i-1); kuaishu(a,i+1,high); main()int i,a10,n,q,p,t;doprintf(“n1.用对半检索法,交互检索任意给定的关键字 KEY“); printf(“n2.用快速排序法对其进行排序,并统计交换次数“);printf(“n3.用冒泡排序法对
16、其进行排序,并统计交换次数和排序的趟数“);printf(“nplease write the order:“);scanf(“%d“,while(i4)printf(“nThe order you print is wrong!,please print again!“);scanf(“%d“,switch(i) case 1:printf(“please input :n“);for(n=0;n10;n+) scanf(“%d“,doprintf(“please input :n“);scanf(“%d“,duiban(a,10,q);printf(“:n“);scanf(“%d“,whi
17、le(p=1);break;case 2:ji=0;printf(“please input data:n“);for(n=0;n8;n+) scanf(“%d“,kuaishu(a,0, 9);printf(“n 快速排序的交换次数是 %d“,ji);printf(“n 结果是 “);for(n=0;n10;n+) printf(“%d “,an);break;case 3:printf(“please input data:n“);for(n=0;n10;n+) scanf(“%d“,maopao(a,10);printf(“n 结果是 “);for(n=0;n10;n+) printf(“%d “,an);break;case 4:printf(“GOODBYE!“);while(i!=4);运行结果:实验总结:子函数书上都有,所以主要函数都是参考书上的程序。在计数时,计数的位置上出了点问题,通过认真读函数和一步一步试,得到最终的结果。实验心得:三次计算机软件技术实验已经结束了,经过这次实验的锻炼,让我学到了许多东西,也认识到了自己在学习及编程方面的一些不足之处。