山东大学数据结构作业

合集下载

山东大学-数据结构实验报告-矩阵和散列表

山东大学-数据结构实验报告-矩阵和散列表

山东大学计算机科学与技术学院数据结构课程实验报告了Input函数和Output函数。

对问题三,仿课本所述,定义Term类作为SparseMatrix类的友元类,包含行、列、值三个要素的成员变量,用Term类的数组实现稀疏矩阵的行主映射存储。

查找行为的实现方式是,找到位于目标元素前一行的最后一个元素,再从这个元素开始向下搜索,直到找到和目标元素同一行但是列数小于目标元素的元素a[k-1],然后决定下一步的行为————插入一个新项Term作为a[k]并将已有元素向后移位,还是修改已存在的项a[k]。

以此原理编写了Store和Retrieve函数,并扩展编写了Input函数和Output函数。

对问题四,仿照课本例子编写了有序链表类SortedChain、开放寻址的散列表类HashTable、基于有序链表链接的散列表类ChainHashTable,并对这三个类分别扩展编写了Output函数。

3.测试结果(测试输入,测试输出)问题一:问题二:上图显示了输入不符合下三角方阵约束时,抛出异常并退出程序。

上图是正常运行的结果。

问题三:普通的输入和输出操作如下:矩阵相加:矩阵转置:问题四:以上图的数据为例。

从346就应该在链表链接的散列表上看到开放寻址解决冲突的例子。

返回开放寻址的输出段,可以看到符合预期的结果:4.实现源代码(程序风格清晰易理解,有充分的注释)/** TridiagonalMatrix.h** Created on: Nov 22, 2015* Author: xudp*/#ifndef TRIDIAGONALMATRIX_H_#define TRIDIAGONALMATRIX_H_#include<iostream>using namespace std;template<class T>class TridiagonalMatrix {public:// 1、创建三对角矩阵类,采用按列映射方式,提供 store 和 retrieve 方法。

山东大学数据结构模拟试卷

山东大学数据结构模拟试卷

山东大学数据结构(一)一、单选题(每题2 分,共20分)1.栈和队列的一路特点是( )。

A.只允许在端点处插入和删除元素B.都是先进后出C.都是先进先出D.没有一路点2.用链接方式存储的队列,在进行插入运算时( ).A. 仅修改头指针B. 头、尾指针都要修改C. 仅修改尾指针D.头、尾指针可能都要修改3.以下数据结构中哪个是非线性结构?( )A. 队列B. 栈C. 线性表D. 二叉树4.设有一个二维数组A[m][n],假设A[0][0]寄存位置在644(10),A[2][2]寄存位置在676(10),每一个元素占一个空间,问A[3][3](10)寄存在什么位置?脚注(10)表示用10进制表示。

A.688 B.678 C.692 D.6965.树最适合用来表示( )。

A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据6.二叉树的第k层的结点数最多为( ).A.2k-1 +1 C.2K-1 D. 2k-17.如有18个元素的有序表寄存在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为( )A. 1,2,3B. 9,5,2,3C. 9,5,3D. 9,4,2,38.对n个记录的文件进行快速排序,所需要的辅助存储空间大致为A. O(1)B. O(n)C. O(1og2n)D. O(n2)9.对于线性表(7,34,55,25,64,46,20,10)进行散列存储时,若选用H(K)=K %9作为散列函数,则散列地址为1的元素有()个,A.1 B.2 C.3 D.410.设有6个结点的无向图,该图至少应有( )条边才能确保是一个连通图。

.6 C二、填空题(每空1分,共26分)1.通常从四个方面评价算法的质量:_________、_________、_________和_________。

2.一个算法的时刻复杂度为(n3+n2log2n+14n)/n2,其数量级表示为________。

山东大学-2018-2019-学年-一-学期----数据结构--课程试卷A

山东大学-2018-2019-学年-一-学期----数据结构--课程试卷A

………………………………………………密………………………………封………………………………线………………………………山东大学 2018-2019 学年 一 学期 数据结构 课程试卷A题号 一 二 三 四 五 六 七 八 九 十 总分 阅卷人得分学院 专业 级 学号 姓名一、线性结构(30分)。

1、已知线性表:(8,9,2,13,0,7,1,6,5),请完成以下题目。

