数据结构课后习题答案1--7

合集下载

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

第1章4.答案:(1)顺序存储结构顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。

(2)链式存储结构顺序存储结构要求所有的元素依次存放在一片连续的存储空间中,而链式存储结构,无需占用一整块存储空间。

但为了表示结点之间的关系,需要给每个结点附加指针字段,用于存放后继元素的存储地址。

所以链式存储结构通常借助于程序设计语言的指针类型来描述。

5. 选择题(1)~(6):CCBDDA6.(1)O(1) (2)O(m*n) (3)O(n2)(4)O(log3n) (5)O(n2) (6)O(n)第2章1.选择题(1)~(5):BABAD (6)~(10):BCABD (11)~(15):CDDAC 2.算法设计题(1)将两个递增的有序链表合并为一个递增的有序链表。

要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。

表中不允许有重复的数据。

[题目分析]合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的最后。

如果两个表中的元素相等,只摘取La表中的元素,删除Lb表中的元素,这样确保合并后表中无重复的元素。

当一个表到达表尾结点,为空时,将非空表的剩余元素直接链接在Lc表的最后。

void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc){//合并链表La和Lb,合并后的新表使用头指针Lc指向pa=La->next; pb=Lb->next;//pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点Lc=pc=La; //用La的头结点作为Lc的头结点while(pa && pb){ if(pa->data<pb->data){pc->next=pa; pc=pa; pa=pa->next;}//取较小者La中的元素,将pa链接在pc的后面,pa指针后移else if(pa->data>pb->data) {pc->next=pb; pc=pb; pb=pb->next;}//取较小者Lb中的元素,将pb链接在pc的后面,pb指针后移else //相等时取La中的元素,删除Lb中的元素{pc->next=pa;pc=pa;pa=pa->next;q=pb->next; delete pb ; pb =q;}}pc->next=pa?pa:pb; //插入剩余段delete Lb; //释放Lb的头结点}(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。

严蔚敏 数据结构课后习题及答案解析

严蔚敏 数据结构课后习题及答案解析

第一章绪论一、选择题1.组成数据的基本单位是()(A)数据项(B)数据类型(C)数据元素(D)数据变量2.数据结构是研究数据的()以及它们之间的相互关系。

(A)理想结构,物理结构(B)理想结构,抽象结构(C)物理结构,逻辑结构(D)抽象结构,逻辑结构3.在数据结构中,从逻辑上可以把数据结构分成()(A)动态结构和静态结构(B)紧凑结构和非紧凑结构(C)线性结构和非线性结构(D)内部结构和外部结构4.数据结构是一门研究非数值计算的程序设计问题中计算机的(①)以及它们之间的(②)和运算等的学科。

①(A)数据元素(B)计算方法(C)逻辑存储(D)数据映像②(A)结构(B)关系(C)运算(D)算法5.算法分析的目的是()。

(A)找出数据结构的合理性(B)研究算法中的输入和输出的关系(C)分析算法的效率以求改进(D)分析算法的易懂性和文档性6.计算机算法指的是(①),它必须具备输入、输出和(②)等5个特性。

①(A)计算方法(B)排序方法(C)解决问题的有限运算序列(D)调度方法②(A)可执行性、可移植性和可扩充性(B)可行性、确定性和有穷性(C)确定性、有穷性和稳定性(D)易读性、稳定性和安全性二、判断题1.数据的机内表示称为数据的存储结构。

()2.算法就是程序。

()3.数据元素是数据的最小单位。

()4.算法的五个特性为:有穷性、输入、输出、完成性和确定性。

()5.算法的时间复杂度取决于问题的规模和待处理数据的初态。

()三、填空题1.数据逻辑结构包括________、________、_________ 和_________四种类型,其中树形结构和图形结构合称为_____。

2.在线性结构中,第一个结点____前驱结点,其余每个结点有且只有______个前驱结点;最后一个结点______后续结点,其余每个结点有且只有_______个后续结点。

3.在树形结构中,树根结点没有_______结点,其余每个结点有且只有_______个前驱结点;叶子结点没有________结点,其余每个结点的后续结点可以_________。

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)

《数据结构》第二版严蔚敏课后习题作业参考答案(1-7章)【第一章绪论】1. 数据结构是计算机科学中的重要基础知识,它研究的是如何组织和存储数据,以及如何通过高效的算法进行数据的操作和处理。

本章主要介绍了数据结构的基本概念和发展历程。

【第二章线性表】1. 线性表是由一组数据元素组成的数据结构,它的特点是元素之间存在着一对一的线性关系。

本章主要介绍了线性表的顺序存储结构和链式存储结构,以及它们的操作和应用。

【第三章栈与队列】1. 栈是一种特殊的线性表,它的特点是只能在表的一端进行插入和删除操作。

本章主要介绍了栈的顺序存储结构和链式存储结构,以及栈的应用场景。

2. 队列也是一种特殊的线性表,它的特点是只能在表的一端进行插入操作,而在另一端进行删除操作。

本章主要介绍了队列的顺序存储结构和链式存储结构,以及队列的应用场景。

【第四章串】1. 串是由零个或多个字符组成的有限序列,它是一种线性表的特例。

本章主要介绍了串的存储结构和基本操作,以及串的模式匹配算法。

【第五章数组与广义表】1. 数组是一种线性表的顺序存储结构,它的特点是所有元素都具有相同数据类型。

本章主要介绍了一维数组和多维数组的存储结构和基本操作,以及广义表的概念和表示方法。

【第六章树与二叉树】1. 树是一种非线性的数据结构,它的特点是一个节点可以有多个子节点。

本章主要介绍了树的基本概念和属性,以及树的存储结构和遍历算法。

2. 二叉树是一种特殊的树,它的每个节点最多只有两个子节点。

本章主要介绍了二叉树的存储结构和遍历算法,以及一些特殊的二叉树。

【第七章图】1. 图是一种非线性的数据结构,它由顶点集合和边集合组成。

本章主要介绍了图的基本概念和属性,以及图的存储结构和遍历算法。

【总结】1. 数据结构是计算机科学中非常重要的一门基础课程,它关注的是如何高效地组织和存储数据,以及如何通过算法进行数据的操作和处理。

