数据结构实验指导.docx

上传人:b****6 文档编号:8389935 上传时间:2023-01-31 格式:DOCX 页数:55 大小:44.17KB
下载 相关 举报
数据结构实验指导.docx_第1页
第1页 / 共55页
数据结构实验指导.docx_第2页
第2页 / 共55页
数据结构实验指导.docx_第3页
第3页 / 共55页
数据结构实验指导.docx_第4页
第4页 / 共55页
数据结构实验指导.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

数据结构实验指导.docx

《数据结构实验指导.docx》由会员分享,可在线阅读,更多相关《数据结构实验指导.docx(55页珍藏版)》请在冰豆网上搜索。

数据结构实验指导.docx

数据结构实验指导

《数据结构》实验指导及报告书

(ver3.1,2011)

2011/2012学年第一学期

姓名:

_______

学号:

__

班级:

指导教师:

 

数学与计算机科学学院

2011

预备实验C语言的函数数组指针结构体知识

一、实验目的

1、复习C语言中函数、数组、指针、结构体与共用体等的概念。

2、熟悉利用C语言进行程序设计的一般方法。

二、实验预习

说明以下C语言中的概念

1、函数:

函数是C语言程序的部件,也就是说,设计C语言程序就是设计其构成函数。

2、数组:

数组是指一组同类型数据所组成的序列。

它有如下3个特点。

(1)组织了一组同类型数据并用一个名字命名。

(2)这组数据被存在内存的一块连续区域中。

(3)这组数据具有顺序关系,组成它的每个元素可以通过序号进行访问。

3、指针:

一个变量的内存地址就称为指向该变量的指针。

4、结构体:

(structure,也称“结构”)就是C语言所提供的处理一组不同类型数据的类型,也称为集合数据类型,用于将不同类型数据组织在一个名字下。

5、共用体:

是指将不同的数据项存放于同一段内存空间的一种构造数据类型,它允许在一个存储空间内存储不同类型的变量。

三、实验内容和要求

1、调试程序:

输出100以内所有的素数(用函数实现)。

#include

intisprime(intn){/*判断一个数是否为素数*/

intm;

for(m=2;m*m<=n;m++)

if(n%m==0)return0;

return1;

}

intmain(){/*输出100以内所有素数*/

inti;printf("\n");

for(i=2;i<100;i++)

if(isprime(i)==1)printf("%4d",i);

return0;

}

运行结果:

2357111317192329313741434753596167717379838997Pressanykeytocontinue

 

2、调试程序:

对一维数组中的元素进行逆序排列。

#include

#defineN10