⑴请描述公式化描述及链表描述的空间需求。

如果需要删除元素13,请描述各自的时间复杂度。

⑵ 请分别进行选择排序、插入排序、快速排序(以8为轴),并给出第一轮排序结束后各自的结果。

⑶ 设计散列表,散列函数为H (k)=k%7,散列表长度为11,请给出线性开型寻址的散列表。

⑷ 基于以上散列表,查找元素1,给出需要的查找次数。

⑸若使用单链表存储上述线性表,请阅读以下程序,并给出程序运行结果及其时间复杂度。

二、层次结构(35分)。

1. 二叉树的层次遍历序列为ABCDEFGHIJ ,中序遍历序列为DBGEHJACIF ,写出该二叉树的前序遍历序列。

2. 一个最大堆为(66,37,41,30,25,40,35,18),依次从中删除两个元素,写出最后得到的堆。

3. 有一份电文中共使用6个字符:A 、B 、C 、D 、E 、F ,它们的出现频率依次为10、6、5、2、15、4,试画出对应的赫夫曼树(请按左子树根节点的权小于等于右子树根节点的权的次序构造,左0右1),并求出每个字符的赫夫曼编码。

4. 对给定输入序列{ 19, 5, 7, 11, 26, 18, 16, 17 },构建AVL 树。

5. 在下列5阶B-树中首先插入关键字85,然后删除关键字70,画出插入元素和删除元素后的B-树。

三、网状结构(35分)。

1. 请给出从加权无向图中生成最小耗费生成树的两种方法,请分别描述其算法思想,并给出各自的时间复杂度。

2. 下面是某有向加权图(顶点A,B,C,D,E)的耗费邻接矩阵,先给出一个拓扑序列,然后,使用Dijkstra算法依次计算出顶点A 至其它各顶点的最短路径和最短路径长度。

山东大学数据结构第1-3章作业

山东大学数据结构第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,该函数将表中元素的次序变反。

山大网络《数据结构》试卷(b卷)

山大网络《数据结构》试卷(b卷)

《数据结构》试卷(B卷)一、单项选择题1. 线性表是__A___。

A.一个有限序列,可以为空B.一个有限序列,不可以为空C.一个无限序列,可以为空D.一个无限序列,不可以为空2. 在一个长度为n的顺序表中删除第i个元素(0<=i<=n)时,需向前移动 A 个元素。

A.n-i B.n-i+l C.n-i-1 D.i3. 线性表采用链式存储时,其地址_D___。

A.必须是连续的B.一定是不连续的C.部分地址必须是连续的D.连续与否均可以4. 从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需平均比较___C_个元素结点。

A.n/2 B.n C.(n+1)/2 D.(n-1)/25. 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是_A D 。

A. p->next=s; s->prior=p;p->next->prior=s; s->next=p->next;B. s->prior=p; s->next=p->next;p->next=s; p->next->prior=s;C. p->next=s; p->next->prior=s;s->prior=p; s->next=p->next;D. s->prior=p; s->next=p->next;p->next->prior=s; p->next=s;6. 设单链表中指针p指向结点m,若要删除m之后的结点(若存在),则需修改指针的操作为__A___。

A.p->next=p->next->next; B.p=p->next;C.p=p->next->next; D.p->next=p;7. 在一个长度为n的顺序表中向第i个元素(0< i<n+l )之前插入一个新元素时,需向后移动__B_个元素。

山大-数据结构习题

山大-数据结构习题

第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. 对建立的二叉排序树进行中序遍历,并输出排序结果。

三、实验步骤1. 设计二叉排序树的数据结构在开始编写代码之前,我们需要先设计二叉排序树的数据结构。

二叉排序树的每个节点包含一个整数值和两个指针,分别指向左子树和右子树。

2. 实现二叉排序树的建立首先,我们需要实现一个函数,用于创建二叉排序树。

该函数根据输入的一组整数,逐个插入到二叉排序树中。

具体步骤如下:- 创建一个空的二叉排序树;- 依次读取输入的整数,并将其插入到二叉排序树中的合适位置;- 返回建立好的二叉排序树。

3. 实现二叉排序树的查找在二叉排序树中查找一个特定的值,可以使用递归或迭代的方式实现。

