山东大学数据结构第4-7章作业
数据结构与算法(C语言篇)第4章 习题答案[2页]
![数据结构与算法(C语言篇)第4章 习题答案[2页]](https://img.taocdn.com/s3/m/33724e1ceffdc8d376eeaeaad1f34693daef10d1.png)
习题答案1.填空题(1)非线性、一对多(2)前驱(3)叶结点(叶子结点)(4)度数(5)两(6)满二叉(7)从根结点到该结点之间的路径长度与该结点的权值的乘积(8)树中所有叶结点的带权路径长度之和(9)递增(10)平衡因子(11)B树的阶2.选择题(1)B (2)D (3)A (4)C (5)B (6)A (7)D (8)D3.思考题(1)如果i=1,则结点i无双亲,为根结点。
如果i>1,则结点i的双亲结点是结点i/2。
如果2i≤n,则结点i的左孩子是结点2i,否则结点i为叶结点。
如果2i+1≤n,则结点i的右孩子是结点2i+1,否则结点i无右孩子。
(2)非叶结点最多只有M个孩子,且M>2。
除根结点以外的非叶结点都有k个孩子和k-1个数据元素,k值满足[M/2]≤k≤M。
每一个叶结点都有k-1个数据元素,k值满足[M/2]≤k≤M。
所有叶结点都在同一层次。
所有分支结点的信息数据一致(n,A0,K1,A1,K2,A2……K n,A n),其中:K i(i=1,2……n)为关键字,且K i<K i+1(i=1,2……n-1);A i为指向孩子结点的指针,且指针A i−1指向子树中的所有结点均小于K i,A n所指子树中的所有结点的关键字均大于K n;n为关键字的个数([M/2]-1≤n≤M-1)。
(3)B+树是B树的升级版,区别在于叶结点在B+树的最底层(所有叶结点都在同一层),叶结点中存放索引值、指向记录的指针、指向下一个叶结点的指针。
叶结点按照关键字的大小,从小到大顺序链接。
分支结点不保存数据,只用来作索引,所有数据都保存在叶结点。
B*树是B+树的变体,B*树不同于B+树的是:其非根和非叶子结点上增加了指向兄弟结点的指针。
4.编程题(1)1//参数1为树的结点个数,参数2起始结点编号2btree_t *btree_create(int n, int i){3 btree_t *t;4 //使用malloc函数为结点申请内存空间5 t = (btree_t *)malloc(sizeof(btree_t));6 //将结点编号作为数据,保存至data中7 t->data = i;89 if(2 * i <= n){ //满足条件,说明结点有左孩子,编号为2i10 //递归调用,为左孩子的创建申请空间11 t->lchild = btree_create(n, 2 * i);12 }13 else{ //不满足条件,则没有左孩子14 t->lchild = NULL;15 }1617 if(2 * i + 1 <= n){ //满足条件,说明结点有右孩子,编号为2i+118 //递归调用,为右孩子的创建申请空间19 t->rchild = btree_create(n, 2 * i + 1);20 }21 else{ //不满足条件,则没有右孩子22 t->rchild = NULL;23 }2425 return t;26}。
数据结构(第二版)习题答案第4章

gets(s2.str);
s2.length=strlen(s2.str);
m=strcompare(s1,s2);
if(m==1) printf("s1>s2\n");
else if(m==-1) printf("s2>s1\n");
free(S);
free(T1);
free(T2);
}
【参考程序
2】:
#include<stdio.h>
#define MAXSIZE 100
typedef struct{
char str[MAXSIZE];
int length;
}seqstring;
for(k=0;k<t2.length;k++)
s->str[c+k]=t2.str[k];
else if(t1.length<t2.length)
{ for(m=s->length-1;m>i-1;m--)
s->str[t2.length-t1.length+m]=s->str[m]; //后移留空
while (i<t->length && j<p->length)
{
if(j==-1||t->str[i]==p->str[j])
{i++; j++;}
else j=next[j];
}
if (j==p->length) return (i-p->length);
数据结构第四五六七章作业答案

数据结构第四五六七章作业答案数据结构第四、五、六、七章作业答案第四、五章一、填空题1.不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。
2.设s=“a;/document/mary.doc”,则strlen(s)=20,“/”的边线为3。
3.子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。
4、串成的存储方式存有顺序存储、堆上分配存储和块链存储5、有一个二维数组a[0:8,1:5],每个数组元素用相邻的4个字节存储,存储器按字节编址,假设存储数组元素a[0,1]的地址是100,若按行主顺序存储,则a[3,5]的地址是176和a[5,3]的地址是208。
若按列存储,则a[7,1]的地址是128,a[2,4]的地址是216。
6、设立数组a[1…60,1…70]的基地址为2048,每个元素占到2个存储单元,若以列序居多序顺序存储,则元素a[32,58]的存储地址为8950。
7、三元素组表中的每个结点对应于稠密矩阵的一个非零元素,它涵盖存有三个数据项,分别则表示该元素的行负号、列于负号和元素值。
8、二维数组a[10][20]使用列序居多方式存储,每个元素占到10个存储单元,且a[0][0]的存储地址就是2000,则a[6][12]的地址就是32609、已知二维数组a[20][10]采用行序为主方式存储,每个元素占2个存储单元,并且a[10][5]的存储地址是1000,则a[18][9]的存储地址是116810、已知二维数组a[10][20]采用行序为主方式存储,每个元素占2个存储单元,并且a[0][0]的存储地址是1024,则a[6][18]的地址是130011、两个串相等的充分必要条件是长度相等、对应位置的字符相同。
12、二维数组a[10][20]使用列序居多方式存储,每个元素占到一个存储单元,并且a[0][0]的存储地址就是200,则a[6][12]的地址就是200+(12*10+6)=326。
2020年山东大学网络教育数据结构作业及答案

2020年山东大学数据结构课后作业答案山东大学继续(网络)教育学院---数据结构课后作业答案一、单选题(共20题,50.0分)1、在一个长度为n的顺序表的任一位置插入一个新元素的渐进时间复杂度为()。
A、O(n)B、O(n/2)C、O(1)D、O(n2)我的答案:A得分:2.5分2、带头结点的单链表first为空的判定条件是:()。
A、first == NULL;B、first->link == NULL;C、first->link == first;D、first != NULL;我的答案:B得分:2.5分3、从逻辑上可以把数据结构分为()两大类。
A、动态结构、静态结构B、顺序结构、链式结构C、线性结构、非线性结构D、初等结构、构造型结构我的答案:B得分:2.5分4、在系统实现递归调用时需利用递归工作记录保存实际参数的值。
在传值参数情形,需为对应形式参数分配空间,以存放实际参数的副本;在引用参数情形,需保存实际参数的(),在被调用程序中可直接操纵实际参数。
A、空间B、副本C、返回地址D、地址我的答案:D得分:2.5分5、以下数据结构中,哪一个是线性结构()。
A、广义表B、二叉树C、稀疏矩阵D、串6、以下属于逻辑结构的是()。
A、顺序表B、哈希表C、有序表D、单链表我的答案:C得分:2.5分7、对于长度为9的有序顺序表,若采用折半搜索,在等概率情况下搜索成功的平均搜索长度为()的值除以9。
A、20B、18C、25D、22我的答案:C得分:2.5分8、在有向图中每个顶点的度等于该顶点的()。
A、入度B、出度C、入度与出度之和D、入度与出度之差我的答案:C得分:2.5分9、在基于排序码比较的排序算法中,()算法的最坏情况下的时间复杂度不高于O(nlog2n)。
A、起泡排序B、希尔排序C、归并排序D、快速排序我的答案:C得分:2.5分10、当α的值较小时,散列存储通常比其他存储方式具有()的查找速度。
山东大学数据结构第1-3章作业

第一章作业第章作试编个递归数来输个素的 5. 试编写一个递归函数,用来输出n 个元素的所有子集。
例如,三个元素{a, b, c} 的所有子集是:{ }(空集),{a}, {b}, {c}, {a, b}, {a, c}, {,}{,,}b, c} 和a, b, c。
基本思想:用一个一维数组x[1:n]表示大小为n的数组的一个子集。
如果第j个元素包含在子集中,那么x[j]=1 ,否则x[j]=0;x[j]0例如原数组为{a,b},那么他的子集为{0,0},{0,1},{1,0},{1,1}。
分别对应子集{Ø},{}{}{}{b},{a},{a,b}.函数实现:#include <iostream.h>// 定义全局变量,n在主函数种初始化//定义全局变量在主函数种初始化int x[20], // 子集向量,假设大小为20n; // 数组元素个数void Subsets(int i,int n){// 输出数组a[i:n].的所有子集只有[]在每次递归调用时改变[],被确定为了或// x[i:n] 在每次递归调用时改变,x[1:i-1],已经被确定为了0 1 if (i == n) {// x[n] 可以是0或1// 输出不包含元素n的子集x[n] 0;x[n]=0;for (int j = 1; j <= n; j++)cout << x[j] << " ";cout << endl;cout<<endl;//输出包含元素n的子集x[n] = 1;[]1for (j = 1; j <= n; j++)cout << x[j] << " ";cout << endl;return;// 子集中不包含元素i的情况x[i] = 0;// 递归调用产生不含有元素i的所有子集Subsets(i+1,n);//子集中包含元素i的情况x[i] 1;x[i]=1;//递归调用产生含有元素i的所有子集Subsets(i+1,n);Subsets(i+1n);}#include <iostream>int x[100]; // 子集向量,假设大小为100int x[100];//template <class T>void Subsets(int i ,int n ,T a[]){// 输出数组a[i:n].的所有子集{//a[i:n]// 只有x[i:n] 在每次递归调用时改变,x[1:i-1],已经被确定为了0 或1 if (i == n) {// x[n] 可以是0或1//// 输出不包含元素n的子集x[n] = 0;int temp=0;for (int j = 1; j <= n; j++)f(){ if(x[j]!=0) {cout << a[j] << " ";temp=1;}} if(temp==0)cout<<"空集";cout << endl;输出包含元素的子集//nx[n] = 1;for (j = 1; j <= n; j++) { if(x[j]!=0) cout << a[j] << " ";} cout << endl;cout<<endl;return;}// 子集中不包含元素i的情况x[i] = 0;// 递归调用产生不含有元素i的所有子集Subsets(i+1,n,a);//子集中包含元素i的情况x[i] 1;x[i]=1;//递归调用产生含有元素i的所有子集Subsets(i+1,n,a);Subsets(i+1n a);}void main(void){cout<<"输入数组大小n=";int n;;cin>>n;while(n>100){cout<<"请输入一个在1到100内的数"<<endl;cin>>n;}cout<<"输入"<<n<<"个数组元素:";输个数元素;char y[n+1];//实例化for(int i=1;i<=n;i++)i[i]cin>>y[i] ;Subsets(1,n,y);}第三章习题2.假设一个线性表的描述满足公式(3-1)类的定义增加个函数1)扩充LinearList类的定义,增加一个函数Reverse,该函数将表中元素的次序变反。
数据结构第4章作业参考答案