intmain(){

inta[N]={0,1,2,3,4,5,6,7,8,9},i,temp;

printf("\ntheoriginalArrayis:

\n");

for(i=0;i

printf("%4d",a[i]);

for(i=0;i

temp=a[i];

a[i]=a[N-i-1];

a[N-i-1]=temp;

}

printf("\nthechangedArrayis:

\n");

for(i=0;i

printf("%4d",a[i]);

return0;

}

运行结果:

theoriginalArrayis:

0123456789

thechangedArrayis:

9876543210Pressanykeytocontinue

3、调试程序:

在二维数组中,若某一位置上的元素在该行中最大,而在该列中最小,则该元素即为该二维数组的一个鞍点。

要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点找出来。

#include

#defineM3

#defineN4

intmain(){

inta[M][N],i,j,k;

printf("\n请输入二维数组的数据:

\n");

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

for(i=0;i

for(j=0;j

printf("%4d",a[i][j]);

printf("\n");

}

for(i=0;i

k=0;

for(j=1;j

if(a[i][j]>a[i][k])

k=j;

for(j=0;j

if(a[j][k]

break;

if(j==M)/*在第i行找到鞍点*/

printf("%d,%d,%d\n",a[i][k],i,k);

}

return0;

}

运行结果:

请输入二维数组的数据:

122

145

456

789

1221

4545

6789

2,0,1

Pressanykeytocontinue

4、调试程序:

利用指针输出二维数组的元素。

#include

intmain(){

inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;

for(p=a[0];p

if((p-a[0])%4==0)printf("\n");

printf("%4d",*p);

}

return0;

}

运行结果:

1357

9111315

17192123Pressanykeytocontinue

5、调试程序:

设有一个教师与学生通用的表格,教师的数据有姓名、年龄、职业、教研室四项,学生有姓名、年龄、专业、班级四项,编程输入人员的数据,再以表格输出。

#include

#defineN10

structstudent{

charname[8];/*姓名*/

intage;/*年龄*/

charjob;/*职业或专业,用s或t表示学生或教师*/

union{

intclass;/*班级*/

charoffice[10];/*教研室*/

}depa;

}stu[N];

intmain(){

inti;intn;

printf(“\n请输入人员数(<10):

\n”);

scanf(“%d”,&n);

for(i=0;i

printf("\n请输入第%d人员的信息:

(nameagejobclass/office)\n",i+1);

scanf("%s,%d,%c",stu[i].name,&stu[i].age,&stu[i].job);

if(stu[i].job==’s’)

scanf("%d",&stu[i].depa.class);

else

scanf("%s",stu[i].depa.office);

}

printf(“nameagejobclass/office”);

for(i=0;i

if(stu[i].job==’s’)

printf("%s%3d%3c%d\n",stu[i].name,stu[i].age,stu[i].job,stu[i].depa.class);

else

printf("%s%3d%3c%s\n",stu[i].name,stu[i].age,stu[i].job,stu[i].depa.office);

}

}

输入的数据:

2

Wang19s99061

Li36tcomputer

运行结果:

请输入人员数(<10):

2

请输入第1人员的信息:

(nameagejobclass/office)

Wang19s99061

请输入第2人员的信息:

(nameagejobclass/office)

nameagejobclass/officeWang0

 

四、实验小结

这一小结试验主要的目标是复习,复习包括结构体,共用体,数组,指针的概念,让大家更熟练的操作《C语言程序设计教程》一书中的知识,并对其系统的运用有一个更好的掌握。

通过这一个试验,我们能更好的运用C语言知识设计一些比较简单的程序,并且在C++环境中能顺利的运行得到想要的结果。

能把一个程序设计的问题通过几种不同的函数以及设计方法得到相同的结果,并且合理的说出其内存利用率的大小(分空间利用率和时间利用率)。

比较其优劣。

 

五、教师评语

 

实验一顺序表与链表

一、实验目的

1、掌握线性表中元素的前驱、后续的概念。

2、掌握顺序表与链表的建立、插入元素、删除表中某元素的算法。

3、对线性表相应算法的时间复杂度进行分析。

4、理解顺序表、链表数据结构的特点(优缺点)。

二、实验预习

说明以下概念

1、线性表:

2、顺序表:

3、链表:

是指将若干数组(每一个数组称为一个“结点”)按一定规则连接起来的数据结构。

三、实验内容和要求

1、阅读下面程序,在横线处填写函数的基本功能。

并运行程序,写出结果。

#include

#include

#defineERROR0

#defineOK1

#defineINIT_SIZE5/*初始分配的顺序表长度*/

#defineINCREM5/*溢出时,顺序表长度的增量*/

typedefintElemType;/*定义表元素的类型*/

typedefstructSqlist{

ElemType*slist;/*存储空间的基地址*/

intlength;/*顺序表的当前长度*/

intlistsize;/*当前分配的存储空间*/

}Sqlist;

intInitList_sq(Sqlist*L);/*判断顺序表长度是否为0*/

intCreateList_sq(Sqlist*L,intn);/*输入顺序表中的元素*/

intListInsert_sq(Sqlist*L,inti,ElemTypee);/*输出顺序表中某个元素的内存地址*/

intPrintList_sq(Sqlist*L);/*输出顺序表的元素*/

intListDelete_sq(Sqlist*L,inti);/*删除第i个元素*/

intListLocate(Sqlist*L,ElemTypee);/*查找值为e的元素*/

intInitList_sq(Sqlist*L){

L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));

if(!

L->slist)returnERROR;

L->length=0;

L->listsize=INIT_SIZE;

returnOK;

}/*InitList*/

intCreateList_sq(Sqlist*L,intn){

ElemTypee;

inti;

for(i=0;i

printf("inputdata%d",i+1);

scanf("%d",&e);

if(!

ListInsert_sq(L,i+1,e))

returnERROR;

}

returnOK;

}/*CreateList*/

/*输出顺序表中的元素*/

intPrintList_sq(Sqlist*L){

inti;

for(i=1;i<=L->length;i++)

printf("%5d",L->slist[i-1]);

returnOK;

}/*PrintList*/

intListInsert_sq(Sqlist*L,inti,ElemTypee){

intk;

if(i<1||i>L->length+1)

returnERROR;

if(L->length>=L->listsize){

L->slist=(ElemType*)realloc(L->slist,

(INIT_SIZE+INCREM)*sizeof(ElemType));

if(!

L->slist)

returnERROR;

L->listsize+=INCREM;

}

for(k=L->length-1;k>=i-1;k--){

L->slist[k+1]=L->slist[k];

}

L->slist[i-1]=e;

L->length++;

returnOK;

}/*ListInsert*/

/*在顺序表中删除第i个元素*/

intListDelete_sq(Sqlist*L,inti){

 

}

/*在顺序表中查找指定值元素,返回其序号*/

intListLocate(Sqlist*L,ElemTypee){

 

}

intmain(){

Sqlistsl;

intn,m,k;

printf("pleaseinputn:

");/*输入顺序表的元素个数*/

scanf("%d",&n);

if(n>0){

printf("\n1-CreateSqlist:

\n");

InitList_sq(&sl);

CreateList_sq(&sl,n);

printf("\n2-PrintSqlist:

\n");

PrintList_sq(&sl);

printf("\npleaseinputinsertlocationanddata:

(location,data)\n");

scanf("%d,%d",&m,&k);

ListInsert_sq(&sl,m,k);

printf("\n3-PrintSqlist:

\n");

PrintList_sq(&sl);

printf("\n");

}

else

printf("ERROR");

return0;

}

●运行结果

pleaseinputn:

5

1-CreateSqlist:

inputdata12

inputdata23

inputdata34

inputdata45

inputdata56

2-PrintSqlist:

23456

pleaseinputinsertlocationanddata:

(location,data)

5

3-PrintSqlist:

2345-8589934606

Pressanykeytocontinue

●算法分析

 

2、为第1题补充删除和查找功能函数,并在主函数中补充代码验证算法的正确性。

删除算法代码:

 

●运行结果

 

●算法分析

 

查找算法代码:

 

●运行结果

 

●算法分析

 

3、阅读下面程序,在横线处填写函数的基本功能。

并运行程序,写出结果。

#include

#include

#defineERROR0

#defineOK1

typedefintElemType;/*定义表元素的类型*/

typedefstructLNode{/*线性表的单链表存储*/

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

LinkListCreateList(intn);/**/

voidPrintList(LinkListL);/*输出带头结点单链表的所有元素*/

intGetElem(LinkListL,inti,ElemType*e);/**/

LinkListCreateList(intn){

LNode*p,*q,*head;

inti;

head=(LinkList)malloc(sizeof(LNode));head->next=NULL;

p=head;

for(i=0;i

q=(LinkList)malloc(sizeof(LNode));printf("inputdata%i:

",i+1);

scanf("%d",&q->data);/*输入元素值*/

q->next=NULL;/*结点指针域置空*/

p->next=q;/*新结点连在表末尾*/

p=q;

}

returnhead;

}/*CreateList*/

voidPrintList(LinkListL){

LNode*p;

p=L->next;/*p指向单链表的第1个元素*/

while(p!

=NULL){

printf("%5d",p->data);

p=p->next;

}

}/*PrintList*/

intGetElem(LinkListL,inti,ElemType*e){

LNode*p;intj=1;

p=L->next;

while(p&&j

p=p->next;j++;

}

if(!

p||j>i)

returnERROR;

*e=p->data;

returnOK;

}/*GetElem*/

intmain(){

intn,i;ElemTypee;

LinkListL=NULL;/*定义指向单链表的指针*/

printf("pleaseinputn:

");/*输入单链表的元素个数*/

scanf("%d",&n);

if(n>0){

printf("\n1-CreateLinkList:

\n");

L=CreateList(n);

printf("\n2-PrintLinkList:

\n");

PrintList(L);

printf("\n3-GetElemfromLinkList:

\n");

printf("inputi=");

scanf("%d",&i);

if(GetElem(L,i,&e))

printf("No%iis%d",i,e);

else

printf("notexists");

}else

printf("ERROR");

return0;

}

●运行结果

 

●算法分析

 

4、为第3题补充插入功能函数和删除功能函数。

并在主函数中补充代码验证算法的正确性。

插入算法代码:

 

●运行结果

 

●算法分析

 

删除算法代码:

 

●运行结果

 

●算法分析

 

以下为选做实验:

5、循环链表的应用(约瑟夫回环问题)

n个数据元素构成一个环,从环中任意位置开始计数,计到m将该元素从表中取出,重复上述过程,直至表中只剩下一个元素。

提示:

用一个无头结点的循环单链表来实现n个元素的存储。

●算法代码

 

6、设一带头结点的单链表,设计算法将表中值相同的元素仅保留一个结点。

提示:

指针p从链表的第一个元素开始,利用指针q从指针p位置开始向后搜索整个链表,删除与之值相同的元素;指针p继续指向下一个元素,开始下一轮的删除,直至p==null为至,既完成了对整个链表元素的删除相同值。

●算法代码

 

四、实验小结

 

五、教师评语

实验二栈和队列

一、实验目的

1、掌握栈的结构特性及其入栈,出栈操作;

2、掌握队列的结构特性及其入队、出队的操作,掌握循环队列的特点及其操作。

二、实验预习

说明以下概念

1、顺序栈:

2、链栈:

3、循环队列:

4、链队

三、实验内容和要求

1、阅读下面程序,将函数Push和函数Pop补充完整。

要求输入元素序列12345e,运行结果如下所示。

#include

#include

#defineERROR0

#defineOK1

#defineSTACK_INT_SIZE10/*存储空间初始分配量*/

#defineSTACKINCREMENT5/*存储空间分配增量*/

typedefintElemType;/*定义元素的类型*/

typedefstruct{

ElemType*base;

ElemType*top;

intstacksize;/*当前已分配的存储空间*/

}SqStack;

intInitStack(SqStack*S);/*构造空栈*/

intpush(SqStack*S,ElemTypee);/*入栈*/

intPop(SqStack*S,ElemType*e);/*出栈*/

intCreateStack(SqStack*S);/*创建栈*/

voidPrintStack(SqStack*S);/*出栈并输出栈中元素*/

intInitStack(SqStack*S){

S->base=(ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));

if(!

S->base)returnERROR;

S->top=S->base;

S->stacksize=STACK_INT_SIZE;

returnOK;

}/*InitStack*/

intPush(SqStack*S,ElemTypee){

}/*Push*/

intPop(SqStack*S,ElemType*e){

}/*Pop*/

intCreateStack(SqStack*S){

inte;

if(InitStack(S))

printf("InitSuccess!

\n");

else{

printf("InitFail!

\n");

returnERROR;

}

printf("inputdata:

(Terminatedbyinputingacharacter)\n");

while(scanf("%d",&e))

Push(S,e);

returnOK;

}/*CreateStack*/

voidPrintStack(SqStack*S){

ElemTypee;

while(Pop(S,&e))

printf("%3d",e);

}/*Pop_and_Print*/

intmain(){

SqStackss;

printf("\n1-createStack\n");

CreateStack(&ss);

printf("\n2-Pop&Pr

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1