具体步骤如下:- 如果当前节点为空,返回空指针;- 如果当前节点的值等于目标值,返回当前节点;- 如果目标值小于当前节点的值,递归地在左子树中查找;- 如果目标值大于当前节点的值,递归地在右子树中查找。

4. 实现二叉排序树的插入在二叉排序树中插入一个新的值,需要保持二叉排序树的有序性。

具体步骤如下:- 如果树为空,将新值作为根节点插入;- 如果新值小于当前节点的值,将新值插入到左子树中;- 如果新值大于当前节点的值,将新值插入到右子树中。

5. 实现二叉排序树的删除在二叉排序树中删除一个特定的值,需要保持二叉排序树的有序性。

具体步骤如下:- 如果树为空,返回空指针;- 如果目标值小于当前节点的值,递归地在左子树中删除;- 如果目标值大于当前节点的值,递归地在右子树中删除;- 如果目标值等于当前节点的值,进行删除操作。

山东大学-数据结构实验报告-矩阵与散列表

山东大学-数据结构实验报告-矩阵与散列表

山东大学计算机科学与技术学院数据结构课程实验报告了Input函数和Output函数。

对问题三,仿课本所述,定义Term类作为SparseMatrix类的友元类,包含行、列、值三个要素的成员变量,用Term类的数组实现稀疏矩阵的行主映射存储。

查找行为的实现方式是,找到位于目标元素前一行的最后一个元素,再从这个元素开始向下搜索,直到找到和目标元素同一行但是列数小于目标元素的元素a[k-1],然后决定下一步的行为————插入一个新项Term作为a[k]并将已有元素向后移位,还是修改已存在的项a[k]。

以此原理编写了Store和Retrieve函数,并扩展编写了Input函数和Output函数。

对问题四,仿照课本例子编写了有序链表类SortedChain、开放寻址的散列表类HashTable、基于有序链表链接的散列表类ChainHashTable,并对这三个类分别扩展编写了Output函数。

3.测试结果(测试输入,测试输出)问题一:问题二:上图显示了输入不符合下三角方阵约束时,抛出异常并退出程序。

上图是正常运行的结果。

问题三:普通的输入和输出操作如下:矩阵相加:矩阵转置:问题四:以上图的数据为例。

从346就应该在链表链接的散列表上看到开放寻址解决冲突的例子。

返回开放寻址的输出段,可以看到符合预期的结果:4.实现源代码(程序风格清晰易理解,有充分的注释)/** TridiagonalMatrix.h** Created on: Nov 22, 2015* Author: xudp*/#ifndef TRIDIAGONALMATRIX_H_#define TRIDIAGONALMATRIX_H_#include<iostream>usingnamespace std。

