数据结构实训指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机实习指导
雷东升编写
北京工业大学
2010.09
数据结构上机实习指导------目录
目录
目录 (1)
线性表实训指导 (3)
栈和队列实训指导 (7)
串实训指导 (13)
数组实训指导 (21)
树实训指导 (25)
图实训指导 (32)
查找实训指导 (37)
排序实训指导 (38)
线性表实训指导
【实训1】顺序表的应用
1.实训说明
本实训是有关线性表的顺序存储结构的应用,在本实训的实例程序中,通过C语言中提供的数组来存储两个已知的线性表,然后利用数组元素的下标来对线性表进行比较。通过对本实训的学习,可以理解线性表在顺序存储结构下的操作方法。
在实训中,我们设A=(a1,a2,…,an)和B=(b1,b2,…,bm)是两个线性表,其数据元素的类型是整型。若n=m,且ai=bi,则称A=B; 若ai=bi,而aj
2.程序分析
已知A和B是两个线性表,且其数据元素为整型数据,因此,可以使用线性表的顺序存储结构来实现,在C语言中,可以使用一维数组来存储顺序表。
1)初始化两个线性表:输入两个数组A和B。
2)调用子函数int compare(int A[],int B[],int m)比较两个数组的大小:比较A[i]和B[i]:若A[i]>B[i] 返回BIG
若A[i]
若A[i]= =B[i]且i 3.程序源代码 该实例程序的源代码如下: #include "stdio.h" #define MAXSIZE 100 /*最大数组元素个数*/ #define BIG 1 #define SMALL -1 #define EQUAL 0 int compare(int A[],int B[],int m) /*比较数组数据*/ {int i; for(i=0;i {if (A[i]>B[i]) return BIG; /*返回在A>B*/ else if (A[i] return SMALL; /*返回在A } return EQUAL; /*返回在A=B*/ } /*主程序*/ main() { int A[MAXSIZE],B[MAXSIZE]; int m ,s,i; printf("请输入数据的大小m(0-100):"); scanf("%d",&m); while (m<=0 && m>=MAXSIZE) { printf("请输入数据的大小m(0-100):"); scanf("%d",&m); } for(i=0;i { printf("请输入数组A的第%d个数组元素",i+1); scanf("%d",&A[i]); } for(i=0;i { printf("请输入数组B的第%d个数组元素",i+1); scanf("%d",&B[i]); } s=compare(A,B,m); if (s==BIG) printf("数组A大于数组B"); else if (s==SMALL) printf("数组A小于数组B"); else printf("数组A等于数组B"); } 最后程序运行结果如下所示: 请输入数据的大小m(0-100):3↙<回车> 请输入数据A的第1个数组元素1↙<回车> 请输入数据A的第2个数组元素2↙<回车> 请输入数据A的第3个数组元素3↙<回车> 请输入数据B的第1个数组元素1↙<回车> 请输入数据B的第2个数组元素2↙<回车> 请输入数据B的第3个数组元素4↙<回车> 数组A小于数组B 【实训2】链表的应用 1.实训说明 本实训是有关线性表的链式存储结构的应用,在本实训的实例程序中,通过C语言中提供的结构指针来存储线性表,利用malloc函数动态地分配存储空间。通过对本实训的学习,可以理解线性表在链序存储结构下的操作方法。 在实训中,我们设计一个程序求出约瑟夫环的出列顺序。约瑟夫问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。例如,n=7,7个人的密码依次为:3,1,7,2,4,8,4,m的初值取6,则正确的出列顺序应为6,1,4,7,2,3,5。要求使用单向循环链表模拟此出列过程。 2.程序分析 约瑟夫环的大小是变化的,因此相应的结点也是变化的,使用链式存储结构可以动态的生成其中的结点,出列操作也非常简单。用单向循环链表模拟其出列顺序比较合适。 用结构指针描述每个人: struct Joseph {int num;/*环中某个人的序号*/ int secret;/环中某个人的密码*/ struct Joseph *next;/指向其下一个的指针*/}; 1)初始化约瑟夫环: 调用函数struct Joseph *creat()生成初始约瑟夫环。在该函数中使用head 指向表头。输入序号为0时结束,指针p1指向的最后结束序号为0的结点没有加入到链表中,p2 指向最后一个序号为非0 的结点(最后一个结点)。 2)报数出列: 调用函数voil sort(struct Joseph * head,int m),使用条件p1->next!=p1判断单向链表非空,使用两个指针变量p1和p2,语句p2=p1;p1=p1->next;移动指针,计算结点数(报数);结点p1出列时直接使用语句:p2->next=p1->next,取出该结点中的密码作为新的循环终值。 3.程序源代码 该实例程序的源代码如下: #define NULL 0 #define LENGTH sizeof(struct Joseph) #include "stdlib.h" #include "stdio.h" struct Joseph {int num; int secret; struct Joseph *next; }; /*定义结点num为序号,secret为密码*/ /*创建初始链表函数*/ struct Joseph *creat() {struct Joseph *head; struct Joseph *p1,*p2; int n=0; p1=p2=(struct Joseph *)malloc(LENGTH); scanf("%d,%d",&p1->num,&p1->secret); head=NULL; while(p1->num!=0) {n=n+1; if(n= =1)head=p1; else p2->next=p1; p2=p1; p1=(struct Joseph *)malloc(LENGTH); scanf("%d,%d",&p1->num,&p1->secret); } p2->next=head; return(head);