数据结构实训指导书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,而ajB。设计一比较大小的程序。

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);

相关文档
最新文档