本文对《数据结构》第二版严蔚敏的课后习题作业提供了参考答案,涵盖了第1-7章的内容。

数据结构课后习题答案第七章

数据结构课后习题答案第七章

第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。

7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。

在遍历中若发现顶点j,则说明顶点i和j间有路径。

{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g种,是否存在顶点i //到顶点j的路径。

设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。

《数据结构》课后参考答案

《数据结构》课后参考答案

单元练习1一.判断题(下列各题,正确的请在前面的括号内打√;错误的打╳)(√)(1)数据的逻辑结构与数据元素本身的内容和形式无关。

(√)(2)一个数据结构是由一个逻辑结构和这个逻辑结构上的一个基本运算集构成的整体。

(ㄨ)(3)数据元素是数据的最小单位。

(ㄨ)(4)数据的逻辑结构和数据的存储结构是相同的。

(ㄨ)(5)程序和算法原则上没有区别,所以在讨论数据结构时可以通用。

(√)(6)从逻辑关系上讲,数据结构主要分为线性结构和非线性结构两类。

(√)(7)数据的存储结构是数据的逻辑结构的存储映像。

(√)(8)数据的物理结构是指数据在计算机内实际的存储形式。

(ㄨ)(9)数据的逻辑结构是依赖于计算机的。

(√)(10)算法是对解题方法和步骤的描述。

二.填空题(1)数据有逻辑结构和存储结构两种结构。

(2)数据逻辑结构除了集合以外,还包括:线性结构、树形结构和图形结构。

(3)数据结构按逻辑结构可分为两大类,它们是线性结构和非线性结构。

(4)树形结构和图形结构合称为非线性结构。

(5)在树形结构中,除了树根结点以外,其余每个结点只有 1 个前趋结点。

(6)在图形结构中,每个结点的前趋结点数和后续结点数可以任意多个。

(7)数据的存储结构又叫物理结构。

(8)数据的存储结构形式包括:顺序存储、链式存储、索引存储和散列存储。

(9)线性结构中的元素之间存在一对一的关系。

(10)树形结构结构中的元素之间存在一对多的关系,(11)图形结构的元素之间存在多对多的关系。

(12)数据结构主要研究数据的逻辑结构、存储结构和算法(或运算)三个方面的内容。

(13)数据结构被定义为(D,R),其中D是数据的有限集合,R是D上的关系的有限集合。

(14)算法是一个有穷指令的集合。

(15)算法效率的度量可以分为事先估算法和事后统计法。

(16)一个算法的时间复杂性是算法输入规模的函数。

(17)算法的空间复杂度是指该算法所耗费的存储空间,它是该算法求解问题规模n 的函数。

数据结构课后习题答案1--7

数据结构课后习题答案1--7

数据结构课后习题答案1--7题目1:请你设计一个栈数据结构,使其具备以下功能:可以在O(1)的时间复杂度内获取栈的最小元素。

解答1:要实现在O(1)的时间复杂度内获取栈的最小元素,可以使用两个栈来实现。

一个栈用来保存原始数据,另一个栈用来保存当前栈的最小元素。

具体实现如下:1. 初始化两个栈:stack和min_stack,其中stack用于保存所有元素,min_stack用于保存当前栈中的最小元素。

2. 插入元素时,先将元素插入stack中,然后判断插入的元素是否比min_stack的栈顶元素小,如果是,则将元素也插入到min_stack中;如果不是,则将min_stack的栈顶元素再次插入到min_stack中。

3. 删除元素时,分别从stack和min_stack中弹出栈顶元素。

这样,min_stack的栈顶元素始终是stack中的最小元素。

题目2:请你设计一个队列数据结构,使其具备以下功能:可以在O(1)的时间复杂度内获取队列的最大元素。

解答2:要实现在O(1)的时间复杂度内获取队列的最大元素,可以使用两个队列来实现。

一个队列用来保存原始数据,另一个队列用来保存当前队列的最大元素。

具体实现如下:1. 初始化两个队列:queue和max_queue,其中queue用于保存所有元素,max_queue用于保存当前队列中的最大元素。

2. 插入元素时,先将元素插入queue中,然后判断插入的元素是否比max_queue的队尾元素大,如果是,则将元素也插入到max_queue的队尾;如果不是,则将max_queue中所有比插入元素小的元素都弹出,再将插入元素插入到max_queue的队尾。

3. 删除元素时,分别从queue和max_queue中弹出队头元素。

这样,max_queue的队头元素始终是queue中的最大元素。

题目3:请你设计一个栈数据结构,使其除了具有常规的入栈和出栈功能外,还具备以下功能:能够在O(1)的时间复杂度内获取栈中的最大元素。

(完整版)C++与数据结构基础简明教程课后习题答案

(完整版)C++与数据结构基础简明教程课后习题答案

C++与数据结构基础简明教程课后习题答案1-7-1//输出一个数的10 倍#include <iostream>using namespace std;int main(){}1-7-2cout<<"Please input an interger:\n"; int a;cin>>a;cout<<"result="<<a*10<<endl; return 0;//输出两个数中的较小的#include <iostream> using namespace std; int main(){}1-7-3double x,y,min;cout<<"please input two numbers"<<endl; cin>>x>>y;min=(x>y?y:x);cout<<"the smaller is"<<' '<<min<<endl; return 0;//输入半径计算周长和面积#include <iostream>using namespace std;int main(){cout<<"请输入半径\n";double rad;cin>>rad;double c,s;c=2*3.14*rad;s=3.14*rad*rad;cout<<"周长是"<<c<<endl;cout<<"面积是"<<s<<endl;return 0;}1-7-4//将10000 秒化成小时分钟秒#include <iostream>using namespace std;int main(){int hour,min,second;hour=10000/3600;min=(10000%3600)/60;second=10000-hour*3600-60*min;cout<<hour<<"hours"<<min<<"minutes"<<second<<"seconds"<<endl;return 0;}1-7-5//将一个三位数倒叙输出#include <iostream>using namespace std;int main(){int num,num_bai,num_shi,num_ge;cout<<"请输入一个三位数";cin>>num;num_bai=num/100;num_shi=(num-num_bai*100)/10;num_ge=num-num_bai*100-num_shi*10; cout<<num_ge<<endl;cout<<num_shi<<endl;cout<<num_bai<<endl;return 0;}2-3//简单的输入输出#include <iostream>using namespace std;int main(){double y,n;cout<<"please input a number\n";cin>>n;if (n>0) y=n+1;if (n<0) y=n*n;} 2-4if (n==0) y=0;cout<<"the result is:"<<' '<<y; return 0;//输出学生学号和对应的成绩等级#include <iostream>using namespace std;int main(){double fenshu;int xuehao;char dengji;int i;for (i=1;i<=10;i++){onerror:cout<<"please input student score\n";cin>>fenshu;if (fenshu>=90&&fenshu<=100) dengji='A';if (fenshu>=80&&fenshu<90) dengji='B';if (fenshu>=600&&fenshu<80) dengji='C';if (fenshu>=0&&fenshu<60) dengji='D';if (fenshu<0){cout<<"error";goto onerror;}if (fenshu>100){cout<<"error";goto onerror;}cout<<"the id is"<<i<<endl;cout<<"the score is"<<dengji<<endl;}return 0;}2-5//判断输入字符类别#include <iostream>using namespace std;int main(){char zifu;int ascii;cout<<"please input a characteristic\n";cin>>zifu;ascii=zifu;if (ascii>=48&&ascii<=57){cout<<"数字\n";goto end;}if (ascii>=97&&ascii<=122){cout<<"小写字母\n";goto end;}if (ascii>=65&&ascii<=90){cout<<"大写字母\n";goto end;}cout<<"其他字符";cout<<endl;end:return 0;}2-6//求圆周率的近似值#include <iostream>#include <iomanip>using namespace std;int main(){int xishu=-1;double danshu=1.0;int i=1;double sifenzhipi=0;do{xishu=xishu*(-1);danshu=1.0/(2*i-1);sifenzhipi=sifenzhipi+xishu*danshu;i++;}while(danshu>=0.000001);cout<<setprecision(15)<<sifenzhipi*4<<endl; return 0;}2-7//输出斐波那契数列前40 个数,以8*5 的格式输出#include <iostream>#include <iomanip>using namespace std;int main(){int b=2;int feibo1=0;int feibo2=1;cout<<setw(9)<<'0'<<setw(9)<<'1';for(int i=1;i<=38;i++){int a=feibo2;feibo2=feibo1+feibo2;feibo1=a;cout<<setw(9)<<feibo2;b=b+1;if(b%8==0) cout<<endl;}return 0;}2-8//统计输入的元音字母个数#include <iostream>using namespace std;int main(){char zimu;int a,e,i,o,u;a=e=u=i=o=0;begin:cin>>zimu;switch(zimu){case 'a' :a++;break;case 'e' :e++;break;case 'i' :i++;break;case 'o' :o++;break;case 'u' :u++;break;case '#' :goto end;}goto begin;end:cout<<a<<endl<<e<<endl<<i<<endl<<o<<endl<<u<<endl<<a+e+i+o+u;return 0;}2-10// 计算5!+6!+7!#include <iostream>using namespace std; int main(){}2-11int i,j;int sum=0;for (i=5;i<=7;i++){int jiecheng=1;for (j=1;j<=i;j++) jiecheng=jiecheng*j; sum=sum+jiecheng;}cout<<sum;return 0;//从2 开始100 个素数#include <iostream>using namespace std;int main(){int num=1;int sushu=0;start:;num++;for (int i=2;i<=num;i++){if(num%i==0) break;}if (i==num){cout<<num<<endl;sushu+=1;}}2-12if(sushu!=100) goto start; return 0;//百钱买百鸡问题#include <iostream>using namespace std;int main(){int x,y,z;for(x=0;x<=100;x++){for(y=0;y<=100;y++){for(z=0;z<=100;z++)if (x+y+z==100&&5*x+3*y+z/3==100&&z%3==0) cout<< x<<'\t'<<y<<'\t'<<z<<endl;}}return 0;}2-13#include <iostream>using namespace std;int main(){int a,b,c,d,e;c=0;cin>>a;cout<<"输入"<<a<<endl<<"该数的三次方是"<<a<<"个连续奇数";b=1;e=a*a*a;while (c!=e){d=b;c=0;for (int i=1;i<=a;i++){c=c+d;d=d+2;}b=b+2;}//cout<<b-2;int f=b-4;for (int j=1;j<=a;j++){f=f+2;cout<<f<<' ';}cout<<"的和\n";return 0;}2-14//输出四方*形状#include <iostream>using namespace std;int main(){int i,j;for (i=1;i<=9;i++){j=1;for(j=1;j<=9;j++){}3-1-1}cout<<endl;}return 0;if(i+j>=6&&i+j<=14&&j-i<=4&&i-j<=4) cout<<'*';else cout<<' ';//向数组a 中输入10 个整数,求其中的最大值,最小值和10 个数的算术平均值#include <iostream>using namespace std;int main(){int a[10];for(int i=0;i<=9;i++)cin>>a[i];int max=a[0],min=a[0],sum=a[0];for(int j=0;j<=9;j++){sum=sum+a[j];max=(max>a[j]?max:a[j]);min=(min<a[j]?min:a[j]);}double ave=sum/10.00;cout<<max<<endl<<min<<endl<<ave<<endl;return 0;}3-1-2#include <iostream>using namespace std;int main(){int score[10];int sum=0,a=0,b=0;for(int i=0;i<=9;i++){cin>>score[i];sum=sum+score[i];}double ave=sum/10.0;for(int j=0;j<=9;j++){if(score[j]>ave) a++;if(score[j]<60) b++; }l;}3-3-1cout<<"成绩大于平均值的人数是"<<a<<endl<<"成绩小于60 的人数"<<b<<end return 0;#include <iostream>using namespace std;int main(){int a[10],sum=0,min,max;double ave;int *ptoa=a;for (int i=0;i<=9;i++){cin>>*(a+i);sum+=*(a+i);}min=*(a);max=*(a);for (int j=1;j<=9;j++){min=(min<*(a+j)?min:*(a+j));max=(max>*(a+j)?max:*(a+j)); }}3-3-2cout<<max<<endl<<min<<endl; ave=sum/10.0; cout<<ave<<endl; return 0;#include <iostream>using namespace std;int main(){int a[10],sum=0,j=0,c=0; //定义数组a,sum 是各学生成绩之和,j 是小于60 的个数,c 是大于平均值的个数double ave=0; //定义平均值int *ptoa=a; //使用指针for (int i=0;i<=9;i++) //输入并算和,统计小于60 的{cin>>*(ptoa+i);sum+=*(ptoa+i);if (*(ptoa+i)<60){j++;}}ave=sum/10.0; //计算平均值//cout<<ave<<endl; //可以输出平均值for (int k=0;k<=9;k++) //计算大于平均值的{if (*(ptoa+k)>ave){c++;}}}3-3-3cout<<c<<endl<<j; return 0;#include <iostream>using namespace std;int main(){char string[100];cin>>string;int i=0,an=0,in=0;cout<<"您输入的字符串";while (string[i]!='\0'){if(string[i]=='a') an++;if(string[i]=='i') in++;cout<<string[i];i++;}cout<<endl<<an<<endl<<in<<endl;return 0;}3-3-3a#include <iostream>using namespace std;int main(){char a[100]; //定义存放字符串的数组char *ptoa=a; //使用指针int i=0,an=0,in=0; //an,in 分别为a,i 的个数cin>>a;while (*(ptoa+i)!='\0') //a【i】{cout<<*(ptoa+i);switch (*(ptoa+i)) //判断{}i++; }case 'a' : an++;break; case 'i' : in++;break;}3-3-4cout<<endl<<an<<endl<<in; return 0;#include <iostream> using namespace std; int main(){int a[3][3];for (int i=0;i<=2;i++){for(int j=0;j<=2;j++){cin>>*(*(a+i)+j);}}cout<<*(*(a+0)+0)+*(*(a+1)+1)+*(*(a+2)+2)<<endl;cout<<*(*(a+0)+2)+*(*(a+1)+1)+*(*(a+2)+0)<<endl;return 0;}3-3-5v1#include <iostream>using namespace std;int main(){int a[11]={2,4,5,8,12,14,16,18,20,30,0},b,i,m,j;cin>>b;a[10]=b;if (b<2){m=0;goto end;}if (b>30){goto end2;}for(i=0;i<=9;i++) {if (a[i+1]>b){} end:;m=i+1;goto end; }for (j=10;j>=m+1;j--) {a[j]=a[j-1];}end2:; }a[m]=b;for (int k=0;k<=10;k++)cout<<a[k]<<endl; return 0;3-3-5v2#include <iostream>using namespace std;int main(){int i,j,temp;int a[11]={2,4,5,8,12,14,16,18,20,30};cin>>a[10];for (i=0;i<=10;i++){for(j=0;j<=10-i-1;j++){if(a[j]>a[j+1]){temp=a[j+1];a[j+1]=a[j];a[j]=temp;}}}for (int k=0;k<=10;k++) cout<<a[k]<<' ';cout<<'\n';return 0;}3-3-5v3#include <iostream>using namespace std;int main(){int a[11]={2,4,5,8,12,14,16,18,20,30},num,i,j;cout<<"请输入一个整数";cin>>num;if (num>a[9]){a[10]=num;}else{for (i=0;i<=11;i++){if(a[i]>num){for(j=9;j>=i;j--){a[j+1]=a[j];}a[i]=num;break;}}}for (i=0;i<=10;i++){cout<<a[i]<<' ';}return 0;}3-3-5final#include<iostream.h>void main(){int a[11]={2,4,5,8,12,14,16,18,20,30},b,i=0,j=10;cin>>b;while(a[i]<b&&i<=9)i++;while(j>i){a[j]=a[j-1];j--;}a[i]=b;cout<<"输入插入后的结果:";}3-3-6for(i=0;i<11;i++)cout<<a[i]<<" "; cout<<endl;#include <iostream>using namespace std;int main(){int a[5][3],s[5]={0,0,0,0,0},temp;for (int i=0;i<=4;i++){cout<<"请输入第"<<i+1<<"行的数据"<<endl;for (int j=0;j<=2;j++){cin>>*(*(a+i)+j);*(s+i)+=*(*(a+i)+j);}}/*//注释掉的部分可以输出每行数据之和for (int k=0;k<=4;k++){cout<<*(s+k)<<endl;}*/for (int m=0;m<=4;m++){for (int n=0;n<=4-m-1;n++)if (*(s+n)>*(s+n+1)){ temp=*(s+n+1);*(s+n+1)=*(s+n);*(s+n)=temp;}}for (int l=0;l<=4;l++){cout<<endl<<*(s+l);}} 4-3cout<<endl; system("pause"); return 0;#include <iostream> using namespace std; int fun1(int x,int y); int fun2(int x,int y); int fun3(int x,int y); int fun4(int x,int y);int main(){int a,b;cout<<"输入两个数";cin>>a>>b;cout<<"两个数的和的平方是"<<fun1(a,b)<<endl;cout<<"两个数的平方和是"<<fun2(a,b)<<endl;cout<<"两个数的差的平方是"<<fun3(a,b)<<endl;cout<<"两个数平方的差是"<<fun4(a,b)<<endl;return 0;}int fun1(int x,int y){int z=(x+y)*(x+y);return z;}int fun2(int x,int y){int z=x*x+y*y;return z;}int fun3(int x,int y){int z=(x-y)*(x-y);return z;}int fun4(int x,int y){} 4-4int z=x*x-y*y; return z;#include <iostream>using namespace std;double jc(int x);int sm(int x);int main(){int m,n,s2;double s1;cin>>m>>n;s1=jc(m)/(jc(n)*jc(m-n));s2=sm(m)-sm(n);cout<<s1<<endl<<s2;return 0;}double jc(int x){double s=1;for (int i=1;i<=x;i++) s*=i;return s;}int sm(int x){} 4-6int s=0;for (int i=1;i<=x;i++) s+=i; return s;#include <iostream> #include <cmath> using namespace std; double jxf(int n); double txf(int n); double f(double x);//const pi=3.1415927; int main(){int n;double y1,y2;cin>>n;y1=jxf(n);y2=txf(n);cout<<y1<<endl<<y2;return 0;}double jxf(int n){double sum=0,s;for (int i=0;i<=n-1;i++){s=(i*3.14)/n;sum+=(3.14/n)*f(s);}return sum;}double txf(int n){double sum=0,s1,s2;for (int i=0;i<=n-1;i++){s1=i*3.14/n;s2=(i+1)*3.14/n;sum+=3.14/n*(f(s1)+f(s2));}sum/=2.0;return sum; }double f(double x) {}4-6v1double y;y=sin(x)+cos(x); return y;#include <iostream>#include <cmath>using namespace std;double jxf(int n);double txf(int n);double f(double x);const pi=3.1415927;int main(){int n;double y1,y2;cin>>n;y1=jxf(n);y2=txf(n);if (abs(y1-2)>abs(y2-2)) cout<<"矩形法";else cout<<"梯形法";return 0;}double jxf(int n){double sum=0;for (int i=0;i<=n-1;i++) sum+=pi/n*f(i*pi/n);return sum;}double txf(int n){double sum=0;for (int i=0;i<=n-1;i++) sum+=pi/n*(f(i*pi/n)+f((i+1)*pi/n));sum/=2;return sum;}double f(double x){double y;y=sin(x)+cos(x);return y;}4-6v2error#include <iostream>#include <cmath>using namespace std;double jxf(int n);double txf(int n);double f(double x);const pi=3.1415927;int main(){int n;double y1,y2;cin>>n;y1=jxf(n);y2=txf(n);if (abs(y1-2)>abs(y2-2)) cout<<"矩形法";else cout<<"梯形法";return 0;}double jxf(int n){double sum=0;for (int i=0;i<=n-1;i++) sum+=pi/n*f(i*pi/n);return sum;}double txf(int n){double sum=0;for (int i=0;i<=n-1;i++) sum+=pi/n*(f(i*pi/n)+f((i+1)*pi/n));sum/=2;return sum;}double f(double x){} 4-7double y;y=sin(x)+cos(x); return y;#include <iostream> using namespace std; int my(int x,int y);int mb(int x,int y);int main(){int a,b,max,min;cin>>a>>b;max=my(a,b);min=mb(a,b);cout<<max<<endl<<min<<endl;system("pause");return 0;}int my(int x,int y){for (int i=(x>y?y:x);i>=1;i--)if (x%i==0&&y%i==0) return i; }int mb(int x,int y){}4-11for (int i=(x>y?x:y);i>=1;i++)if (i%x==0&&i%y==0) return i;#include <iostream>using namespace std;void delchar(char *s1,char s2); int main(){char s1[100];char s2;cin>>s1>>s2;delchar(s1,s2);return 0;}void delchar(char *s1,char s2){for (int i=1;*(s1+i)!='\0';i++){if (*(s1+i)==s2){for (int j=0;*(s1+i+j)!='\0';j++){*(s1+i+j)=*(s1+i+j+1);}}}cout<<s1;}4-12#include <iostream>#include <cmath>using namespace std;int check(int a,int b,int c);double s(double a,double b,double c);int main(){double a,b,c;cin>>a>>b>>c;if (check(a,b,c)) cout<<s(a,b,c);else cout<<"error";system("pause");return 0;}int check(int a,int b,int c){if (a+b>c&&abs(a-b)<c) return 1;else return 0;}double s(double a,double b,double c){}4-13double p=(a+b+c)/2;double area=sqrt(p*(p-a)*(p-b)*(p-c)); return area;#include <iostream> #include <cmath> using namespace std; fun (int n,int k);pow10 (int x);int main(){int n,k;cin>>n>>k;cout<<fun(n,k)<<endl;system("pause");return 0;}int fun (int n,int k){if (k>n||k<1) return 0;else{int s;s=n/pow10(k-1);s=s%10;return s;}}int pow10 (int x){}4-14int s=1;for (int i=1;i<=x;i++) s*=10; return s;#include<iostream>using namespace std;double ave(int p[][4],int i);int main(){int a[5][4];for (int i=0;i<=4;i++)for (int j=0;j<=3;j++)cin>>a[i][j];for (i=0;i<=4;i++)cout<<ave(a,i)<<endl;system("pause");return 0;}double ave(int p[][4],int i){double sum=0;for(int j=0;j<=3;j++)sum+=p[i][j];sum/=4;return sum;}4-15#include <iostream>using namespace std;int find(char str[],char a);int main(){char str[100],a;cin>>str>>a;cout<<find(str,a)+1;system("pause");return 0;}int find(char str[],char a){for (int i=0;str[i]!='\0';i++){if (str[i]==a){return i;break;}}if (str[i]=='\0') return -1; }4-16//4_16#include<iostream>using namespace std;int change (int n,int R,int *a);int main(){cout<<"Please input n and R(2<=R<=16)"<<endl;int n,R,a[10];cin>>n>>R;int i=change(n,R,a);for (int j=i-1;j>=0;j--){switch (a[j]){case 11:cout<<'A';break;case 12:cout<<'B';break;case 13:cout<<'C';break;case 14:cout<<'D';break;case 15:cout<<'E';break;default: cout<<a[j];}}system("pause");return 0;}int change (int n,int R,int *a) {int i=0;while (n!=0){*(a+i)=n%R;n/=R;i++;}return i;}4-17#include <iostream>using namespace std; const int N=5;int init(int a[][N]);void fun1(int a[][N]);void fun2(int a[][N]);void fun3(int a[][N],int sum); void fun4(int a[][N]);int main(){int sum=0;int a[2][N];sum=init(a);cout<<"(1)"<<endl;fun1(a);cout<<"(2)"<<endl;fun2(a);cout<<"(3)"<<endl;fun3(a,sum);cout<<"(4)"<<endl;fun4(a);return 0;}int init(int a[][N]){int sum=0;for (int i=0;i<=N-1;i++){a[0][i]=i+1;cin>>a[1][i];sum+=a[1][i];}return sum;}void fun1(int a[][N]){for (int i=0;i<=N-1;i++)if (a[1][i]>85){cout<<a[0][i]<<' '<<a[1][i]<<endl;}}void fun2(int a[][N]){for (int i=0;i<=N-1;i++)if (a[1][i]<60){cout<<a[0][i]<<' '<<a[1][i]<<endl;}}void fun3(int a[][N],int sum){int aveplus=0;double ave=sum/N;for (int i=0;i<=N-1;i++)if (a[1][i]>=ave)aveplus++;cout<<aveplus<<endl;}void fun4(int a[][N]){for (int i=0;i<=N-1;i++)for (int j=0;j<=N-1;j++){if (a[1][j]>a[1][j+1]){int temp1=a[1][j+1];a[1][j+1]=a[1][j];a[1][j]=temp1;int temp2=a[0][j+1];a[0][j+1]=a[0][j];a[0][j]=temp2;}}for (i=0;i<=N-1;i++){cout<<a[0][i]<<' '<<a[1][i]<<endl;}}5-5//计算当前日期是一年之中的第几天#include <iostream>using namespace std;//定义日期类class Date{private://y 年m 月d 天nod 一年中的第几天ly 是否是闰年int y,m,d,nod,ly;public:Date (int ioy=2009,int iom=5,int iod=1){y=ioy;m=iom;d=iod;}int checkdate();int Issleapyear();void Print();int NumberOfDays();};//是否是闰年int Date::Issleapyear(){return ly=(y%400==0)||(y%4==0&&y%100!=0); }//计算一年之中的第几天int Date::NumberOfDays (){int a[2][13]={{0,31,29,31,30,31,30,31,31,30,31,30,31},{0,31,28,31,30,31,30,31, 31,30,31,30,31}};nod=0;for (int i=0;i<=m-1;i++)nod+=a[Issleapyear()][i];nod+=d;return nod;}//判断日期是否合法int Date::checkdate (){return (m>0&&m<13)&&(d>0&&d<=31);}//输出void Date::Print (){cout<<y<<"年"<<m<<"月"<<d<<"日"<<"是该年的第"<<NumberOfDays ()<<"天"<<endl;}//主函数int main(){Date d1;Date d2(1991,5,2);int y,m,d;cout<<"请依次输入年月日";cin>>y>>m>>d;Date d3(y,m,d);d1.Print();d2.Print();if(d3.checkdate()){} else {}d3.Print(); cout<<"Error";} 5-6system("pause"); system("cls"); system("pause"); return 0;//判断15,31 是否偶数,素数#include <iostream>using namespace std;//定义整数类class Interger{private:int d;public:int GetD();void SetD(int iod=0){d=iod;}int IsOdd();int IsPrime();};//返回D 的值int Interger::GetD(){return d;}//判断是否偶数int Interger::IsOdd(){return 1-d%2;}//判断是否素数int Interger::IsPrime(){for (int i=2;i<=d;i++)if (d%i==0) break;if (i==d) return 0;else return 1;}//主函数int main(){Interger num[2];num[0].SetD(31);num[1].SetD(15);for (int i=0;i<=1;i++){cout<<num[i].GetD();if (num[i].IsOdd()) cout<<"是偶数";else cout<<"不是偶数";if (num[i].IsPrime()) cout<<"不是素数";else cout<<"是素数";cout<<endl;}} 5-7system("pause"); return 0;//编写一个求n!的类,并在main()中分别输出2-9 的阶乘#include<iostream>using namespace std;//定义阶乘类(汗)class jc{private:int a,j;public://传值void set(int ioa){a=ioa;}//计算阶乘int fun(){j=1;for (int i=1;i<=a;i++)j*=i;return j;}};//主函数int main(){jc num[8];for (int i=0;i<=7;i++){num[i].set(i+2);cout<<i+2<<"!="<<num[i].fun()<<endl;}return 0;}5-8#include <iostream>using namespace std;//定义线类class Line{private:double A,B,C;public://IO 函数Line(double ioA,double ioB,double ioC){A=ioA;B=ioB;C=ioC;}//定义友元函数friend void judge(Line &,Line &);};//判断两线是否相交void judge(Line &l1,Line&l2){if (l1.A*l2.B==l2.A*l1.B) cout<<"平行(或重合)"<<endl;else{cout<<"相交,相交点是:("<<(l1.C*l2.B-l1.B*l2.C)/(l2.A*l1.B-l1.A*l2.B);cout<<","<<(l2.A*l1.C-l1.A*l2.C)/(l1.A*l2.B-l1.B*l2.A)<<")"<<endl;}}//主函数int main(){//定义两条直线,l1,l2,系数分别为a,b,c,d,e,fint a,b,c,d,e,f;system("color 79");cout<<"请输入直线1 的三个系数";cin>>a>>b>>c;cout<<"请输入直线2 的三个系数";cin>>d>>e>>f;system("color 07");Line l1(a,b,c),l2(d,e,f);judge(l1,l2);system("pause");。

数据结构习题(1-7)答案

数据结构习题(1-7)答案

第一章绪论一. 选择题1.BD 2.CA 3.B 4.C 5.A 6.D 7.A 8.A 9.A 10.C 二. 解答题第二章线性表一. 选择题1.A 2.B 3.A 4.D 5.A 6.C 7.A 8.B 9.A二.填空题1..物理位置相邻指针2..直接前驱直接后继3.顺序链式三. 算法设计题1.①int count(Linklist h,int x){int num=0;Linknode *p;p=h->next;while(p&&p->data<=x)//p指针向后移动,直至p指向第一个值大于x的结点p=p->next;while(p)if(p->next&&p->data==p->next->data)//若p没有指向链表中同一数值的最后一个结点,则向后移动p=p->next;else//若p指向数值相同的结点中的最后一个,则num加1,p指针后移,继续执行while循环{num++;p=p->next;}return num;}②void delevenl(Linklist &h,int x){Linknode *p,*r;p=h->next;r=h;while(p&&p->data<x){if(p->data%2==0){r->next=p->next;free(p);p=r->next;}else{r=p;p=p->next;}}}2.void converse(Linklist &h){Linknode *p,*q;p=h->next;h->next=NULL;while(p){q=p->next;p->next=h->next;h->next=p;p=q;}}3.void decompose(Linklist La,Linklist &Lb,Linklist &Lc) {Linknode *p;Lc=(Linknode *)malloc(sizeof(Linknode));Lc->next=NULL;p=La->next;Lb=La;Lb->next=NULL;while(p){La=p->next;if(p->data>0){p->next=Lc->next;Lc->next=p;}else{p->next=Lb->next;Lb->next=p;}p=La;}}4.int subset(LinkList la, LinkList lb){ LinkNode * pa,*pb;pa=la->next;while(pa){ pb=lb->next;while(pb&&(pb->data!=pa->data)) pb=pb->next;if(!pb) return 0;pa=pa->next;}return 1;}算法时间复杂度O(A.Length*B.Length)5.void priorset(DuLinkList &la){ p=la;q=la->next;while(q!=la){q->prior=p; p=q;q=q->next;} q->prior=p;}第三章栈和队列一. 选择题1.C C 2.C 3.B 4.D 5.C 6.A 7.C 8.D二. 解答题1栈底栈底2//双向栈类型定义#define STACK_SIZE 100;Typedef struct {SElemType * base_one, * base_two;//栈底指针SElemType * top_one, * top_two;//栈顶指针int stacksize;} SqStack;Status InitStack ( SqStack &S) {//初始化双向栈S.base_one=S.top_one=( SElemType *)malloc(STACK_SIZE * sizeof(SElemType));//第一个栈底和栈顶指向数组起点S.base_two=S.top_two=S.base_one +STACK_SIZE-1;// 第二个栈底和栈顶指向数组终点S.stacksize= STACK_SIZE ;return OK;}//InitStackStatus Push ( SqStack &S, int i, SElemType e){//入栈操作,i=0时将e存入前栈,i=1时将e存入后栈if( S.top_two < S.top_one) return OVERFLOW;//栈满,不考虑追加空间if( i = = 0 )*S.top_one++ = e;else*S.top_two-- = e;return OK;}//PushSElemType Pop ( SqStack &S, int i){//出栈操作,i=0出前栈,i=1出后栈if( i==0 ) {if ( S.top_one==S.base_one) return ERROR;S.top_one--; e=*S.top_one;}else {if ( S.top_two==S.base_two) return ERROR;S.top_two++; e=*S.top_two;}return e;}//Pop2.#define M 3struct Stack{Qelemtype data[M];int top;};struct Queue{Stack s1;Stack s2;};void InitQueue(Queue &Q)//初始化队列{Q.s1.top=0;Q.s2.top=0;}int IsEmpty(Queue &Q)//判断队列是否为空{if(Q.s1.top==0&&Q.s2.top==0)return 1;if(Q.s2.top==0&&Q.s1.top!=0){while(Q.s1.top!=0)Q.s2.data[Q.s2.top++]=Q.s1.data[--Q.s1.top];}return 0;}int IsFull(Queue &Q){if(Q.s1.top==M&&Q.s2.top!=0)return 1;if(Q.s1.top==M&&Q.s2.top==0){while(Q.s1.top!=0)Q.s2.data[Q.s2.top++]=Q.s1.data[--Q.s1.top];return 0;}if(Q.s1.top!=M)return 0;}void InQueue(Queue &Q,Qelemtype e) {if(IsFull(Q)){cout<<"OVERFLOW"<<endl;return;}Q.s1.data[Q.s1.top++]=e;}void DeQueue(Queue &Q,Qelemtype &e) {if(IsEmpty(Q)){cout<<"UNDERFLOW"<<endl;return;}e=Q.s2.data[--Q.s2.top];}3.(1)不能(2)可以原因略4.struct QueueNode{Qelemtype data;QueueNode *next;};struct LinkQueue{QueueNode *rear;};void InitQueue(LinkQueue &Q) //置空队{Q.rear=new QueueNode;Q.rear->next=Q.rear;}int EmptyQueue(LinkQueue Q) //判队空{return Q.rear==Q.rear->next;}void EnQueue(LinkQueue &Q, Qelemtype e)//元素入队{QueueNode *p;//新建一个结点,并置其值为ep=new QueueNode;p->data=e;//将结点插入队列末尾p->next=Q.rear->next;Q.rear->next=p;//修改队尾指针Q.rear=p;}void DeQueue(LinkQueue &Q,Qelemtype &e) //元素出队{QueueNode *p;if (EmptyQueue(Q)) //若队中无元素,则无法执行出队操作{cout<<"error"<<endl;return;}p=Q.rear->next->next; //让p指向队头元素e=p->data;if(p==Q.rear)//如队中只有一个元素,则要rear指向头结点,头结点的next指针指向自身{Q.rear=Q.rear->next;Q.rear->next=Q.rear;}else //若队中不只一个元素,则删除p所指向的结点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题11.解释以下概念:逻辑结构,存储结构,操作,数据结构,数据结构的表示,数据结构的实现,抽象数据类型,算法,算法的时间代价,算法的空间代价,大O 表示法。

2.理解以下关系:算法与数据结构的关系;数据结构与抽象数据类型的关系;算法和数据结构与问题求解的关系。

3. 写出下列程序段的平均情况下的时间代价O表示式。

(1) a=b+c;d=a+e(2) sum=0;for (i=0;i<3;i++)for (j=0;j<n;j++)sum++;(3) x=n;y=0;while (x>=(y+1)*(y+1))y++;(4) s=0;if(even(n))for (i=0;i<n;i++)sum++;elses=s+n;(5) x=66;n=200;while (n>0){if(x>lO0){ x=x-10;n=n-1;}elsex=x+1;}4.对于给定的n个元素,可以构造出的逻辑结构有,,,四种。

5.按增长率由小到大的顺序排列下列各函数:2100, (32)n, (23)n, (43)n, n n, n32, n!, n, log2n, n/log2n习题22.1已知L是无头结点的单链表,且p结点既不是第一个结点,也不是最后一个结点,试从下列提供的语句中选出合适的语句序列:(1)在p结点之后插入s结点:(2)在p结点之前插入s结点:(3)在单链表L首插入s结点:(4)在单链表L后插入s结点:提供的语句:①p->next=s;②p->next=p->next->next;③p->next=s->next;④s->next=p->next;⑤s->next=L;⑥s->next=p;⑦s->next=NULL;⑧q=p;⑨while(p->next!=q)p=p->next;⑩while(p->next!=NULL)p=p->next;⑾p=q;⑿p=L;⒀L=s;⒁L=p;2.2已知p结点是某双向链表的中间结点,试从下列提供的语句中选出合适的语句序列。

(1)在p结点之后插入s结点:(2)在p结点之前插入s结点:(3)删除p结点的直接后继结点:(4)删除p结点的直接前驱结点:提供的语句:①p->next=p->next->next;②p->prior=p->prior->prior;③p->next=s;④p->prior=s;⑤s->next=p;⑥s->prior=p;⑦s->next=p->next;⑧s->prior=p->prior;⑨p->prior->next=p->next;⑩p->prior->next=p;⑾p->next->prior=p;⑿p->next->prior=s;⒀p->prior->next=s;⒁p->next->prior=p->prior;⒂q=p->next;⒃q=p->prior;⒄free(p);⒅free(q);2.3试编写一个计算头结点指针为L的单链表长度的算法。

2.4试编写一个将单循环链表逆置的算法。

2.5已知一顺序表A,其元素值非递减有序排列,编写一个算法,删除顺序表中多余的值相同的元素。

习题33.1 简述栈和线性表的区别。

简述栈和队列的相同点和不同点。

3.2 如果进栈的数据元素序列为1、2、3、4、5、6,能否得到4、3、5、6、1、2和1、3、5、4、2、6的出栈序列?并说明为什么得不到或如何得到。

3.3 利用两个栈模拟一个队列的入队、出队和判断队列空的运算。

3.4 写一算法,将一个顺序栈中的元素依次取出,并打印元素值。

3.5 写一算法,将一个非负十进制整数转换成二进制。

3.6 写一算法,将一个链式队列中的元素依次取出,并打印元素值。

3.7 设有编号为1、2、3、4的4辆车,顺序进入一个栈式结构的站台,试写出这4辆车开出站台的所有可能的顺序。

3.8 写一个算法,借助于栈将一个单链表逆置。

习题44.1 空串和空格串有什么区别?4.2 两个字符串相等的充要条件是什么?4.3 串的三种机内表示方法是什么?4.4 设S='I am a student',T='good',Q='worker'。

求:(1)StrLength(S)(2)SubString(&Sub,S,8,7)(3)SubString(&Sub,T,2,1)(4)Index(S,'a',1)(5)Index(S,T,1)(6)Replace(&S,'Student',Q)(7)Concat(&N,SubString(&V,S,6,2),Concat(&P,T,SubString(&W,S,7,8)))4.5 设A='This',F='a sample',C='good',D='ne',B=' ',G='is'。

求:(1)Coneat(&S,A,Concat(&Z,SubString(&Y,F,2,7),Concat(&X,B,SubString(A,3,2))))(2)Concat(&U,SubString(&X,C,3,1),D)(3) Replace(&F,SubString(&X,F,3,6),C)(4)StrLength(S)(5)Index(V,G,1)(6)Index(U,G,1)(7) Concat(&V,S,Concat(&Z,B,Concat(&Y,F,Concat(&X,B,U))))4.6 利用C的库函数strlen、strcpy(或strcat)写一个算法voidStrDelete(char *S,int i,int m),删除串S中从位置i开始连续的m个字符。

若i≥strlen(S),则没有字符被删除;若i+m≥strlen(S),则S中从位置i开始直至末尾的字符均被删去.。

4.7 采用顺序结构存储串,编写一个函数,求串s和串t的一个最长的公共子串。

提示: 需要采用三重循环来实现。

习题51.假设按行优先存储整数数组A[9][3][5][8]时,第一个元素的字节地址是100,每个整数占4个字节。

问下列元素的存储地址是什么?(1) a0000 (2) a1111 (3) a3125 (4) a82472.假设一个准对角矩阵按以下方式存储于一维数组B[4m]中:写出由一对下标(i,j) 求k的转换公式。

3.现有如下的稀疏矩阵A,要求画出三元组表示法。

习题610. 假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为7,19,2,6,32,3,21,10。

试为这8个字母设计赫夫曼编码。

使用0~7的二进制表示形式是另一种编码方案。

对于上述实例,比较两种方案的优缺点。

11.一棵度为2的树与一棵二叉树有何区别?树与二叉树之间有何区别?12.对于如图所示的树,试给出:(1)双亲数组表示法示意图;(2)孩子链表表示法示意图;(3)孩子兄弟链表表示法示意图。

13.画出下图所示的森林经转换后所对应的二叉树,并指出在二叉链表中某结点所对应的森林中结点为叶子结点的条件。

14.将如图所示的二叉树转换成相应的森林。

15.在具有n(n>1)个结点的各棵树中,其中深度最小的那棵树的深度是多少?它共有多少叶子和非叶子结点?其中深度最大的那棵树的深度是多少?它共有多少叶子和非叶子结点?16.画出和下列已知序列对应的树T:树的先根访问序列为:GFKDAIEBCHJ;树的后根访问序列为:DIAEKFCJHBG。

17.画出和下列已知序列对应的森林F:森林的先序访问序列为:ABCDEFGHIJKL;森林的中序访问序列为:CBEFDGAJIKLH。

18.对以孩子-兄弟链表表示的树编写计算树的深度的算法。

习题71 对于右图所示的有向图,试给出:(1)每个顶点的入度和出度。

(2)邻接矩阵。

(3)邻接表。

(4)逆邻接表。

(5)强连通分量。

2 设无向图G如右图所示,试给出:(1)该图的邻接矩阵。

(2)该图的邻接表。

(3)该图的多重邻接表。

(4)从v0出发的“深度优先”遍历序列。

(5)从v0出发的“广度优先”遍历序列。

3请对下边的无向带权图,(1)写出它的邻接矩阵,并按普里姆算法求其最小生成树;(2)写出它的邻接表,并按克鲁斯卡尔算法求其最小生成树。

4 对下图所示的带权有向图G,试回答以下问题:(1)求出G中从结点v1出发按深度优先搜索遍历G所得到结点序列;(2)求出G中从结点v1出发按广度优先搜索遍历G所得的结点序列;5 对于下图所示的带权图(1)按照普里姆算法,从顶点v1出发生成最小生成树,按生成次序写出各条边;(2)按照克鲁斯卡尔算法,生成最小生成树,按生成次序写出各条边;(3)画出其最小生成树,并求出它的权值。

6 写出下图所示的AOV网的全部可能的拓扑有序序列。

7 对下图所示的带权有向图G,试回答以下问题:(1)写出其带权邻接矩阵arcs;(2)求出从顶点v1到其他各顶点之间的最短路径。

相关文档
最新文档