第4章(数组和广义表)作业参考答案一、单项选择题1.将一个A[1..100,1..100]的三对角矩阵,按行优先压缩存储到一维数组B[1‥298]中,A 中元素A[66][65]在B数组中的位置K为(C )。
A. 198B. 197C. 195D. 1962.广义表(a,(b,c),d,e)的表头为( A )。
A. aB. a,(b,c)C. (a,(b,c))D. (a)3.在三对角矩阵中,非零元素的行标i和列标j的关系是( A )。
A. |i-j|≤1B. i>jC. i==jD. i<j4.广义表L=(a,(b,c)),进行Tail(L)操作后的结果为( D )。
A. cB. b,cC.(b,c)D.((b,c))5.设二维数组A[1..m,1..n](即m行n列)按行存储在数组B[1..m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为( D )。
A. j*m+i-1B. (i-1)*n+j-1C. i*(j-1)D. (i-1)*n+j6.广义表(( ),( ),( ))的深度为( C )。
A. 0B. 1C. 2D. 37.假设以行序为主序存储二维数组A[0..99,0..99],设每个数据元素占2个存储单元,基地址为10,则LOC(A[4][4])=( C )。
A. 1020B. 1010C. 818D. 8088.已知广义表A=((a,b),(c,d)),则head(A)等于( A )。
A. (a,b)B. ((a,b))C. a,bD. a9.已知一个稀疏矩阵的三元组表如下:(1,2,3),(1,6,1),(3,1,5),(3,2,-1),(4,5,4),(5,1,-3)则其转置矩阵的三元组表中第3个三元组为( C )。
A. (2,3,-1)B. (3,1,5)C. (2,1,3)D. (3,2,-1)10.广义表((b,c),d,e)的表尾为( C )。
《数据结构与实训(第4版)(微课版)》 -第7章习题参考答案[3页]
![《数据结构与实训(第4版)(微课版)》 -第7章习题参考答案[3页]](https://img.taocdn.com/s3/m/169c6e305e0e7cd184254b35eefdc8d376ee14e5.png)
第七章习题答案1.填空题(1) 平均查找长度(2) 哈希查找(3)顺序 有序(4)越大(5) 21(n + 1) (6)开放定址法 拉链法(7)3(8)2(9)中序(10)建表2.判断题(1)×(2)×(3)√(4)√(5)√(6)√(7)√(8)√(9)×(10)×3.简答题(1)①表中只有一个关键字等于给定值k 的记录,无序表、有序表:顺序查找成功时,平均查找长度均为1/(n)*(1+2+…+n)=(n+1)/2;两者相同。
②无序表:顺序查找不成功时,平均查找长度为n+1;有序表,平均查找长度为1/(n+1)*(1+2+…+(n+1))=(n+2)/2;两者不相同。
③表中只有m 个关键字等于给定值k 的记录,无序表:ASL=n+1;有序表:ASL=(n+1)/2+m ;两者不相同。
(2)(3H(22)=(22 mod 7)+1=2 H(8)=(8 mod 7)+1=2 H(34)=(34 mod 7)+1=7 H(19)=(19 mod 7)+1=6 H(21)=(21 mod 7)+1=1 H(29)=(29 mod 7)+1=2 ①0 1 2 3 4 5 6 7 8②1 2 3 4 5 6 7 8 ③4.(1)int SeqSearch(RecordType r, int n, KeyType k){ i=0;r[n].key=k;while (r[i].key!=k) i++;if (i<n) return n;else return -1;}(2)KeyType MaxNode (BSTree bt){ if (bt!=NULL){ f=bt;while (bt->rchild!=NULL){ f=bt; bt=bt->rchild;}return f->key;}}(3)int level(BSTree bt, KeyType k){ d=0;if (bt==NULL) return 0; //空树深度为0else{ d++; //根结点深度为1while (bt->data!=k){ if (bt->data<k) bt=bt->rchild; //右子树中查找else bt=bt->rchild; //左子树中查找d++;}return d;}(4)#define N 50int IsBSTree(BSTree bt){BSNode *stack[N],*p;KeyType k;int isbst,top;isbst=1; //标志变量,首先假定bt是二叉排序树top=-1; //置空栈p=bt; //p从根出发while (isbst && (p!=NULL || top!=-1)){while ((p!=NULL){k=p->key;if (p->lchild->key>k || p->rchild->key<k){ isbst=0; break;}if (p->rchild!=NULL)stack[++top]=p->rchild;p=p->lchild;}if (top!=-1)p=stack[top--];}return isbst;}(5)BSTree BSTDeleteAll(BSTree t, KeyType k){BSTree p;p=BSTSearch1(t,k); //查找关键字值不小于x的结点while (p!=NULL){ t=BSTDelete(t,p); //删除p所指示结点p=BSTSearch1(t,k);}}注:函数BSTSearch1,BSTDelete参阅教材§7.3.3,§7.3.4。
山大-数据结构习题

第3章数据结构3.1数据结构的基本概念一、部分例题及解题思路选择题1.数据结构是指()。
A.数据元素的组织形式B.数据类型C.数据存储结构D.数据定义2.数据在计算机存储器内表示时,物理地址与逻辑地址不相同的,称之为()。
A.存储结构B.逻辑结构C.链式存储结构D.顺序存储结构3.树形结构是数据元素之间存在一种()。
A.一对一关系B.多对多关系C.多对一关系D.一对多关系4.设语句x++的时间是单位时间,则以下语句的时间复杂度为()。
for(i=1; i<=n; i++)for(j=i; j<=n; j++)x++;A.O(1)B.O(2n)C.O(n)D.O(3n)5.算法分析的目的是(1),算法分析的两个主要方面是(2)。
(1) A.找出数据结构的合理性 B.研究算法中的输入和输出关系C.分析算法的效率以求改进D.分析算法的易懂性和文档性(2) A.空间复杂度和时间复杂度 B.正确性和简明性C.可读性和文档性D.数据复杂性和程序复杂性6.计算机算法指的是(1),它具备输入,输出和(2)等五个特性。
(1) A.计算方法 B.排序方法C.解决问题的有限运算序列D.调度方法(2) A.可行性,可移植性和可扩充性 B.可行性,确定性和有穷性C.确定性,有穷性和稳定性D.易读性,稳定性和安全性7.数据在计算机内有链式和顺序两种存储方式,在存储空间使用的灵活性上,链式存储比顺序存储要()。
A.低B.高C.相同D.不好说8.数据结构作为一门独立的课程出现是在()年。
A.1946B.1953C.1964D.19689.数据结构只是研究数据的逻辑结构和物理结构,这种观点()。
A.正确B.错误C.前半句对,后半句错D.前半句错,后半句对10.计算机内部数据处理的基本单位是()。
A.数据B.数据元素C.数据项D.数据库填空题1.数据结构按逻辑结构可分为两大类,分别是______________和_________________。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Queue<T>::Queue(int MaxQueueSize) { …… Lastop=''; } Queue<T>& Queue<T>::Add(const T& x) { …… lastOp="add"; …… } Queue<T>& Queue<T>::Delete(T& x) { …… lastOp=" delete "; …… }
第5章 关于双栈 两个栈共享一个栈空间 -----------------------------------------------------------------| ---------------> | | <----------------- | | <--------------- | | -----------------> | -----------------------------------------------------------------| | | | bot[0] top[0] top[1] bot[1]
15
1.设有一组关键字:{19,14,23,01,68,20 ,84,27,55,11,10,79},采用散列函数: H(key)=key mod 13,采用线性开型寻址方法 解决溢出。 要求:在0∽12的散列地址空间中对该关键字序 列构造散列表(给出散列表的存储结构)。搜索 元素27,55所花的比较次数各是多少? 2.有关键字集合:{19,14,23,01,68,20, 84,27,55,11,10,79},散列函数:H(key )=key mod 13,采用链地址散列方法解决溢出 。要求: 构造散列表;搜索元素27,55所花的比较次数各 是多少?
16
元素 H(key)
19 14
23
01
68
20
84
27
55
11
10
79
6
1
10
1
3
4
6
1
3
11
10
1
14 01
68
20 27
19
84 55
79
23 11
10
0
1
2
3
4
5
6
7
8
9
10 11
12
搜索元素27,55所花的比较次数: 5;6。
7
template <class T> DblStack<T>& DblStack<T> :: Pop(int i, T &x,) { //弹出位于栈i栈顶的元素 if (IsEmpty(i)) throw OutofBounds(); //判栈空否 if (i == 0) x=elements[top[0]--]; //栈0情形:栈顶指针减1 else x=elements [top[1]++]; //栈1情形:栈顶指针加1 }
ቤተ መጻሕፍቲ ባይዱ
第4章 34. 一个nxn的矩阵T是一个等对角矩阵(Toeplitz matrix )当且仅当对于所有的i和j都有T(i,j)=T(i-1,j-1 ),其中i〉1,j〉1 证明一个等对角矩阵最多有2n-1个不同的元素 给出一种映射模式,把一个等对角矩阵映射到一个大 小为2n-1的一维数组中。 采用(2)中的映射模式设计一个C++类Toeplitz,用 一个大小为2n-1的一维数组来存储对角矩阵,要求给 出两个共享成员函数store和Retrieve。 编写一个共享成员函数,用来对两个按(2)中所给方式 存储的等对角矩阵进行乘法运算,所得到的结果存储 在一个二维数组中,该函数的时间复杂性是多少?
9
4. 修改程序6-1中的Queue类,使得队列的容量 与数组queue的大小相同。为此,可引入另外 一个私有成员LastOp来跟踪最后一次队列操 作。可以肯定,如果最后一次队列操作为Add ,则队列一定不为空;如果最后一次队列操作 为Delete,则队列一定不会满。因此,当 front=rear时,可使用LastOp来区分一个队列 是空还是满。试测试修改后的代码。
4
template <class T> class DblStack { private: int top[2], bot[2]; //双栈的栈顶指针和栈底指针 T *Elements; //栈数组 int m; //栈最大可容纳元素个数 public: DblStack( int sz =10 ); //初始化双栈, 总体积m的默认值为10 ~DblStack() { delete [] Elements; } //析构函数 DblStack<T>& Push( T &x, int i); //把x插入到栈i的栈顶 DblStack<T>& Pop(int i, T &x,); //弹出位于栈i栈顶的元素 T Top(int i); //返回栈i栈顶元素的值 bool IsEmpty(int i) const { return top[i] == bot[i]; } //判栈i空否, 空则返回 true, 否则返回false bool IsFull() const { return top[0]+1 == top[1]; } //判栈满否, 满则返回 true, 否则返回false };
lastop==" add ")
13
第7章
1.采用公式化描述方法定义C++类SortedList。 要求提供与SortedChain中同样的成员函数。 编写所有函数的代码,并用合适的数据测试代 码。
14
10. 指出在线性开型寻址散列中进行顺序访问所存在的困 难。 16. 指出在链表散列中进行顺序访问所存在的困难。 18.从低层开发ChainHashTable类。定义自己的类 HashNode,其中包含data域和link域,不要使用链表类的 任何版本。测试代码。 class ChainHashTable { ……. private: int D; // 位置数 HashNode <E,K> **ht; // 桶数组,每个桶以一个头节点开 头 };
8
template <class T> T DblStack<T> ::Top(int i) { //若栈不空则函数返回该栈栈顶元素。 if (IsEmpty(i)) throw OutofBounds(); // 判栈空否 return Elements[top[i]]; //返回栈顶元素的值 }
10
template<class T> class Queue { public: Queue(int MaxQueueSize = 10); ~Queue() {…} bool IsEmpty() const bool IsFull() const T First() const; //返回队首元素 T Last() const; // 返回队尾元素 Queue<T>& Add(const T& x); Queue<T>& Delete(T& x); private: int front; //与第一个元素在反时针方向上相差一个位置 int rear; // 指向最后一个元素 int MaxSize; // 队列数组的大小 T *queue; // 数组 };
5
template <class T> DblStack<T> :: DblStack (int sz) { //建立一个最大尺寸为sz的空栈。 m = sz; top[0] = -1; bot[0] = -1; top[1] = sz; bot[1] = sz; Elements = new T[m]; //创建栈的数组空间 }
6
template <class T> DblStack<T>& DblStack<T> :: Push (const T &x, int i) { //如果IsFull(),则报错;否则把x插入到栈i的栈顶 If (IsFull()) throw NoMem(); //栈满 if (i == 0) Elements[++top[0]] = x; //栈0情形:栈顶指针先 加1, 然后按此地址进栈 else Elements[--top[1]] = x; //栈1情形:栈顶指针先减 1, 然后按此地址进栈 }
2
(2)映射关系为: 按对角线映射,从低对角线到高对角线: map(i,j)= n-(i-j+1) = n+j-i-1
按行映射:map(i,j) = n+i-j-1 = j- i 按列映射:map(i,j)= i-j = n+j-i-1
i>j i<=j i>j i<=j
3
1
(1) 证明:由于对所有的I和j都有T(I,j)=T(I-1,j-1),即对角 线上的元素均相等, 对下三角(包括最长对角线),有n条等值线,若是 这n条等值线的值互不相等,则有n个不同的元素。 对上三角(不包括最长对角线),有n-1条等值线, 若这些等值线的值互不相等,则有n-1个不同的元素 对于此矩阵,若是上三角的元素和下三角的元素均 不相等,此时矩阵含有的不同元素最多,即最多有 2n-1个不同的元素。