山东大学数据结构作业
山东大学-数据结构实验报告-矩阵和散列表
山东大学计算机科学与技术学院数据结构课程实验报告了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题号 一 二 三 四 五 六 七 八 九 十 总分 阅卷人得分学院 专业 级 学号 姓名一、线性结构(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章作业
第一章作业第章作试编个递归数来输个素的 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卷)一、单项选择题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 方法。
山东大学数据结构实验报告八
山东大学软件工程学院数据结构课程实验报告学号:姓名:班级:软件工程2014级2班实验题目:图的操作实验学时:实验日期: 2015.12.9实验目的:掌握图的基本概念,描述方法;遍历方法。
硬件环境:实验室软件环境:Vistual Studio 2013实验步骤与内容:实验内容:1、创建图类。
二叉树的存储结构使用邻接矩阵或链表。
2、提供操作:遍历、BFS、DFS3、对建立好的图,执行上述各操作。
4、输出生成树。
5、输出最小生成树。
代码体:Adjacencywdigraph.h#ifndef ADJACENCYWDIGRAPH_H#define ADJACENCYWDIGRAPH_Hclass AdjacencyWDigraph{friend class AdjacencyWGraph;public:AdjacencyWDigraph(int Vertices = 10, int noEnge = 0);~AdjacencyWDigraph();bool Exist(int i, int j) const;int Edges() const{ return e; }int Vertices() const{ return n; }AdjacencyWDigraph& Add(int i, int j, const int& w = 1);AdjacencyWDigraph& Delete(int i, int j);int OutDegree(int i) const;int InDegree(int i) const;void InitializePos() { pos = new int[n + 1]; }void DeactivatePos() { delete[] pos; }int Begin(int i);int NextVertex(int i);void BFS(int v, int reach[], int label = 1);void DFS(int v, int reach[], int label = 1);bool Connected(int& x);int** SpanningTree();int** SpanningMinTree();void OutPut();private:int MinNum();int Min(int v, int reach[]);bool Connecting(int i);void dfs(int v, int reach[], int label);int NoEdge, n, e;int **a;int *pos;};#endifAdjacencywdigraph.cpp#include<iostream>#include<queue>using namespace std;#include"adjacencywdigraph.h"AdjacencyWDigraph::AdjacencyWDigraph(int Vertices, int noEdge){ n = Vertices;e = 0;NoEdge = noEdge;a = new int*[n + 1];for (int i = 1; i <= n; i++)a[i] = new int[n + 1];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)a[i][j] = NoEdge;}AdjacencyWDigraph::~AdjacencyWDigraph(){for (int i = 1; i <= n; i++)delete[] a[i];delete[] a;}bool AdjacencyWDigraph::Exist(int i, int j) const{if (i < 1 || j < 1 || i > n || j > n || a[i][j] == NoEdge)return false;return true;}AdjacencyWDigraph& AdjacencyWDigraph::Add(int i, int j, const int& w){ if (i < 1 || j < 1 || i > n || j > n)cout << "错误!点" << i << "或点" << j << "不存在,无法添加边" << endl;else if (a[i][j] != NoEdge)cout << "错误!该边已存在,无法再添加" << endl;else{a[i][j] = w;e++;}return *this;}AdjacencyWDigraph& AdjacencyWDigraph::Delete(int i, int j){if (i < 1 || j < 1 || i > n || j > n || a[i][j] == NoEdge)cout << "错误!该边不存在,无法删除" << endl;else{a[i][j] = NoEdge;e--;}return *this;}int AdjacencyWDigraph::OutDegree(int i) const{if (i < 1 || i > n){cout << "错误,该点不存在!" << endl;return 0;}else{int sum = 0;for (int j = 1; j <= n; j++)if (a[i][j] != NoEdge)sum++;return sum;}}int AdjacencyWDigraph::InDegree(int i) const{ if (i < 1 || i > n){cout << "错误,该点不存在!" << endl;return 0;}else{int sum = 0;for (int j = 1; j <= n; j++)if (a[j][i] != NoEdge)sum++;return sum;}}int AdjacencyWDigraph::Begin(int i){if (i < 1 || i > n){cout << "错误,该点不存在!" << endl;return 0;}else{for (int j = 1; j <= n; j++)if (a[i][j] != NoEdge){pos[i] = j;return j;}pos[i] = n + 1;return 0;}}int AdjacencyWDigraph::NextVertex(int i){ if (i < 1 || i > n){cout << "错误,该点不存在!" << endl;return 0;}else{for (int j = pos[i] + 1; j <= n; j++)if (a[i][j] != NoEdge){pos[i] = j;return j;}pos[i] = n + 1;return 0;}}void AdjacencyWDigraph::BFS(int v, int reach[], int label){ if (v < 1 || v > n){cout << "错误,该点不存在!" << endl;return;}queue<int> q;InitializePos();reach[v] = label;q.push(v);while (!q.empty()){int w = q.front();q.pop();int u = Begin(w);while (u){if (!reach[u]){q.push(u);reach[u] = label;}u = NextVertex(w);}}DeactivatePos();}void AdjacencyWDigraph::dfs(int v, int reach[], int label){ reach[v] = label;int u = Begin(v);while (u){if (!reach[u])dfs(u, reach, label);u = NextVertex(v);}}void AdjacencyWDigraph::DFS(int v, int reach[], int label){ if (v < 1 || v > n){cout << "错误,该点不存在!" << endl;return;}InitializePos();dfs(v, reach, label);DeactivatePos();}void AdjacencyWDigraph::OutPut(){for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++)cout << a[i][j] << "\t";cout << endl;}}bool AdjacencyWDigraph::Connecting(int i){ int *reach = new int[n + 1];for (int j = 1; j <= n; j++)reach[j] = 0;BFS(i, reach, 1);for (int j = 1; j <= n; j++)if (!reach[j]){delete[]reach;return false;}delete[] reach;return true;}bool AdjacencyWDigraph::Connected(int& x){ bool *flag = new bool[n + 1];for (int i = 1; i <= n; i++)flag[i] = Connecting(i);for (int i = 1; i <= n; i++)if (flag[i]){x = i;return true;}return false;}int AdjacencyWDigraph::Min(int v, int reach[]){int k = 0, min = 0;for (int i = 1; i <= n; i++){if (!reach[i] && a[v][i] != NoEdge && !min){k = i;min = a[v][i];}else if (!reach[i] && a[v][i] != NoEdge && min > a[v][i]){ k = i;min = a[v][i];}}return k;}int** AdjacencyWDigraph::SpanningTree(){int x;if (!Connected(x)){cout << "该图不是连通图,无法生成树!" << endl;return 0;}else{InitializePos();queue<int> q;int **b = new int*[n + 1];for (int i = 1; i <= n; i++)b[i] = new int[n + 1];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)b[i][j] = 0;int *reach = new int[n + 1];for (int i = 1; i <= n; i++)reach[i] = 0;reach[x] = 1;q.push(x);while (!q.empty()){int w = q.front();q.pop();int u = Begin(w);while (u){if (!reach[u]){q.push(u);b[w][u] = a[w][u];reach[u] = 1;}u = NextVertex(w);}}delete[] reach;DeactivatePos();return b;}}int AdjacencyWDigraph::MinNum(){int k = 0, m = 0;for (int i = 1; i <= n; i++){if (Connecting(i)){int min = 0;for (int j = 1; j <= n; j++){if (a[i][j] != NoEdge && !min){min = a[i][j];}else if (a[i][j] != NoEdge && min > a[i][j]){min = a[i][j];}}if (m && m > min){m = min;k = i;}else if (!m){m = min;k = i;}}}return k;}int** AdjacencyWDigraph::SpanningMinTree(){int x;if (!Connected(x)){cout << "该图不是连通图,无法生成树!" << endl;return 0;}else{int **b = new int*[n + 1];for (int i = 1; i <= n; i++)b[i] = new int[n + 1];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)b[i][j] = 0;int *reach = new int[n + 1];for (int i = 1; i <= n; i++)reach[i] = 0;x = MinNum();reach[x] = 1;int k1, k2, z, min = 1;while (min){min = 0;for (int i = 1; i <= n; i++)if (reach[i]){k2 = Min(i, reach);if (k2 && !min){min = a[i][k2];z = i;k1 = k2;}else if (k2 && min > a[i][k2]){min = a[i][k2];z = i;k1 = k2;}}reach[k1] = 1;b[z][k1] = a[z][k1];}delete[] reach;return b;}}Adjacencywgraph.h#ifndef ADJACENCYWGRAPH_H#define ADJACENCYWGRAPH_H#include"adjacencywdigraph.h"class AdjacencyWGraph :public AdjacencyWDigraph{public:AdjacencyWGraph(int Vertices = 10, int noEdge = 0): AdjacencyWDigraph(Vertices, noEdge){} AdjacencyWGraph& Add(int i, int j, const int& w = 1);AdjacencyWGraph& Delete(int i, int j);int Degree(int i){ return OutDegree(i); }bool Connected();int** SpanningTree();int** SpanningMinTree();int MinNum();};#endifAdjacencywgraph.cpp#include<iostream>#include<queue>using namespace std;#include"adjacencywgraph.h"AdjacencyWGraph& AdjacencyWGraph::Add(int i, int j, const int& w){ if (i < 1 || j < 1 || i > n || j > n)cout << "错误!点" << i << "或点" << j << "不存在,无法添加边" << endl;else if (a[i][j] != NoEdge)cout << "错误!该边已存在,无法再添加" << endl;else{a[i][j] = w;a[j][i] = w;e++;}return *this;}AdjacencyWGraph& AdjacencyWGraph::Delete(int i, int j){if (i < 1 || j < 1 || i > n || j > n || a[i][j] == NoEdge)cout << "错误!该边不存在,无法删除" << endl;else{a[i][j] = NoEdge;a[j][i] = NoEdge;e--;}return *this;}bool AdjacencyWGraph::Connected(){int *reach = new int[n + 1];for (int i = 1; i <= n; i++)reach[i] = 0;BFS(1, reach, 1);for (int i = 1; i <= n; i++)if (!reach[i])return false;return true;}int** AdjacencyWGraph::SpanningTree(){if (!Connected()){cout << "该图不是连通图,无法生成树!" << endl;return 0;}else{InitializePos();queue<int> q;int **b = new int*[n + 1];for (int i = 1; i <= n; i++)b[i] = new int[n + 1];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)b[i][j] = 0;int *reach = new int[n + 1];for (int i = 1; i <= n; i++)reach[i] = 0;reach[1] = 1;q.push(1);while (!q.empty()){int w = q.front();q.pop();int u = Begin(w);while (u){if (!reach[u]){q.push(u);b[w][u] = b[u][w] = a[w][u];reach[u] = 1;}u = NextVertex(w);}}DeactivatePos();delete[] reach;return b;}}int AdjacencyWGraph::MinNum(){int d = 0, e = 0, min = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (a[i][j] != NoEdge && !min){min = a[i][j];d = i;e = j;}else if (a[i][j] != NoEdge && a[i][j] < min){min = a[i][j];d = i;e = j;}}}return d;}int** AdjacencyWGraph::SpanningMinTree(){if (!Connected()){cout << "该图不是连通图,无法生成树!" << endl;return 0;}else{int **b = new int*[n + 1];for (int i = 1; i <= n; i++)b[i] = new int[n + 1];for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)b[i][j] = 0;int *reach = new int[n + 1];for (int i = 1; i <= n; i++)reach[i] = 0;int x = MinNum();reach[x] = 1;int k1, k2, z, min = 1;while (min){min = 0;for (int i = 1; i <= n; i++)if (reach[i]){k2 = Min(i, reach);if (k2 && !min){min = a[i][k2];z = i;k1 = k2;}else if (k2 && min > a[i][k2]){min = a[i][k2];z = i;k1 = k2;}}reach[k1] = 1;b[z][k1] = b[k1][z] = a[z][k1];}delete[] reach;return b;}}Test.cpp#include<iostream>using namespace std;#include"adjacencywdigraph.h"#include"adjacencywgraph.h"int main(){AdjacencyWDigraph *awd = new AdjacencyWDigraph(5, 0);AdjacencyWGraph *awg = new AdjacencyWGraph(5, 0);//下面初始化一个有向图awd->Add(1, 5, 6);awd->Add(4, 3, 19);awd->Add(5, 4, 33);awd->Add(1, 2, 17);awd->Add(3, 4, 36);awd->Add(1, 3, 34);awd->OutPut();cout << "***********************************" << endl;cout << "宽度优先搜索开始" << endl;cout << "请输入起始点: "<<endl;int m;int *reach = new int[6];for (int i = 1; i <= 5; i++)reach[i] = 0;cin >> m;while (m < 1 || m>5){cout << "输入错误! ";cin >> m;}awd->BFS(m, reach);cout << "从点" << m << "能搜索到的点有: " << endl;for (int i = 1; i <= 5; i++)if (reach[i])cout << i << "\t";cout << endl;cout << "***********************************" << endl; cout << "广度优先搜索开始" << endl;cout << "请输入起始点: " << endl;for (int i = 1; i <= 5; i++)reach[i] = 0;cin >> m;while (m < 1 || m>5){cout << "输入错误!请重新输入: ";cin >> m;}awd->DFS(m, reach);cout << "从点" << m << "能搜索到的点有: " << endl;for (int i = 1; i <= 5; i++)if (reach[i])cout << i << "\t";cout << endl;cout << "***********************************" << endl; system("pause");cout << "生成树为: " << endl;int **a = awd->SpanningTree();if (a){for (int i = 1; i <= 5; i++){for (int j = 1; j <= 5; j++)cout << a[i][j] << "\t";cout << endl;}}for (int i = 1; i <= 5; i++)delete[] a[i];delete[] a;cout << "***********************************" << endl; system("pause");cout << "最小生成树为 : " << endl;a = awd->SpanningMinTree();if (a){for (int i = 1; i <= 5; i++){for (int j = 1; j <= 5; j++)cout << a[i][j] << "\t";cout << endl;}}for (int i = 1; i <= 5; i++)delete[] a[i];delete[] a;delete awd;awd = NULL;system("pause");return 0;}实验结果:结论分析与体会:矩阵十分的形象,但是用于表示图的时候感觉有一些理解上的不容易,还是用直观的图来表示更加容易理解,但是相比于实际的代码操作来讲,用矩阵来表示图是最方便的。
2022年智慧树数据结构(山东大学)单元测试答案
1数据结构的形式定义是(D, S),其中D是数据元素的有限集,S是D上的关系有限集。
(答案)对2在数据结构中,从层次上可以把数据结构分成(答案)逻辑结构和存储结构3线性表若采用链式存储结构时,要求内存中可用的存储单元的地址(答案)连续不连续都可以4下面程序的时间复杂度为(答案)O(m×n)5若需要利用形参直接访问实参,则应把形参变量说明为参数。
(答案)引用第二章测试1带头结点的单链表L为空的判定条件是(答案)L→next= =NULL2非空的循环单链表L的尾结点(由p所指向)满足(答案)p→next= =L3在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行。
(答案)p→next=s; s→next=q4在一个单链表中,若删除p所指结点的后继结点,则执行(答案)q=p→next; p→next=q→next5在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的算法的时间复杂度为(答案)O(n)1、一个栈的入栈序列是A,B,C,D,E,则栈的不可能的输出序列是。
(答案)DCEAB2、在一个链队中,假设f和r分别为队首和队尾指针,则插入s所指结点的运算是。
(答案)r->next=s; r=s3、一个队列的入队序列是1,2,3,4,则队列的输出序列是。
(答案)1,2,3,44、一个中缀算术表达式为1+(3-x)*y,则其对应的后缀算术表达式为。
(答案)13x-y*+5、一个栈的入栈序列是A,B,C,D,E,f,出栈的序列是B,D,C,F,E,A,则栈的容量至少应()(答案)3第四章测试1如下图所示的4棵二叉树中,不是完全二叉树。
(答案)C2在线索化二叉树中,t所指结点没有左子树的充要条件是(答案)t->ltag= =13对一个满二叉树,m个树叶,n个结点,深度为h,则(答案)n=2h-14一个具有1025个结点二叉树的高h 为()(答案)11~10255一颗非空的二叉树的先序遍历序列和后序便利序列正好相反,则该二叉树满足()(答案)只有一个叶子结点第五章测试1(答案)22对于如下图所示的图,若从顶点a出发深度优先搜索遍历,得到的顶点序列为。
山东大学数据结构作业
} 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;
p = p->next; deleateNode = p->next; p->next = new chainNode<T>(theElement,p->next);
} deleate deleateNode; } 4. template<class T> void chain<T>::removeRange(fromIndex,toIndex){ if(fromIndex<0 || fromIndex<toIndex || toIndex>listSize){ ostringstream s;
6、见后面手写部分 12、 MaxHeap& changeMax(int x){
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、当α的值较小时,散列存储通常比其他存储方式具有()的查找速度。
山东大学数据结构实验二
数据结构实验报告——实验二实验题目:排序算法学号:201300121111 日期:14-11-19 班级:13物联网姓名:卢日辉Email:2466379123@实验目的:掌握各种排序方法实现思想任务要求:1.提供操作:选择排序,冒泡排序,插入排序,基数排序,快速排序,归并排序。
2.显示中间过程软件环境:Win7 操作系统开发工具:Visual C++ 6.0实验步骤:代码如下:#include<iostream.h>#include<windows.h>int t=0,p=0,k=0;void xuanze(int a[]){//选择排序int i,j,local,temp,max,op;for(i=0;i<8;i++){max=a[i];local=i;for(j=i+1;j<9;j++){if(a[j]>max){max=a[j];local=j;}}if(i!=local){temp=a[i];a[i]=a[local];a[local]=temp;}cout<<"step"<<i+1<<":"<<endl;for(op=0;op<9;op++){cout<<a[op]<<",";}cout<<endl;}}void maopao(int a[]){//冒泡排序int n,j,temp,op;for(n=0;n<8;n++){for(j=0;j<8-n;j++){if(a[j]<a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}cout<<"step"<<n+1<<":"<<endl;for(op=0;op<9;op++){cout<<a[op]<<",";}cout<<endl;}}void charu(int a[]){int b[9]={0};int i,j,op;for(i=0;i<9;i++){for(j=i;j>0;j--){if(b[j-1]<=a[i])b[j]=b[j-1];else break;}b[j]=a[i];cout<<"step"<<i+1<<":"<<endl;for(op=0;op<9;op++){cout<<b[op]<<",";}cout<<endl;}}int maxbit(int data[], int n) //辅助函数,求数据的最大位数{int d = 1; //保存最大的位数int p = 10;for(int i = 0; i < n; ++i) {while(data[i] >= p) {p *= 10;++d;}}return d;}void jishu(int data[], int n) //基数排序{n=9;int op;int d = maxbit(data, n); //数组中的元素的最大位数int *tmp = (int *)malloc(n * sizeof(int));int *count = (int *)malloc(10 * sizeof(int)); //计数器int i, j, k;int radix = 1;for(i = 1; i <= d; i++) { //进行d次排序for(j = 0; j < 10; j++)count[j] = 0; //每次分配前清空计数器for(j = 0; j < n; j++) {k = (data[j] / radix) % 10; //计算每次循环某一位的数字count[k]++; //统计每个桶中的记录数}for(j = 1; j < 10; j++)count[j] = count[j - 1] + count[j]; //第j个桶以及之前所有桶中元素的总数for(j = n - 1; j >= 0; j--) { //将所有桶中记录依次收集到tmp中k = (data[j] / radix) % 10;tmp[count[k] - 1] = data[j];count[k]--;}for(j = 0; j < n; j++) //将临时数组的内容复制到data中data[j] = tmp[j];cout<<"step"<<k<<endl;k++;for(op=0;op<9;op++){cout<<data[op]<<",";}cout<<endl;radix = radix * 10;}free(tmp);free(count);}void kuaisu(int a[],int start,int end) //快速排序{ int op;cout<<"step"<<t<<endl;t++;for(op=0;op<9;op++){cout<<a[op]<<",";}cout<<endl;inti=start,j=end;intpivot = a[i];while(i<j){while(i<j && pivot<=a[j])j--;a[i] = a[j];while(i<j && a[i]<=pivot)i++;a[j]=a[i];}a[i] = pivot;if(i>start)kuaisu(a,start,i);if(i<end) {kuaisu(a,i+1,end); }}void Merge(int a[],int s,int mid, int e) //归并辅助函数,将两个排列好{ //的数组排好整合到一个数组中int *b=new int[9];for(int w=0;w<9;w++)b[w]=a[w];inti=s;intj=mid+1;intk=s;while(i<=mid && j<=e){if(b[i]<b[j])a[k++] = b[i++];elsea[k++] = b[j++];}while(i<=mid)a[k++] = b[i++];while(j<=e)a[k++] = b[j++];}void MergeSort(int a[],int s,int e) //归并{ int op;if(s>=e)return;MergeSort(a,s,(s+e)/2);MergeSort(a,(s+e)/2+1,e);Merge(a,s,(s+e)/2,e);cout<<"step"<<p+1<<endl;p++;for(op=0;op<9;op++){cout<<a[op]<<",";}cout<<endl;}int main(void){int ch;kaishi:cout<<"默认待排序数列:40,91,43,1,66,75,12,108,97"<<endl;cout<<"选择排序方法:"<<endl;cout<<"1,选择排序"<<endl;cout<<"2,冒泡排序"<<endl;cout<<"3,插入排序"<<endl;cout<<"4,基数排序"<<endl;cout<<"5,快速排序"<<endl;cout<<"6,归并排序"<<endl;cin>>ch;system("cls");int a1[9]={40,91,43,1,66,75,12,108,97};int a2[9]={40,91,43,1,66,75,12,108,97};int a3[9]={40,91,43,1,66,75,12,108,97};int a4[9]={40,91,43,1,66,75,12,108,97};int a5[9]={40,91,43,1,66,75,12,108,97};int a6[9]={40,91,43,1,66,75,12,108,97};switch(ch){case 1:xuanze(a1);break;case 2:maopao(a2);break;case 3:charu(a3);break;case 4:jishu(a4,9);break;case 5:kuaisu(a5,0,8);break;case 6:MergeSort(a6,0,8);break;}system("pause");system("cls");goto kaishi;return 0;}具体设计和实现:各函数如上注释。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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<<”输入元素过多!已强行终止。