ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:26.53KB ,
资源ID:11895574      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11895574.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(河南科技大学 数据结构.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

河南科技大学 数据结构.docx

1、河南科技大学 数据结构1数据:数据是人们利用文字符号、数字符号以及其他规定的符号对现实世界的事物及其活动所做的抽象描述。2线性表:线性表是具有相同属性的数据元素的一个有限序列。3稀疏矩阵:稀疏矩阵是矩阵中的一种特殊情况,其非零元素的个数远远小于零元素的个数。4栈:栈又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。5数据类型:数据类型是对数据的取值范围、数据元素之间的结构以及允许施加操作的一种综合描述。6数据结构:数据结构是指数据以及相互之间的联系。7链接存储:在链接存储中,每个存储结点不仅含有所存元素本身的信息,而且含有元素之间逻辑关系的信息,其存储结点的结构为

2、:dataP1p2.pm其中data表示值域,用来存储一个元素,p1,p2,.,pm(m1)均为指针域,8队列:队列简称队,它也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。9堆:堆分为小根堆和大根堆两种。对于一个小根堆,它是具有以下特性的一棵完全二叉树:(1)若树根结点存在左孩子,则根结点的值(或某个域的值)小于等于左孩子结点的值(或某个域的值);(2)若树根结点存在右孩子,则根结点的值(或某个域的值)小于等于右孩子结点的值(或某个域的值)。(3)以左右孩子为根的子树又各是一个堆。(4)大根堆的定义与上述类似,只要把小于等于改为大于等于就可以了。简答题一、

3、中缀表达式如何转换为后缀表达式课本89页几道例题二、算法的定义及具有哪些特性算法定义就是解决特定问题的方法。五个特性:1、有穷性:一个算法必须在执行有穷步之后结束。2、确定性:算法中每一步都必须有确切的含义。3、可行性:算法中每一步都必须是可行的,即算法中每一步都能够通过手工或机器可以接受的有限次操作在有限时间内实现。4、输入:一个算法可以有0个1个或多个输入量,在算法被执行前提供给算法。5、输出:一个算法执行结束后至少有一个输出量,它是利用算法对输入量进行运算和处理的结果。三、树的性质1树中的结点数等于所有的结点的度数加1;2度为k的数中第i层上至多有ki-1个结点(i1);3深度为h的k叉

4、树至多有(kh-1)/(k-1)个结点;4具有n个结点的k叉树的最小深度为logk(n(k-1)+1)(k为底数)四、什么是二叉搜索数:二叉搜索数又称二叉排序树,它或者是一棵空树,或者是一棵具有如下特性的非空二叉树:(1)若它左子树非空,则左子树上所有结点的关键字均小于根结点的关键字;(2)若它的右子树非空,则右子树上所有节点的关键字均大于(若允许具有相同的关键字的结点存在,则大于等于)根结点的关键字;(3)左、右子树本身又各是一棵二叉搜索树五、什么是图、子图、完全图、路径、回路、连通、网1图是一种复杂的非线性数据结构。2设有两个图G=(V,E)和G(V,E),若V是V的子集,即VV,且E是E

5、的子集,即EE,则称G是G的子图。3若无向图中的每两个顶点之间都存在着一条边,有向图中的每两个顶点之间都存在着方向相反的两条边,则称此图为完全图。4在一个图G中,从顶点v到顶点v的一条路径是一个顶点序列vi1,vi2,vim,其中v=vi1,v=vim,若此图是无向图,则(vij-1,vij)E(G),(2jm);若此图是有向图,则E(G),(2jm)。5若一条路径上的前后两端点相同,则被称为回路。6在有向图G中,若从顶点vi到vj有路径,则称从vi到vj是连通的。7边上带有权的图称作带权图,也常称作网。六、一般从哪几个方面对算法进行评价?正确性,健壮性,可读性,简单性,时间复杂度,空间复杂度

6、。七、给出广义表,画出树:课本118页最上面的广义表,对应的树为图5-1八、二叉树的性质:1二叉树上终端结点数等于双分支结点数加1;2二叉树上第i层上至多有2i-1个结点(i1);3深度为h的二叉树至多有2h-1(2的h次方减1)个结点;4对完全二叉树中编号为i的结点(1in,n1,n为结点数)有:(1) 若in/2,即2in,则编号为i的结点为分支结点,否则为叶子结点。表达式x表示对x进行向下取整。(2) 若n为奇数,则树中每个分支结点都既有左孩子,又有右孩子;若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子,没有右孩子,其余分支结点左、右孩子都有。(3) 若编号为i的结点有左孩子

7、,则左孩子结点的编号为2i;若编号为i的结点有右孩子,则右孩子结点的编号为2i+1,即遵循对一般二叉树的编号规则。(4) 除树根结点外,若一个结点的编号为i,则它的双亲结点的编号为n/2,也就是说,当i为偶数时,其双亲结点的编号为i/2,它是双亲结点的左孩子,当i为奇数时,其双亲结点的编号为(i-1)/2,它是双亲结点的右孩子。此点也适合于一般二叉树。5具有n个(n0)结点的完全二叉树的深度为log2(n+1)或log2n+1。九、二叉树有几种遍历递归算法?并写出算法。前序遍历算法void Preorder(struct BTreeNode* BT) if(BT!=NULL) printf(%

8、c ,BT-data);Preorder(BT-left);Preorder(BT-right); 中序遍历算法void Inorder (struct BTreeNode* BT) if (BT!=NULL) Inorder(BT-left);printf(%c ,BT-data);Inorder(BT-right);后序遍历递归算法void Postorder(struct BTreeNode* BT) if(BT!=NULL) Postorder(BT-left); Postorder(BT-right); printf(%c ,BT-data); 十、什么是哈夫曼树?写出它的具体算法哈

9、夫曼(Huffman)树又称作最优二叉树。它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。算法如下:(1) 根据与n个权值w1,w2,wn对应的n个结点构成具有n棵二叉树的森林F=T1,T2,Tn,其中每棵二叉树Ti(1in)都只有一个权值为wi的根结点,其左、右子树均为空;(2) 在森林F中选出两棵根结点的权值最小的树作为一棵新树的左、右子树,且置新树的根结点的权值为其左、右子树上根结点的权值之和;(3) 从F中删除构成新树的那两棵树,同时把新树加入F中;(4) 重复(2)和(3)步,直到F中只含有一棵树为止,此树便是哈夫曼树。十一、什么是栈,栈顶,栈顶元素,栈底,进

10、栈,出栈1栈(stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。2人们把对栈进行运算的一端称为栈顶。3栈顶的第一个元素被称为栈顶元素。4相对地,把另一端称为栈底。5向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素。6从一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其下面的相邻元素成为新的栈顶元素。普里姆算法void Prim(adjmatrix GA,edgeset CT,int a,int n) int i,j,k,min,t,m,w; struct edgeElem x; for(i=0;in;i+

11、) if(ia) CTi-1.fromvex=a; CTi-1.endvex=i; CTi-1.weight=GAai; for(k=1,kn;k+) min=MaxValue; m=k-1; for(j=k-1;jn-1;j+) if(CTj.weightmin) min=CTj.weight; m=j; x=CTk-1; CTk-1=CTm; CTm=x; j=CTk-1.endvex; for(i=k;in-1;i+) t=CTi.endvex; w=GAjt; if(wlen=HBT-MaxSize) ElemType *p; p=realloc(HBT-heap, 2*HBT-Max

12、Size*sizeof(ElemType); if(!p) printf(存储空间用完!n); exit(1); HBT-heap=p; HBT-MaxSize=2*HBT-MaxSize; HBT-heapHBT-len=x; HBT-len+;i=HBT-len-1; while(i!=0) int j=(i-1)/2; if(x=HBT-heapj) break; HBT-heapi=HBT-heapj; i=j; HBT-heapi=x; 克鲁斯卡尔算法void Kruskal(edgeset GE,edgeset C,int n) int i,j,k,d; int m1,m2; ad

13、jmatrix s; for(i=1;in;i+) for(j=0;jn;j+) if(i=j) sij=1; else sij=0; k=1; d=0; while(kn) for(i=0;in;i+) if(siGEd.fromvex=1) m1=i; if(siGEd.endvex=1) m2=i); if(m1!=m2) Ck-1=GEd; k+; for(j=0;jn,j+) sm1j=sm1j | sm2j; sm2j=0; d+ P187图的遍历深度优先搜索遍历void dfs1(adjmatrix GA, int i, int n)/*从初始点vi出发深度优先搜索由邻接矩阵GA

14、表示图*/ int j; printf(%d ,i); visitedi=1; for(j=0; jn; j+) if(GAij!=0 & GAij!=MaxValue & !visitedj) dfs1(GA,j,n); (以邻接矩阵)广度优先搜索遍历的过程p189void bfs1(adjmatrix GA, int i, int n) struct QueueSq Q; InitQueue1(&Q); printf(%d ,i); visitedi=1; EnQueue(&Q,i); while(!EmptyQueue(&Q) int j;int k=OutQueue(&Q); for(

15、j=0; jadjvex; if (!vistedj) printf(%d ,j); visitedj=1; EnQueue(&Q,j); p=p-next; 162初始化堆void InitHeap(struct HeapSq* HBT,int MS) if(MSheap=malloc(MS*sizeof(ElemType); if(!HBT-heap) print(“内存空间用完,退出n”); exit(1); HBT-MaxSize=MS; HBT-len=0; 157 从二叉搜索树中删除等于给定值x的结点,若删除成功则返回1,否则返回0。 int Delete(struct BTree

16、Node* BST, ElemType x);152(二叉树的应用)二叉搜索树(查找) ElemType* Find(struct BTreeNode* BST, ElemType x) /*从二叉搜索树中查找等于给定值x的元素*/ if(BST=NULL) return NULL; else if(x=BST-data) return &(BST-data); else if(xdata) return Find(BST-left,x); else return Find(BST-right,x); 向二叉树中插入元素 void Insert(struct BTreeNode* BST, E

17、lemType x) /*向二叉搜索树中插入一个元素x*/ if(*BST=NULL) struct BTreeNode* p=malloc(sizeof(struct BTreeNode); p-data=x; p-left=p-right=NULL; *BST=p; else if(xdata) Insert(&(*BST)-left),x); else Insert(&(*BST)-right),x); 142从树中查找结点值ElemType* FindGTree(struct GTreeNode* GT, ElemType x) if(GT=NULL) return NULL; els

18、e ElemType* p; int i; if(GT-data=x) return &(GT-data); for(i=0; iti,x) return p; return NULL; 140树的运算 出树的先根遍历算法: void PreRoot(struct GTreeNode* GT) int i; if(GT!=NULL) printf(%c ,GT-data); for(i=0; iti); 二叉树后根遍历void PostRoot(struct GTreeNode* GT) int i; if(GT!=NULL) for(i=0; iti); printf(%c ,GT-data

19、); 二叉树树的按层遍历void LayerOrder(struct GTreeNode* GT) struct GTreeNode* p; int i; struct GTreeNode* qMQ; int front=0, rear=0; if(GT!=NULL) rear=(rear+1)% MQ; qrear=GT; while (front!=rear) front=(front+1)% MQ; p=qfront; printf(%c ,p-data); for(i=0; iti!=NULL) rear=(rear+1)% MQ; qrear=p-ti; 139建立树130建立二叉树

20、132求二叉树深度的递归算法如下: int BTreeDepth(struct BTreeNode* BT) if(BT=NULL) return 0; else int dep1=BTreeDepth(BT-left); int dep2=BTreeDepth(BT-right); if(dep1dep2) return dep1+1; else return dep2+1; 132 二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值ElemType* FindBTree(struct BTreeNode* BT, ElemType x) if(BT=NULL) return

21、NULL; else if(BT-data=x) return &(BT-data); else ElemType* p; if(p=FindBTree(BT-left,x) return p; if(p=FindBTree(BT-right,x) return p; return NULL; 129二叉树按层遍历算法(非递归) void Levelorder(struct BTreeNode* BT) struct BTreeNode* p; struct BTreeNode* qQueueMaxSize; int front=0, rear=0; if(BT!=NULL) rear=(re

22、ar+1)% QueueMaxSize; qrear=BT; while (front!=rear) front=(front+1)% QueueMaxSize; p=qfront; printf(%c ,p-data); if(p-left!=NULL) rear=(rear+1)% QueueMaxSize; qrear=p-left; if(p-right!=NULL) rear=(rear+1)% QueueMaxSize; qrear=p-right; 队列106初始化队列一用于存储队列的固定大小的动态存储空间,假定动态存储空间的大小为10。 void InitQueue(struc

23、t QueueSq* Q) /*置队列空间初始最大长度为10*/ Q-MaxSize=10; Q-queue=malloc(10*sizeof(ElemType); Q-front=Q-rear=0; 第二种情况是分配由参数指定大小的动态存储空间。实用中使用任一种初始化算法均可。 void InitQueue(struct QueueSq* Q, int ms) if(msMaxSize=ms; Q-queue=malloc(ms*sizeof(ElemType); if(!Q-queue) printf(内存空间用完!n); exit(1); Q-front=Q-rear=0; 2向队列插入

24、元素 void EnQueue(struct QueueSq* Q, ElemType x) if(Q-rear+1)%Q-MaxSize=Q-front) againMalloc(Q); Q-rear=(Q-rear+1)%Q-MaxSize; Q-queueQ-rear=x; againMalloc()算法的具体定义如下: void againMalloc(struct QueueSq* Q) ElemType *p; p=realloc(Q-queue, 2*Q-MaxSize*sizeof(ElemType); if(!p) printf(存储空间用完!n); exit(1); Q-q

25、ueue=p; if(Q-rear!=Q-MaxSize-1) int i; for(i=0; irear; i+) Q-queuei+Q-MaxSize=Q-queuei; Q-rear+=Q-MaxSize; Q-MaxSize=2*Q-MaxSize; 3从队列中删除元素并返回 ElemType OutQueue(struct QueueSq* Q) if(Q-front=Q-rear) printf(队列已空,无法删除!n); exit(1); Q-front=(Q-front+1)%Q-MaxSize; return Q-queueQ-front; 110向链队中插入一个元素 void EnQueue(struct QueueLk*

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

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