版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。南阳理工学院数据结构上机实验指导书()软件学院·软件工程教研室.3目录TOC\o"1-1"\h\u实验1线性表应用 2实验2栈和队列的应用 2实验3线性表应用 3实验4图论及其应用 3实验5查找 4实验6排序 4实验1线性表应用一、实验目的了解和掌握线性表顺序存储和链式存储在计算机中的表示,基本操做在计算机中的实现。能够利用线性表结构对实际问题进行分析建模,利用计算机求解。能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合。二、实验内容及步骤利用程序设计语言分别实现顺序表和链表的抽象数据类型。掌握程序分文件(头文件和实现文件)书写的方式。分别用顺序表和链表实现课本算法2.2:合并两个非递减有序序列,并对其时间性能做出分析。P21#include"c1.h"typedefintElemType;#include"c2-1.h"#include"bo2-1.c"#include"func2-3.c"/*包括equal()、comp()、print()、print2()和print1()函数*/voidMergeList(SqListLa,SqListLb,SqList*Lc)/*算法2.2*/{/*已知线性表La和Lb中的数据元素按值非递减排列。*//*归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列*/inti=1,j=1,k=0;intLa_len,Lb_len;ElemTypeai,bj;InitList(Lc);/*创立空表Lc*/La_len=ListLength(La);Lb_len=ListLength(Lb);while(i<=La_len&&j<=Lb_len)/*表La和表Lb均非空*/{GetElem(La,i,&ai);GetElem(Lb,j,&bj);if(ai<=bj){ListInsert(Lc,++k,ai);++i;}else{ListInsert(Lc,++k,bj);++j;}}/*以下两个while循环只会有一个被执行*/while(i<=La_len)/*表La非空且表Lb空*/{GetElem(La,i++,&ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len)/*表Lb非空且表La空*/{GetElem(Lb,j++,&bj);ListInsert(Lc,++k,bj);}}voidmain(){SqListLa,Lb,Lc;intj,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};InitList(&La);/*创立空表La*/for(j=1;j<=4;j++)/*在表La中插入4个元素*/ListInsert(&La,j,a[j-1]);printf("La=");/*输出表La的内容*/ListTraverse(La,print1);InitList(&Lb);/*创立空表Lb*/for(j=1;j<=7;j++)/*在表Lb中插入7个元素*/ListInsert(&Lb,j,b[j-1]);printf("Lb=");/*输出表Lb的内容*/ListTraverse(Lb,print1);MergeList(La,Lb,&Lc);printf("Lc=");/*输出表Lc的内容*/ListTraverse(Lc,print1);}实验2栈和队列的应用一、实验目的掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。熟练掌握栈类型的两种实现方法。熟练掌握循环队列和链队列的基本操作实现算法。二、实验内容及步骤用程序设计语言实现栈和队列的抽象数据类型。在第一题的基础上完成以下选择:选择一:设计并实现括号匹配算法。用队列实现在屏幕上打印杨辉三角。选择二:分别用栈和队列实现迷宫问题求解。选择三:分别用栈和队列实现一个列车调度系统。1.importjava.util.Scanner;publicclass括号配对{publicstaticvoidmain(Stringargs[]){inttop=0;//堆指针booleanend=true;//不匹配时只输出一次charstack[]=newchar[100];//存括号Strings;System.out.println("请输入表示式:");Scannerscanner=newScanner(System.in);s=scanner.next();//表示式charbiao[]=s.toCharArray();//将字符串转化成字符数组System.out.println("表示式:"+s);for(inti=0;i<biao.length&&end;i++)//遍历表示式中所有字符{if(biao[i]=='(')//如果是(则入栈{stack[top]='(';top++;}elseif(biao[i]==')')//如果是)则出栈{if(!(top==0))top--;else{System.out.println("括号不匹配");end=false;}}}//除循环两种可能if(top==0&&end)System.out.println("括号匹配");//出循环stack空elseif(top!=0&&end)System.out.println("括号不匹配");//出循环时stack不空}}2.#include<stdio.h>#defineN11voidmain(){inti,j,a[N][N];for(i=1;i<N;i++){a[i][i]=1;a[i][1]=1;}for(i=3;i<N;i++)for(j=2;j<i;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=1;i<N;i++){for(j=1;j<=i;j++)printf("%6d",a[i][j]);printf("\n");}}实验3线性表应用一、实验目的领会并理解二叉树的类型定义。熟练掌握二叉树的主要特性,。熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树的其它操作。熟练掌握二叉树和树的各种存储结构及其建立的算法。二、实验内容及步骤实现二叉树的抽象数据类型。构造一棵二叉树并用递归实现其先序、中序、后序遍历算法并验证。用非递归算法实现二叉树的中序遍历。一、二叉树的抽象数据类型:
ADTBinaryTree{
//数据对象D:D是具有相同特性的数据元素的集合。
//数据关系R:
//
若D=Φ,则R=Φ,称BinaryTree为空二叉树;
//
若D≠Φ,则R={H},H是如下二元关系;
//
(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;
//
(2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr=Φ;
//
(3)若D1≠Φ,则D1中存在惟一的元素x1,<root,x1>∈H,且存在D1上的关系H1⊆H;若Dr≠Φ,则Dr中存在惟一的元素xr,<root,xr>∈H,且存在上的关系Hr⊆H;H={<root,x1>,<root,xr>,H1,Hr};
//
(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。
//基本操作:
InitBiTree(&T)
//操作结果:构造空二叉树T。
DestroyBiTree(&T)
//
初始条件:二叉树T已存在。
//
操作结果:销毁二叉树T。
CreateBiTree(&T,definition)
//
初始条件:definition给出二叉树T的定义。
//
操作结果:按definiton构造二叉树T。
ClearBiTree(&T)
//
初始条件:二叉树T存在。
//
操作结果:将二叉树T清为空树。
BiTreeEmpty(T)
//
初始条件:二叉树T存在。
//
操作结果:若T为空二叉树,则返回TRUE,否则返回FALSE。
BiTreeDepth(T)
//
初始条件:二叉树T存在。
//
操作结果:返回T的深度。
Root(T)
//
初始条件:二叉树T存在。
//
操作结果:返回T的根。
Value(T,e)
//
初始条件:二叉树T存在,e是T中某个结点。
//
操作结果:返回e的值。
Assign(T,&e,value)
//
初始条件:二叉树T存在,e是T中某个结点。
//
操作结果:结点e赋值为value。
Parent(T,e)
//
初始条件:二叉树T存在,e是T中某个结点。
//
操作结果:若e是T的非根结点,则返回它的双亲,否则返回”空”。
LeftChild(T,e)
//
初始条件:二叉树T存在,e是T中某个结点。
//
操作结果:返回e的左孩子。若e无左孩子,则返回”空”。
RightChild(T,e)
//
初始条件:二叉树T存在,e是T中某个结点。
//
操作结果:返回e的右孩子。若e无右孩子,则返回”空”。
LeftSibling(T,e)
//
初始条件:二叉树T存在,e是T中某个结点。
//
操作结果:返回e的左兄弟。若e是T的左孩子或无左兄弟,则返回”空”。
RightSibling(T,e)
//
初始条件:二叉树T存在,e是T中某个结点。
//
操作结果:返回e的右兄弟。若e是T的右孩子或无右兄弟,则返回”空”。
InsertChild(T,p,LR,c)
//
初始条件:二叉树T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空。
//
操作结果:根据LR为0或1,插入c为T中p所指结点的左或右子树。p所指结点的原有左或右子树则成为c的右子树。
DeleteChild(T,p,LR)
//
初始条件:二叉树T存在,p指向T中某个结点,LR为0或1。
//
操作结果:根据LR为0或1,删除T中p所指结点的左或右子树。
PreOrderTraverse(T,visit())
//
初始条件:二叉树T存在,Visit是对结点操作的应用函数。
//
操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
InOrderTraverse(T,visit())
//
初始条件:二叉树T存在,Visit是对结点操作的应用函数。
//
操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
PostOrderTraverse(T,visit())
//
初始条件:二叉树T存在,Visit是对结点操作的应用函数。
//
操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
LevelOrderTraverse(T,visit())
//
初始条件:二叉树T存在,Visit是对结点操作的应用函数。
//
操作结果:层次遍历T,对每个结点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。
}ADTBinaryTree
//
//二、基本操作的实现:
//二叉树的结点结构体:typedefstruct{
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;//二叉树的创立:
/*******************************************/
/*
按照前序遍历建立二叉树
*/
/*******************************************/
StatusCreateBiTree(BiTree&T)
{
//按先序次序输入二叉树中结点的值(一个字符),
//空格字符表示空树,构造二叉链表表示的二叉树T。
charch;
ch=getchar();//scanf("%c",&ch);
if(ch=='')
T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
//生成根结点
CreateBiTree(T->lchild);
//构造左子树
CreateBiTree(T->rchild);
//构造右子树
}
returnOK;
}
/************************************************************/
/*
按层次顺序建立一棵二叉树:队列
*/
/************************************************************/
StatusLevelCreateBiTree(BiTree&T)
{
BiTreep,s;//p指向父亲结点,s指向孩子结点
QueueBiNodeQueue;
charch;
ch=getchar();
if(ch=='')
{
returnNULL;
}
T=(BiTNode*)malloc(sizeof(BiTNode));//生成根结点
T->data=ch;
EnQueue(BiNodeQueue,T);//用队列实现层次遍历
while(!BiNodeQueue.Empty())
{
DeQueue(BiNodeQueue,p);
ch=getchar();//为了简化操作,分别对左右子结点进行赋值。
if(ch!='')//子树不空则进队列进行扩充。下同
{
s=(BiTNode*)malloc(sizeof(BiTNode));
s->data=ch;
p->lchild=s;
EnQueue(BiNodeQueue,s);
}
else
{
p->lchild=NULL;
}
ch=getchar();
if(ch!='')
{
s=(BiTNode*)malloc(sizeof(BiTNode));
s->data=ch;
p->rchild=s;
EnQueue(BiNodeQueue,s);
}
else
{
p->rchild=NULL;
}
}
returnOK;
}
//2.二叉树的前序遍历:
/*******************************************/
/*
按照前序递归遍历二叉树
*/
/*******************************************/
StatusPreOrderTraverse(BiTreeT)
{
if(T)
{
printf("%d",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
returnOK;
}
/*******************************************/
/*
按照前序非递归遍历二叉树:栈
*/
/*******************************************/
StatusPreOrderTraverse(BiTreeT)
{
stackS;
InitStack(S);
BiTreep=T;
//p指向当前访问的结点
while(p||!StackEmpty(S))
{
if(p)
{
printf("%c",p->data);
Push(S,p);
p=p->lchild;
}
else
{
Pop(S,p);
p=p->rchild;
}
}
returnOK;
}
//3.二叉树的中序遍历:
/*******************************************/
/*
按照中序递归遍历二叉树
*/
/*******************************************/
StatusInOrderTraverse(BiTreeT)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%d",T->data);
InOrderTraverse(T->rchild);
}
returnOK;
}
/*******************************************/
/*
按照中序非递归遍历二叉树
*/
/*******************************************/
StatusInOrderTraverse(BiTreeT)
{
stackS;
BiTreep;
InitStack(S);
Push(S,T);
while(!StackEmpty(S))
{
while(GetTop(S,p)&&p)
Push(S,p->lchild);
//向左走到尽头
Pop(S,p);
//空指针退栈(叶子的左孩子)
if(!StackEmpty(S))
{
//访问结点,向右一步
Pop(S,p);
printf("%d",p->data);
//当前根结点
Push(S,p->rchild);
}
}
returnOK;
}
/*******************************************/
/*
按照中序非递归遍历二叉树
*/
/*******************************************/
StatusInOrderTraverse(BiTreeT)
{
stackS;
InitStack(S);
BiTreep=T;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
//非空指针进栈,继续左进
else
{
//上层指针退栈,访问其所指结点,再向右进
Pop(S,p);
printf("%d",p->data);
p=p->rchild;
}
}
returnOK;
}
//二叉树的后序遍历:
/*******************************************/
/*
按照后序递归遍历二叉树
*/
/*******************************************/
StatusPostOrderTraverse(BiTreeT)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%d",T->data);
}
returnOK;
}
/*******************************************/
/*
按照后序非递归遍历二叉树
*/
/*******************************************/
StatusPostOrderTraverse(BiTreeT)
{
stackS;
InitStack(S);
BiTreep=T,pre=NULL;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->left;
}
else
{
Pop(S,p);
if(p->right!=NULL&&pre!=p->right)
{//pre指向上次访问的右结点,避免再次访问
p=p->right;
}
else
{
printf("%d",p->data);
pre=p;
p=NULL;
}
}
}
}
/*******************************************/
/*
按照后序非递归遍历二叉树
*/
/*******************************************/
StatusPostOrderTraverse(BiTreeT)
{
BiTreep=T,last=NULL;
stackS;
InitStack(S);
Push(S,p);
while(!StackEmpty(S))
{
Pop(S,p);
if(last==p->left||last==p->right)//左右子树已经访问完了,该访问根节点了
{
printf("%d",p->data);
last=p;
}
elseif(p->left||p->right)//左右子树未访问,当前节点入栈,左右节点入栈
{
Push(S,p);
if(p->right)
Push(S,p->right);
if(p->left)
Push(S,p->left);
}
else//当前节点为叶节点,访问
{
printf("%d",p->data);
last=p;
}
}
}
//二叉树的层次遍历:
/*******************************************/
/*
按照层次遍历二叉树
*/
/*******************************************/
voidLevelOrderTraverse(BiTreeT)
{
QueueBiNodeQueue;
BiTreep=T;
EnQueue(BiNodeQueue,p);
while(!BiNodeQueue.Empty())
{
DeQueue(BiNodeQueue,p);
if(p)
{
printf("%c",p->data);
EnQueue(BiNodeQueue,p->lchild);
EnQueue(BiNodeQueue,p->rchild);
}
}
}
//交换左右子树:
/*******************************************/
/*
递归法将二叉树的左右子树互换
*/
/*******************************************/
voidExchange(BiTreeT)
{
BiTreetemp;
if(T)
{
Exchange1(T->lchild);
Exchange1(T->rchild);
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
}
/*******************************************/
/*
非递归法将二叉树的左右子树互换
*/
/*******************************************/
voidExchange(BiTreeT)
{
stackS;
InitStack(S);
BiTreep=T,temp;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
temp=p->lchild;
p->lchild=p->rchild;
p->rchild=temp;
p=p->lchild;
}
else
{
Pop(S,p);
p->rchild;
}
}
}给出一段报文和每个字符出现的概率,对其进行哈夫曼编码和解码。实验4图论及其应用一、实验目的了解图的基本概念及术语,并能够熟练掌握图的两种存储结构(邻接矩阵和邻接表)。理解最小生成树的概念,能按Prim算法构造最小生成树。掌握图的两种遍历(深度优先搜索遍历和广度优先搜索遍历)、拓扑排序、关键路径、最短路径的算法思想。二、实验内容及步骤实现网(有权图)的存储结构。利用prim算法构造它的最小生成树。选择一个源点,寻找从原点出发到达其它顶点的最短路径。
实验5查找一、实验目的理解"查找表"的结构特点以及各种表示方法的适用性。熟练掌握顺序查找和折半查找,并对其性能做出分析。熟练掌握哈希表的构造方法,深刻理解哈希表与其它结构的表的实质性的差别。实验内容及步骤实现查找表的顺序查找和折半查找算法。#include<stdio.h>#include<stdlib.h>#include<time.h>constintARRSIZE=10015;//从小到大排序数组元素voidasort(int*a,ints){inti,j,k,t;for(i=0;i<s-1;++i){k=i;for(j=i+1;j<s;++j){if(a[k]>a[j]){k=j;}}if(k!=i)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年殡仪公司面试题及答案
- 2026秋招:吉林旅游控股集团面试题及答案
- 2026秋招:吉利集团试题及答案
- 2026煤销集团秋招面试题及答案
- 2025年化妆品天然原料五年市场趋势报告
- 2026辽宁水资源管理集团秋招试题及答案
- 2026辽宁控股集团秋招面笔试题及答案
- 大班生物教学设计:《胎生动物与卵生动物的生殖方式探究》
- 2025年健康管理与预防医学发展行业报告
- 2026年土木工程与社区可持续性的关系
- 2026年寒假作业实施方案(第二版修订):骐骥驰骋势不可挡【课件】
- 2025年中国药科大学马克思主义基本原理概论期末考试笔试真题汇编
- 2026年辽宁现代服务职业技术学院单招职业倾向性测试题库附答案
- 2025教资国考真题试卷及答案
- 广东省汕头市金平区2024-2025学年九年级上学期期末物理试题(含答案)
- 临床用血技术规范2025年版与2000年版对照学习课件
- 自然资源执法考试试题及答案
- 梅毒检验报告课件
- 2025秋冀人版(新教材)小学科学三年级上册知识点及期末测试卷及答案
- 医院感染管理年度报告
- 骨科主任述职报告
评论
0/150
提交评论