template<class T>class TridiagonalMatrix {public:// 1、创建三对角矩阵类,采用按列映射方式,提供 store 和 retrieve 方法。

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

第6章线性表——链式描述2.template<class T>T& class chain :: setSize(int theSize){if(theSize<0)cout<<”链表长度值非法!”<<endl;else{inti = 0;//遍历链表chainNode<T>* currentNode = firstNode;while(currentNode != NULL){currentNode = currentNode->next;i++;}if(i>=theSize){currentNode = firstNode;for(int j=0;j<theSize;j++)currentNode = currentNode->next;listSize = theSize;currentNode->next = NULL;}}}3.template<class T>void chain<T>set(int theIndex,const T&theElement){if(theIndex<0 || theIndex>listSize){ostringstream s;s<<”index = ”<<theIndex<<”size = “<<listSize;throwilleagaiIndex(s.str());}chainNode<T>* deleateNode;if(theIndex == 0){deleateNode = firstNode;firstNode = new chainNode<T>(theElement,firstNode);}else{chianNode<T>* p = firstNode;for(int i = 0;i<theIndex-1;i++)p = p->next;deleateNode = p->next;p->next = new chainNode<T>(theElement,p->next);}deleatedeleateNode;}4.template<class T>void chain<T>::removeRange(fromIndex,toIndex){if(fromIndex<0 || fromIndex<toIndex || toIndex>listSize){ostringstream s;s<<”fromIndex= ”<<fromIndex<<”toIndex = ”<<toIndex<<”size = “<<listSize;throwilleagaiIndex(s.str());}chainNode<T> * p = firstNode,q;if(fromIndex == toIndex){chianNode<T>* deleateNode;if(fromIndex == 0){deleateNode = firstNode;firstNode = firstNode->next;}else{for(int i = 0;i<fromIndex-1;i++)p = p->next;deleateNode = p->next;p->next = p->next->next;}listSize--;deleatedeleateNode;}else{inti;for(i = 0;i<fromSize-1;i++)p = p->next;while(i<toSize){chainNode<T>* deleateNode = p;p = p->next;i++;listSize--;deleatedeleateNode;}}}第7章数组和矩阵14.1)#include<iostream>using namespace std;int main(){int **a = new int*[3];//原矩阵int **b = new int*[6];//转置矩阵for (int i = 0; i< 3; i++)a[i] = new int[6];for (int i = 0; i< 6; i++)b[i] = new int[3];int element[18] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };int k = 0;for (int i = 0; i< 6; i++){for (int j = 0; j < 3; j++){a[j][i] = element[k];k++;}}cout<< "The old matrix is:" <<endl;for (int i = 0; i< 3; i++){for (int j = 0; j < 6; j++){cout<< a[i][j] << " ";}cout<<endl;}for (int i = 0; i< 6; i++){for (int j = 0; j < 3; j++){b[i][j] = a[j][i];}}cout<< "The new matrix is:" <<endl;for (int i = 0; i< 6; i++){for (int j = 0; j < 3; j++){cout<< b[i][j] << " ";}cout<<endl;}}2)#include<iostream>using namespace std;int main(){int **a = new int*[3];//原矩阵int **b = new int*[6];//转置矩阵for (int i = 0; i< 3; i++)a[i] = new int[6];for (int i = 0; i< 6; i++)b[i] = new int[3];int element[18] = { 0, 3, 6, 9, 12, 15, 1, 4, 7, 10, 13, 16, 2, 5, 8, 11, 14, 17 };int k = 0;for (int i = 0; i< 3; i++){for (int j = 0; j < 6; j++){a[i][j] = element[k];k++;}}cout<< "原矩阵是:" <<endl;for (int i = 0; i< 3; i++){for (int j = 0; j < 6; j++){cout<< a[i][j] << " ";}cout<<endl;}for (int i = 0; i< 6; i++){for (int j = 0; j < 3; j++){b[i][j] = a[j][i];}}cout<< "转置矩阵是:" <<endl;for (int i = 0; i< 6; i++){for (int j = 0; j < 3; j++){cout<< b[i][j] << " ";}cout<<endl;}intct = 0, cm = 0, cw = 0;intcelement[9];for (int i = 1; i<= 3; i++){for (int j = 1; j <= 3; j++){int sum = element[ct] * element[cm]; for (int m = 2; m <= 6; m++){ ct++; cm += 3;sum += element[ct] * element[cm]; }celement[cw++] = sum; ct -= 5; cm = j; }ct += 6; cm = 0; }cout<< "原矩阵与其转置矩阵的积为:" <<endl; for (int i = 0; i< 3; i++){ for (int j = 0; j < 3; j++)cout<<celement[3*i+j]<< " "; cout<<endl; } }18.1)解:由题意得,该矩阵如下所示:1000101001111000001000101111000000000000001001011很明显该矩阵不是对称的,是上三角矩阵,不是下三角矩阵。

2)此小题中矩阵其实就是第一小题中矩阵的转置矩阵1000000000000011001000000000011110110111000011101显然,该矩阵不是对称矩阵,不是上三角矩阵,是下三角矩阵。

39.1)500×500的二维整形数组需要1000000个byte 的空间,而使用sparseMatrix 需要24000个byte 的空间。

2).要有m +n 3个非零元素,才使sparseMatrix 的储存所需要的空间超过m ×n 二维数组所需要的空间。

第八章 栈7、1)i.template<class T>voidarrayStack<T>::Input(){//输入栈T *elements[arrayLength];intft = 0,i=0;cout<<”请输入要输入到栈中的数据,输入-1结束,最多输入”<<arrayLength<<”个:”<<endl;while(ft != -1 &&!(i>LarrayLength)){elements[i] = ft;i++;}if(ft != 1)cout<<”输入元素过多!已强行终止。

相关文档
最新文档