《数据结构》(C语言版)严蔚敏著-数据结构实验指导

发布时间:2022-07-01 12:30:04

下面是小编为大家整理的《数据结构》(C语言版)严蔚敏著-数据结构实验指导,供大家参考。

《数据结构》(C语言版)严蔚敏著-数据结构实验指导

 

 《数据结构》(C 语言版)严蔚敏著-数据结构实验指导

 /学年第学期

 姓名:

 学号:

 班级:

 指导教师:

  数学与统计学院

  2022

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

 1、复习C 语言中函数、数组、指针、结构体与共用体等的概念。2、熟悉利用C 语言进行程序设计的一般方法。

 二、实验预习

 说明以下C 语言中的概念 1、函数:

 2、数组:

 3、指针:

 4、结构体

 5、共用体

 三、实验内容和要求

 1、调试程序:输出 100 以内所有的素数(用函数实现)。#include intiprime(intn){/某判断一个数是否为素数某/intm;for(m=2;m 某 m<=n;m++)

 if(n%m==0)return0;return1;

 }

 intmain(){/某输出 100 以内所有素数某/ inti;printf(\for(i=2;i<100;i++) if(iprime(i)==1)printf(\return0; }

 运行结果:

 2、调试程序:对一维数组中的元素进行逆序排列。#include#defineN10intmain(){ 2

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

 printf(\for(i=0;i

 temp=a[i];a[i]=a[N-i-1];a[N-i-1]=temp; printf(\for(i=0;i return0;}

 运行结果:

 3、调试程序:在二维数组中,若某一位置上的元素在该行中最大, 而在该列中最小,则该元素即为该二维数组的一个鞍点。要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点找出来。#include

 #defineM3#defineN4intmain(){inta[M][N],i,j,k;printf(\请输入二维数组的数据:\\n\ for(i=0;i for(j=0;j for(j=0;j for(i=0;i /某找出第i 行的最大值某/ if(a[i][j]>a[i][k])k=j; for(j=0;j if(a[j][k]

 /某在第i 行找到鞍点某/ break;if(j==M) printf(\ 3

 }

 return0;}

 运行结果:

 4、调试程序:利用指针输出二维数组的元素。#includeintmain(){ inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int 某 p;

 for(p=a[0];p printf(\ return0;} 运行结果:

 5、调试程序:设有一个教师与学生通用的表格,教师的数据有姓名、年龄、职业、教研室四项,学生有姓名、年龄、专业、班级四项,编程输入人员的数据,再以表格输出。#include #defineN10tructtudent{charname[8];/某姓名某/intage;/某年龄某 /charjob;/某职业或专业,用或t 表示学生或教师某/ union{ intcla;

 /某班级某/

 charoffice[10];/某教研室某/}depa;

 }tu[N];intmain(){ inti;intn; printf(“\\n 请输入人员数(<10):\\n”);canf(“%d”,&n);for(i=0;i canf(\if(tu[i].job==’’)canf(\

 4

 ele

 canf(\}printf(“nameagejobcla/office”);for(i=0;i if(tu[i].job==’’) printf(\ eleprintf(\ }

 }

 四、实验小结五、教师评语5 intmain(){

 SqStack; printf(\CreateStack(&); printf(\PrintStack(&);return0; }算法分析:输入元素序列 12345,为什么输出序列为 54321?体现了栈的什么 特性?

 2、在第 1 题的程序中,编写一个十进制转换为二进制的数制转换算法函数(要求利用栈来实现),并验证其正确性。实现代码 验证

 3、阅读并运行程序,并分析程序功能。#include#include#include#defineM20 #defineelemtypechartypedeftruct{ elemtypetack[M];inttop;} tacknode; voidinit(tacknode 某t);

 voidpuh(tacknode 某t,elemtype 某);voidpop(tacknode 某t);

 16

 voidinit(tacknode 某t){ t->top=0;} voidpuh(tacknode 某t,elemtype 某){ if(t->top==M) printf(\ele{

 t->top=t->top+1;t->tack[t->top]=某;}} voidpop(tacknode 某t){ if(t->top>0)t->top--; eleprintf(“StackiEmpty!\\n”);} intmain(){ char[M];inti;

 tacknode 某 p; printf(\p=malloc(izeof(tacknode));init(p); printf(\get(); for(i=0;i if([i]=="(") puh(p,[i]);if([i]==")")pop(p);} if(p->top==0) printf(\ele printf(\return0;} 输入:2+((c-d)某 6-(f-7)某a)/6 运行结果:

 输入:a-((c-d)某 6-(/3-某)/2 运行结果:程序的基本功能:

  17

 以下为选做实验:

 4、设计算法,将一个表达式转换为后缀表达式,并按照后缀表达式进行计算,得出表达式得结果。实现代码 5、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点(不设队头指针),试编写相应的置空队列、入队列、出队列的算法。实现代码:

 四、实验小结五、教师评语

 18

 实验三串的模式匹配一、实验目的

 1、了解串的基本概念

 2、掌握串的模式匹配算法的实现二、实验预习

 说明以下概念 1、模式匹配:

 2、BF 算法:

 3、KMP 算法:

 三、实验内容和要求

 1、阅读并运行下面程序,根据输入写出运行结果。#include#include#defineMA 某SIZE100typedeftruct{ chardata[MA 某SIZE];intlength;}SqString;

 voidtrSub(SqString 某,inttart,intublen,SqString 某ub);/某求子串某/ voidhow_ubString(); printf(\ 19

 for(i=0;ilength&&ilength;i++)if(1->data[i]!=2->data[i]) return1->data[i]-2->data[i];return1->length-2->length;

 printf(\get(1.data); 1.length=trlen(1.data);printf(\get(2.data); 2.length=trlen(2.data); printf(\ele printf(\ printf(\} voidtrSub(SqString 某,inttart,intublen,SqString 某ub){ inti; if(tart<1||tart>->length||ublen>->length-tart+1){ub- >length=0;}

 for(i=0;i

 ub->data[i]=->data[tart+i-1];ub->length=ublen;} voidhow_ubString(){SqString,ub; inttart,ublen,i; printf(\printf(\get(.data);

 .length=trlen(.data);printf(\canf(\ printf(\canf(\ trSub(&,tart,ublen,&ub);if(ub.length==0)printf(\ele{ printf(\for(i=0;i

 printf(\} printf(\ 20 }

 intmain(){intn;do{ printf(\printf(\printf(\printf(\printf(\canf(\getchar(); witch(n){ }while(n);return0;} 运行程序 输入:1 1

 tudenttudent

 2 2

  运行结果:

 2、实现串的模式匹配算法。补充下面程序,实现串的BF 和 KMP 算法。#include#include#defineMA 某SIZE100typedeftruct{ chardata[MA 某SIZE];intlength;

 }SqString;

 intinde 某_bf(SqString 某,SqString 某t,inttart);

 21

 voidgetNe 某t(SqString 某t,intne 某t[]);

 intinde 某_kmp(SqString 某,SqString 某t,inttart,intne 某t[]);voidhow_inde 某(); intinde 某_bf(SqString 某,SqString 某t,inttart){ 补充代码 } voidgetNe 某t(SqString 某t,intne 某t[]){inti=0,j=-1;ne 某t[0]=-1; while(ilength){

 if((j==-1)||(t->data[i]==t->data[j])){ i++;j++;ne 某 t[i]=j;}ele j=ne 某t[j];}}

 intinde 某_kmp(SqString 某,SqString 某t,inttart,intne 某t[]){补充代码 } voidhow_inde 某(){SqString,t; intk,ne 某t[MA 某SIZE]={0},i; printf(\printf(\ 22

 get(.data);

 .length=trlen(.data);printf(\get(t.data); t.length=trlen(t.data); printf(\canf(\

 printf(\getNe 某t(&t,ne 某t);printf(\printf(\for(i=0;i printf(\printf(\} intmain(){

 how_inde 某();return0;

 }

 输入:

 abcaabbabcabaacbacbaabcabaa1

 运行结果:

 四、实验小结五、教师评语

 23

 实验四二叉树一、实验目的

 1、掌握二叉树的基本特性

 2、掌握二叉树的先序、中序、后序的递归遍历算法 3、理解二叉树的先序、中序、后序的非递归遍历算法 4、通过求二叉树的深度、叶子结点数和层序遍历等算法,理解二叉树的基本特性 二、实验预习

  说明以下概念 1、二叉树:

 2、递归遍历:

 3、非递归遍历:

 4、层序遍历:

 三、实验内容和要求

 1、阅读并运行下面程序,根据输入写出运行结果,并画出二叉树的形态。#include#include#defineMA 某 20 typedeftructBTNode{/某节点结构声明某/chardata;/某节点数据某/ tructBTNode 某lchild; tructBTNode 某rchild;/某指针某/

 }某BiTree;

 voidcreateBiTree(BiTree 某t){/某先序遍历创建二叉树某/char; BiTreeq; printf(\=getche(); if(=="#"){某t=NULL;return;} q=(BiTree)malloc(izeof(tructBTNode)); if(q==NULL){printf(\q->data=; 某 t=q;

 createBiTree(&q->lchild);/某递归建立左子树某 /createBiTree(&q->rchild);/某递归建立右子树某/

 24

 }

 voidPreOrder(BiTreep){/某先序遍历二叉树某/if(p!=NULL){ printf(\PreOrder(p->lchild);PreOrder(p->rchild);}} voidInOrder(BiTreep){/某中序遍历二叉树某/if(p!=NULL){ InOrder(p->lchild);printf(\InOrder(p->rchild);}} voidPotOrder(BiTreep){/某后序遍历二叉树某/if(p!=NULL){ PotOrder(p->lchild);PotOrder(p->rchild);printf(\ }}

 voidPreorder_n(BiTreep){/某先序遍历的非递归算法某 /BiTreetack[MA 某],q;inttop=0,i; for(i=0;i while(q!=NULL){ printf(\ if(q->rchild!=NULL)tack[top++]=q->rchild;if(q- >lchild!=NULL)q=q->lchild;ele if(top>0)q=tack[--top];eleq=NULL;}} voidreleae(BiTreet){/某释放二叉树空间某/if(t!=NULL){ releae(t->lchild);releae(t->rchild);free(t);

 25

 for(i=0;i intmain(){ graphga; inti,j; createGraph(&ga);

 printf(\无向图的邻接矩阵:\\n\ for(i=0;i for(j=0;j printf(\printf(\} init_viit();tdf(&ga);init_viit();tbf(&ga);return0;

 }

 根据右图的结构验证实验,输入:

 ABCDEFGH#0,10,20,51,31,42,52,63,74,7- - 1,- -1 1

  2、阅读并运行下面程序,补充拓扑排序算法。#include#include#defineN20 运行结果:

 10B4E7HAC2F5G6

 3D31

 typedeftructedgenode{/某图的邻接表:邻接链表结点某/intadjve 某;/某顶点序号某/ tructedgenode 某ne 某t;/某下一个结点的指针某/}edgenode;

 typedeftructvnode{/某图的邻接表:邻接表某/chardata;/某顶点信息某/ intind;/某顶点入度某/ tructedgenode 某link;/某指向邻接链表指针某/}vnode; voidcreateGraph_lit(vnodeadjlit[],int 某p);/某建立有向图的 邻接表某/voidtopSort(vnodeg[],intn);/某拓扑排序某/

 voidcreateGraph_lit(vnodeadjlit[],int 某p){/某建立有向图的邻接表某/inti,j,n,e;charv; edgenode 某;i=0;n=0;e=0;

 printf(\输入顶点序列(以#结束):\\n\while((v=getchar())!="#")

 {

 adjlit[i].data=v;/某读入顶点信息某 /adjlit[i].link=NULL;adjlit[i].ind=0;i++;} n=i;某 p=n; /某建立邻接链表某/

 printf(\请输入弧的信息(i=-1 结束):i,j:\\n\canf(\ while(i!=-1){

 =(tructedgenode 某)malloc(izeof(edgenode));->adjve 某=j;

 ->ne 某 t=adjlit[i].link;adjlit[i].link=; adjlit[j].ind++;/某顶点j 的入度加 1 某/e++; canf(\} printf(\邻接表:\ for(i=0;i printf(\ 32

 =adjlit[i].link; while(!=NULL){ printf(\=->ne 某t;}}} voidtopSort(vnodeg[],intn){/某拓扑排序某/} intmain(){ vnodeadjlit[N];intn, 某 p;p=&n; createGraph_lit(adjlit,p);return0; }

 根据输入,输出有向图的拓扑排序序列。并画出有向图。输入 :ABCDEF#0,11,22,34,14,5- - 1,- -1 1

 运行结果:

 33

 3、阅读并运行下面程序。

 #include#defineN20#defineTRUE1

 #defineINF32766/某邻接矩阵中的无穷大元素某 /#defineINFIN32767/某比无穷大元素大的数某/

 typedeftruct{/某图的邻接矩阵某/intve 某num,arcnum;charve 某[N];intarc[N][N];} graph;

 voidcreateGraph_w(graph 某g,intflag);voidprim(graph 某g,intu);voiddijktra(graphg,intv);voidhowprim();voidhowdij(); /某建带权图的邻接矩阵,若flag 为 1 则为无向图,flag 为 0 为有向图某/voidcreateGraph_w(graph 某g,intflag){ inti,j,w;charv; g->ve 某num=0; g->arcnum=0;i=0;

 printf(\输入顶点序列(以#结束):

 \\n\while((v=getchar())!="#"){

 g->ve 某[i]=v;/某读入顶点信息某/i++;} g->ve 某num=i; for(i=0;i<6;i++)/某邻接矩阵初始化某/for(j=0;j<6;j++) g->arc[i][j]=INF;

 printf(\输入边的信息:\\n\

 canf(\读入边(i,j,w)某/while(i!=-1)/某读入i 为-1 时结束某/{ g->arc[i][j]=w; 34

 if(flag==1)

 g->arc[j][i]=w; canf(\}} voidprim(graph 某g,intu)/某出发顶点u 某/{ intlowcot[N],cloet[N],i,j,k,min; for(i=0;ive 某num;i++)/某求其他顶点到出发顶点u 的权某/{ lowcot[i]=g->arc[u][i];cloet[i]=u;} lowcot[u]=0;

 for(i=1;ive 某num;i++)/某循环求最小生成树中的各条边某 /{min=INFIN;

 for(j=0;jve 某num;j++)/某选择得到一条代价最小的边某 /if(lowcot[j]!=0&&lowcot[j] min=lowcot[j]; k=j;}

 printf(\/某输出该边某/

 lowcot[k]=0;/某顶点k 纳入最小生成树某/

 for(j=0;jve 某num;j++)/某求其他顶点到顶点k 的权某/if(g- >arc[k][j]!=0&&g->arc[k][j]

 lowcot[j]=g->arc[k][j];cloet[j]=k;}}} voidprintPath(graphg,inttartVe 某,intEndVe 某){ inttack[N],top=0;/ 某 堆 栈 某 /inti,k,j; intflag[N];/某输出路径顶点标志某/k=EndVe 某; for(i=0;i 35

 printf(\ flag[j]=1; tack[top++]=k; while(top>0)/某找j 到k 的路径某/{ for(i=0;i if(path[k][i]==1&&flag[i]==0)/某 j 到k 的路径含有i 顶点某/{ if(g.arc[j][i]!=INF)/某 j 到i 的路径含有...

推荐访问:《数据结构》(C语言版)严蔚敏著-数据结构实验指导 数据结构 语言版 指导

版权所有:众一秘书网 2005-2024 未经授权禁止复制或建立镜像[众一秘书网]所有资源完全免费共享

Powered by 众一秘书网 © All Rights Reserved.。备案号: 辽ICP备05005627号-1