山东大学数据结构《数据结构》实验大纲 ver1
- 格式:doc
- 大小:328.23 KB
- 文档页数:22
《数据结构》实验要求与规范【基本要求】1.正确实现所要求的功能,按时提交实验报告。
2.实验报告内容应依次包括:⑴实验目的;⑵实验内容与要求;⑶数据结构设计;⑷算法设计;⑸测试结果;⑹心得体会。
3.程序用C语言或C++语言实现。
4.在包含主函数的程序文件起始处添加包含如下内容的注释:所引用代码和资料的出处、设计本程序时谁在哪些地方帮助过你。
5.在程序文件起始处添加包含如下内容的注释:文件名称、创建者姓名班级学号、创建时间、最后修改时间、文件中所定义的函数的名称和主要功能、文件中所定义的全局变量的变量名和主要功能、文件中用到的他处定义的全局变量及其出处、与其他文件的依赖关系。
6.对每个函数添加包含如下内容的注释:函数名称、函数主要功能、函数调用之前的预备条件、函数的输入参数、函数的输出参数、函数的返回值、该函数与其它函数的调用和被调用关系。
// 、姓名:陈明琨班级:计科4班学号12 参考数据结构课本及部分网络文库实验二顺序表的实现和应用实验目的:⑴熟悉线性表的定义和基本操作;⑵掌握线性表的顺序存储结构设计与基本操作的实现。
实验内容与要求:⑴定义线性表的顺序存储表示;⑵基于所设计的存储结构实现线性表的基本操作;⑶编写一个主程序对所实现的线性表进行测试;⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。
实验三、四链表的实现和应用实验目的:掌握线性表的链式存储结构设计与基本操作的实现。
实验内容与要求:⑴定义线性表的链式存储表示;⑵基于所设计的存储结构实现线性表的基本操作;⑶编写一个主程序对所实现的线性表进行测试;⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。
一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。
二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。
2)向顺序表插入元素:在顺序表的第i个位置插入元素x。
3)从顺序表删除元素:从顺序表中删除第i个位置的元素。
4)查找顺序表中的元素:在顺序表中查找元素x。
5)顺序表的逆序操作:将顺序表中的元素逆序排列。
(2)链表1)创建链表:创建一个带头结点的循环链表。
2)在链表中插入元素:在链表的第i个位置插入元素x。
3)在链表中删除元素:从链表中删除第i个位置的元素。
4)查找链表中的元素:在链表中查找元素x。
5)链表的逆序操作:将链表中的元素逆序排列。
2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。
2)入栈操作:将元素x压入栈中。
3)出栈操作:从栈中弹出元素。
4)获取栈顶元素:获取栈顶元素。
5)判断栈是否为空:判断栈是否为空。
(2)队列1)队列的初始化:创建一个队列,初始化为空。
2)入队操作:将元素x入队。
3)出队操作:从队列中出队元素。
数据结构实验课教案一、实验目的与要求1. 实验目的(1) 掌握数据结构的基本概念和算法。
(2) 培养实际操作能力,巩固课堂所学知识。
(3) 提高编程技能,为实际项目开发打下基础。
2. 实验要求(1) 严格按照实验指导书进行实验。
(2) 实验前认真预习,充分理解实验内容。
(3) 实验过程中积极思考,遇到问题及时解决。
(4) 按时完成实验,积极参与讨论与交流。
二、实验环境与工具1. 实验环境(1) 操作系统:Windows 7/8/10或Linux。
(2) 编程语言:C/C++、Java或Python。
(3) 开发工具:Visual Studio、Eclipse、IntelliJ IDEA或PyCharm。
2. 实验工具(1) 文本编辑器或集成开发环境(IDE)。
(2) 版本控制系统(如Git)。
(3) 在线编程平台(如LeetCode、牛客网)。
三、实验内容与安排1. 实验一:线性表的基本操作(1) 实现线性表的顺序存储结构。
(2) 实现线性表的插入、删除、查找等基本操作。
(3) 分析线性表的时间复杂度。
2. 实验二:栈与队列的基本操作(1) 实现栈的顺序存储结构。
(2) 实现队列的顺序存储结构。
(3) 实现栈与队列的进栈、出栈、入队、出队等基本操作。
(4) 分析栈与队列的时间复杂度。
3. 实验三:线性表的链式存储结构(1) 实现单链表的结构。
(2) 实现单链表的插入、删除、查找等基本操作。
(3) 分析单链表的时间复杂度。
4. 实验四:树与二叉树的基本操作(1) 实现二叉树的结构。
(2) 实现二叉树的遍历(前序、中序、后序)。
(3) 实现二叉搜索树的基本操作。
(4) 分析树与二叉树的时间复杂度。
5. 实验五:图的基本操作(1) 实现图的邻接矩阵存储结构。
(2) 实现图的邻接表存储结构。
(3) 实现图的深度优先搜索(DFS)和广度优先搜索(BFS)。
(4) 分析图的时间复杂度。
四、实验评价与成绩评定1. 实验评价(1) 代码质量:代码规范、注释清晰、易于维护。
数据结构实验大纲数据结构实验大纲1·实验目的1·1 熟悉数据结构的基本概念和算法1·2 掌握数据结构在实际问题中的应用1·3 培养分析和解决问题的能力2·实验环境2·1 编程语言:C/C++2·2 开发环境:Visual Studio/Xcode/Dev-C++ 3·实验内容3·1 实验一:线性表3·1·1 顺序表的基本操作3·1·2 单链表的基本操作3·1·3 循环链表的基本操作3·1·4 双向链表的基本操作3·2 实验二:栈与队列3·2·1 栈的基本操作3·2·2 队列的基本操作3·2·3 使用栈实现表达式求值3·2·4 使用队列实现约瑟夫环3·3 实验三:串与数组3·3·1 串的基本操作3·3·2 数组的基本操作3·3·3 字符串的模式匹配算法3·3·4 多维数组的应用3·4 实验四:树与图3·4·1 二叉树的基本操作3·4·2 二叉树的遍历算法3·4·3 霍夫曼树与哈夫曼编码3·4·4 图的存储结构与基本操作 3·4·5 图的遍历算法4·实验要求4·1 完成实验指导书中的所有实验内容4·2 书写实验报告,包括实验目的、实验环境、实验过程、实验结果分析和总结4·3 实验报告要求有清晰的实验步骤和相应截图或代码4·4 实验报告中需对实验结果进行说明和评价5·实验评分5·1 实验报告(60%)5·2 实验代码(40%)5·3 完成以上要求并提交实验报告和代码截图,得到及格分数6·附件6·1 实验指导书6·2 实验代码示例7·法律名词及注释●数据结构:指计算机中用于组织和存储数据的一种方式,它定义了数据之间的关系和操作。
实验一顺序表基本操作的实现与应用顺序表的运算·create(sqlist A):创建顺序表A,并返回其中的元素个数。
·disp(sqlist A,int n):输出一个具有n个元素的顺序表A。
·ins(sqlist A,int n, int i,elemtype x):在顺序表A的第i个元素前插入一个元素x。
若i=0,则新元素作为第1个元素;若i=n,则插入在顺序表的最后。
·del(sqlist A, int n, int i):在顺序表A中删除第i个元素。
·find(sqlist A, int n, elemtype x):在一个有n个元素的顺序表A中查找元素值为x 的元素。
一、【实验目的】掌握线性表在顺序存储下的插入与删除等基本运算二、【实验内容】1、设计顺序表的基本运算算法。
2、编写一个算法实现两个有序(从小到大)顺序表合并成为一个顺序表,合并后的结果放在第一个顺序表中,不另设新的顺序表存储(假设这两个有序顺序表中没有相同的元素)。
3、请编写26个字母按特定字母值插入或删除的完整程序。
三、【源程序及运行结果】实验二单链表基本操作的实现与应用单链表单链表节点的类型定义如下:typedef int elemtype; //定义数据域的类型typedef struct linknode{ //定义节点类型elemtype data;struct linknode *next;} linknode;单链表的运算·create():创建单链表,由用户输入各节点data 域的值,以0表示输入结束,最后返回建立的单链表的头指针。
·disp(nodetype *h):输出单链表h的所有节点的data 域的值。
·len(nodetype *h):返回单链表h的长度。
·find(nodetype *h,int i):返回单链表h中第i个节点的指针。
2020年山东大学考研专业课初试考试大纲
851计算机基础综合考试大纲
计算机基础综合包括数据结构、操作系统、计算机组成原理三部分内容,每部分内容各占1/3。
I 数据结构
课程基本要求
全面系统地掌握队列、堆、栈、树、图等基本数据结构,深刻理解和熟练掌握课程中的典型算法,为计算机学科的学习打下坚实基础。
考试内容
1.链表、间接寻址和模拟指针
2.数组和矩阵
3.堆栈和队列及其应用
4.跳表和散列
5.二叉树和其他树
6.合并/搜索应用,堆和堆排序
7.左高树,霍夫曼编码和竞赛树
8.搜索树,AVL树或红黑树,直方图
9.图
10.图和贪婪算法
11.货箱装载,0/1背包,最短路径和生成树
12.分而治之算法
13.动态编程
14.回溯和分枝定界算法
参考书目
1。
山东大学软件工程学院数据结构课程实验报告学号:姓名:班级:软件工程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;}实验结果:结论分析与体会:矩阵十分的形象,但是用于表示图的时候感觉有一些理解上的不容易,还是用直观的图来表示更加容易理解,但是相比于实际的代码操作来讲,用矩阵来表示图是最方便的。
山东大学软件工程学院数据结构课程实验报告学号:姓名:班级:软件工程2014级2班实验题目:矩阵和散列表实验学时:实验日期: 2015.11.11实验目的:掌握特殊矩阵和稀疏矩阵。
掌握散列表及其应用。
硬件环境:实验室软件环境:Vistual Studio 2013实验步骤与内容:实验内容:1、创建三对角矩阵类,采用按列映射方式,提供store和retrieve 方法。
2、创建下三角矩阵类,采用按列映射方式,提供store和retrieve 方法。
3、创建稀疏矩阵类,采用行主顺序把稀疏矩阵映射到一维数组中,实现稀疏矩阵的转置和两个稀疏矩阵的加法操作。
4、使用散列表设计实现一个字典,假设关键字为整数且D为961,在字典中插入随机产生的500个不同的整数,实现字典的建立和搜索操作。
分别使用线性开型寻址和链表散列解决溢出。
代码体:ChainHashTableNode.h#pragma once#include"ChainHashTableNode.h"using namespace std;class ChainHashTable{public:ChainHashTable(int divisor);~ChainHashTable();bool Insert(int k);bool Search(int k);void print();private:int d;ChainHashTableNode *ht;};ChainHashTableNode.cpp#include"ChainHashTable.h"#include<iostream>using namespace std;ChainHashTable::ChainHashTable(int divisor) {d = divisor;ht = new ChainHashTableNode[d];}bool ChainHashTable::Insert(int k){int j = k%d;if (ht[j].Insert(k)){return true;}else{return false;}}void ChainHashTable::print(){for (int i = 0; i < d; i++){ht[i].print();}}ChainHashTableNode.h#pragma once#include"Node.h"class ChainHashTableNode{public:ChainHashTableNode();bool Insert(int k);bool Search(int k);void print();private:Node *first;};ChainHashTableNode.cpp#include"ChainHashTableNode.h"#include<iostream>using namespace std; ChainHashTableNode::ChainHashTableNode() {first = 0;}bool ChainHashTableNode::Search(int k) {if (first == 0) return false;Node *current = first;while (current){if (current->value == k){return true;}current = current->link;if (current){if (current->value == k){return true;}}}return false;}bool ChainHashTableNode::Insert(int k) {if (Search(k)){cout << "已经存在此元素" << endl;return false;}else {Node *p = new Node();p->value = k;if (first == 0){first = p;return true;}else{p->link = first;first = p;return true;}}}void ChainHashTableNode::print(){Node *current = first;if (first){while (first){cout << first->value << " ";first = first->link;}cout << endl;first = current;}else {cout << -1 << endl;}}HashTable.h#pragma onceclass HashTable{public:HashTable(int divisor);~HashTable();int Search(int k);//搜索算法bool Insert(int e);void print();private:int hSearch(int k);int d;//除数int *ht;//桶,大小取决于d就是除数是多少bool *empty;//一维数组,用来存储第I个桶是否存入了元素};HashTable.cpp#include"HashTable.h"#include<iostream>using namespace std;HashTable::HashTable(int divisor){d = divisor;ht = new int[d];empty = new bool[d];for (int i = 0; i < d; i++){empty[i] = true;ht[i] = 0;}}HashTable::~HashTable(){delete[]ht;delete[]empty;}int HashTable::hSearch(int k)//搜索值为K的元素{int i = k%d;int j = i;do{if (ht[j] == k || empty[j]) return j;j = (j + 1) % d;} while (j != i);return j;}int HashTable::Search(int k)//搜索值为K的元素{int b = hSearch(k);if (ht[b] == k) return b;return -1;}bool HashTable::Insert(int e){int b = hSearch(e);if (empty[b]){ht[b] = e;empty[b] = false;return true;}else if (ht[b] == e){cout << "已经存在此元素" << endl;return false;}else{cout << "表已经满了" << endl;return false;}}void HashTable::print(){for (int i = 0; i < 961; i++){cout << ht[i] << " ";}cout << endl;return;}LowerTriangularMatrix.h#pragma onceclass LowerTriangularMatrix{public:LowerTriangularMatrix(int size);void Store(int x, int i, int j);//向矩阵里存储一个元素int Retrieve(int i, int j);//返回矩阵中的一个元素void print();private:int n;//矩阵维数int sum;//矩阵非零元素个数int *t;//用数组来存储矩阵};LowerTriangularMatrix.cpp#include"LowerTriangularMatrix.h"#include<iostream>using namespace std;LowerTriangularMatrix::LowerTriangularMatrix(int size){n = size;sum = n*(n + 1) / 2;t = new int[sum];}void LowerTriangularMatrix::Store(int x, int i, int j){if (i<0 || j<0 || i >= n || j >= n){cout << "下三角矩阵行列输入错误" << i << " " << j << endl;return;}else if (x == 0){cout << "下三角所添加的元素必须非零" << endl;return;}else if (i<j){cout << "下三角添加元素位置错误" << endl;return;}t[sum - ((n - j)*(n - j + 1) / 2) + (i - j)] = x;return;}int LowerTriangularMatrix::Retrieve(int i, int j){if (i<0 || j<0 || i >= (n - 1) || j >= (n - 1)){cout << "三对角矩阵行列输入错误" << endl;return -1;}else if (i >= j){return t[sum - ((n - j)*(n - j + 1) / 2) + (i - j)];}else{return 0;}}void LowerTriangularMatrix::print(){for (int i = 0; i < sum; i++){cout << t[i] << " ";}cout << endl;return;}Node.h#pragma onceclass Node{friend class ChainHashTableNode;private:int value;Node *link;};Node.cpp#include"Node.h"using namespace std;SparseMatrix.h#pragma once#include"Term.h"class SparseMatrix{public:SparseMatrix(int row, int col);void transpose();void Store(int x, int i, int j);//向矩阵里存储一个元素void Add(SparseMatrix &b);//两个稀疏矩阵相加void print();private:int row, col;//数组维数int sum;//元素个数int maxsum;//最多的元素个数Term *t;//存储的数组};SparseMatrix.cpp#include"SparseMatrix.h"#include<iostream>using namespace std;SparseMatrix::SparseMatrix(int r, int c){row = r;col = c;sum = 0;maxsum = r*c;t = new Term[maxsum];}void SparseMatrix::transpose(){Term *cur = new Term[maxsum];int *ColSize = new int[col];int *RowNext = new int[row];for (int i = 0; i < col; i++) ColSize[i] = 0;for (int i = 0; i < row; i++) RowNext[i] = 0;for (int i = 0; i < sum; i++) ColSize[t[i].col]++;//表示每一列的非零元素个数RowNext[0] = 0;for (int i = 1; i < col; i++) RowNext[i] = RowNext[i - 1] + ColSize[i - 1];//表示新矩阵中每一行的矩阵的前面的矩阵的个数//进入转置操作for (int i = 0; i < sum; i++){int j = RowNext[t[i].col]++;cur[j].value = t[i].value;cur[j].col = t[i].row;cur[j].row = t[i].col;}delete t;t = cur;}void SparseMatrix::Store(int x, int i, int j){t[sum].value = x;t[sum].row = i;t[sum].col = j;sum++;return;}void SparseMatrix::print(){for (int i = 0; i < sum; i++){cout << t[i].value << " ";}cout << endl;return;}void SparseMatrix::Add(SparseMatrix &b)//两个稀疏矩阵相加{if (col != b.col || row != b.row){cout << "两个矩阵行列不同无法相加" << endl;return;}int sa = 0;int sb = 0;Term *cur = new Term[maxsum];int k = 0;while (sa < sum || sb < b.sum){if (t[sa].col == b.t[sb].col&&t[sa].row == b.t[sb].row){cur[k].col = t[sa].col;cur[k].row = t[sa].row;cur[k].value = t[sa].value + b.t[sb].value;k++;sa++;sb++;}else if (t[sa].row < b.t[sb].row){cur[k].value = t[sa].value;cur[k].row = t[sa].row;cur[k].col = t[sa].col;k++;sa++;}else if (t[sa].row > b.t[sb].row){cur[k].value = b.t[sb].value;cur[k].row = b.t[sb].row;cur[k].col = b.t[sb].col;k++;sb++;}else if (t[sa].col < t[sb].col){cur[k].col = t[sa].col;cur[k].row = t[sa].row;cur[k].value = t[sa].value;k++;sa++;}else{cur[k].value = b.t[sb].value;cur[k].row = b.t[sb].row;cur[k].col = b.t[sb].col;k++;sb++;}}sum = k;delete t;t = cur;return;}Term.h#pragma onceclass Term{friend class SparseMatrix;private:int col, row;int value;};Term.cpp#include"Term.h"TridiagonalMatrix.h#pragma onceclass TridiagonalMatrix{public:TridiagonalMatrix(int size);void Store(int x, int i, int j);//向矩阵里存储一个元素int Retrieve(int i, int j);//返回矩阵中的一个元素void print();private:int n;//矩阵非0元素个数int *t;//用数组来存储矩阵};TridiagonalMatrix.cpp#include"TridiagonalMatrix.h"#include<iostream>using namespace std;TridiagonalMatrix::TridiagonalMatrix(int size){n = size;t = new int[3 * n - 2];}void TridiagonalMatrix::Store(int x, int i, int j){if (i<0 || j<0 || i >= n || j >= n){cout << "三对角矩阵行列输入错误" << i << " " << j << endl;return;}else if (x == 0){cout << "三对角矩阵所添加的元素必须非零" << endl;return;}else if (abs(i - j)>1){cout << "三对角矩阵添加元素位置错误" << endl;return;}switch (i - j){case -1:t[3 * j - 1] = x;break;case 0:t[3 * j] = x;break;case 1:t[3 * j + 1] = x;break;}return;int TridiagonalMatrix::Retrieve(int i, int j){if (i<0 || j<0 || i >= (n - 1) || j >= (n - 1)) {cout << "三对角矩阵行列输入错误" << endl;return -1;}else if (abs(i - j) <= 1){return t[3 * j + (i - j)];}else{return 0;}}void TridiagonalMatrix::print(){for (int i = 0; i < 3 * n - 2; i++){cout << t[i] << " ";}cout << endl;return;}Test.cpp#include<iostream>#include<cstring>#include<cstdlib>#include"TridiagonalMatrix.h"#include"LowerTriangularMatrix.h"#include"SparseMatrix.h"#include"HashTable.h"#include"ChainHashTable.h"using namespace std;int wei, num[100][100];void c(){for (int i = 0; i < wei; i++)for (int j = 0; j < wei; j++)cin >> num[i][j];}int main(){int k = 0, l = 0;/*三对角矩阵实验开始测试数据4~10~3n-241 2 0 03 4 5 00 7 8 90 0 8 7*/cout << "请输入三对焦矩阵维数及内容:" << endl;cin >> wei;c();TridiagonalMatrix *TM = new TridiagonalMatrix(wei);for (int i = 0; i < wei; i++)for (int j = 0; j < wei; j++)if (num[j][i] != 0)TM->Store(num[j][i], j, i);TM->print();cout << "请输入要查询的元素的位置" << endl;cin >> k >> l;l = TM->Retrieve(k, l);cout << "查询结果:" << l << endl;cout << "***********************************************" << endl;/*下三角矩阵实验开始测试数据4~10~n*(n+1)/241 0 0 02 3 0 04 5 6 07 8 9 -1*/cout << "请输入下三角矩阵维数及内容:" << endl;k = 0, l = 0;cin >> wei;c();LowerTriangularMatrix *LTM = new LowerTriangularMatrix(wei);for (int i = 0; i < wei; i++)for (int j = 0; j < wei; j++)if (num[j][i] != 0)LTM->Store(num[j][i], j, i);cout << "请输入要查询的元素的位置" << endl;cin >> k >> l;l = LTM->Retrieve(k, l);cout << "查询结果:" << l << endl;cout << "***********************************************" << endl;/*稀疏角矩阵实验开始测试数据4 54 51 0 0 0 20 3 0 0 04 0 05 00 6 7 0 84 58 0 7 6 00 5 0 0 40 0 0 3 02 0 0 0 19 0 7 6 20 8 0 0 44 0 0 8 02 6 7 0 9*/cout << "请输入稀疏矩阵的维数及内容:" << endl;cin >> k >> l;SparseMatrix *SM = new SparseMatrix(k, l);for (int i = 0; i < k; i++)for (int j = 0; j < l; j++){cin >> num[i][j];if (num[i][j])SM->Store(num[i][j], i, j);}cout << "稀疏矩阵为: ";SM->print();SM->transpose();cout << "转置后稀疏矩阵为: ";SM->print();SM->transpose();cout << "重新转置后稀疏矩阵为: ";cout << "矩阵相加开始,请输入要使用的矩阵维数及内容:" << endl;cin >> k >> l;SparseMatrix *SM2 = new SparseMatrix(k, l);for (int i = 0; i < k; i++)for (int j = 0; j < l; j++){cin >> num[i][j];if (num[i][j])SM2->Store(num[i][j], i, j);}cout << "新矩阵为: ";SM2->print();SM->Add(*SM2);cout << "矩阵相加后为: ";SM->print();cout << "***********************************************" << endl;cin.get();system("pause");/*使用散列表设计实现一个字典,假设关键字为整数且D为961,在字典中插入随机产生的500个不同的整数,实现字典的建立和搜索操作。
数据结构实验一:线性表实验报告#include <string.h>#include <ctype.h>#include <malloc.h> // malloc()等#include <limits.h> // INT_MAX等#include <stdio.h> // EOF(=^Z或F6),NULL#include <stdlib.h> // atoi()#include <io.h> // eof()#include <math.h> // floor(),ceil(),abs()#include <process.h> // exi t()#include <iostream.h> // cout,cin// 函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSEtypedef int ElemType;#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量#define LISTINCREMENT 2 // 线性表存储空间的分配增量struct SqListElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)};/**********************************************************/ /* 顺序表示的线性表的基本操作(12个) *//**********************************************************/ Status InitList(SqList &L){ // 操作结果:构造一个空的顺序线性表---------------1L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)exit(OVERFLOW); // 存储分配失败L.length=0; // 空表长度为0L.listsize=LIST_INIT_SIZE; // 初始存储容量return OK;}Status DestroyList(SqList &L){ // 初始条件:顺序线性表L已存在。
《数据结构》实验指导书(本实验指导书尚未定稿,因此会经常改进,建议大家每次上机前重新下载,由于尚未定稿,可能存在错误,发现后请标注颜色发给lbd@,非常感谢。
如果有其他问题可以通过qq:723812464联系我。
)一、实验要求1、独立完成实验,不可抄袭其他同学程序,包括往届同学的程序,实验平台具有查重功能,如果涉嫌抄袭,将被要求完成对应的补充实验才能够得到全部得分。
2、因采用程序进行测试,因此对输出格式要求严格,格式不对也会被判结果错误。
输出数据时,每个数之间用“,”隔开,特别注意,任何地方不要有多余的空格、冒号等,参考样例在需要的地方换行。
3、输入数据前,要显示“input”字样,输出前要有“Output”字样,输出结束有“End”字样。
详细格式要求参考每个实验的格式样例。
4、程序输入输出数据采用标准输入输出方式“cin>>、cout<<”,程序中不要使用getch()、getchar()、cin.get()、putchar()函数,否则会造成运行错误或者结果错误。
5、特别注意:getch()、getchar()、cin.get()也不要出现在注释中,否则造成“输入错误”二、开发工具Microsoft Visual C++ 6.0三、实验周数8周*2小时四、评分标准在要求完成时间(实验内容中有准确的要求完成时间)之前完成并提交到实验平台,测试通过,该实验计10分或者15分,在规定时间之后完成,计应得分数的80%。
如果查重涉嫌作弊,在上面得分基础上仅仅得60%的得分,可以通过完成补充实验提高实验得分。
五、指导书下载地址Ftp服务器地址:211.87.224.23,用户/密码:db/dbsystem六、作业提交步骤及办法1、每次上机,登入系统提交试验作业。
登入网址:http://211.87.224.23:8080/testplat/账号密码:学号/123登入成功后如果不能够看到实验平台画面,可以输入下面网址:http://211.87.224.23:8080/testplat/index.jsp,就可以进入实验平台了。
2、源程序(即源代码)文件名采用test01_ID.cpp(如果是多个cpp文件,合并到一个cpp文件后上传),test01代表实验一(下面相同),ID代表本人学号(下面相同),例如学号为201000300001的学生的第一个实验源程序文件名为test01_201000300001.cpp。
程序编译后会在源程序所在文件夹下的debug文件夹下创建一个可执行程序(即目标代码)test01_ID.exe文件。
3、无论采用哪一种开发工具,编译后产生的目标代码必须确保能够不依赖系统环境能够独立运行,既不能依赖其他任何DLL程序。
目前实验室的VC环境能够正确编译成可执行程序。
4、作业自测通过后,在实验平台上,将test01_ID.cpp文件上传到相应实验源代码,将test01_ID.exe文件上传到相应实验的目标代码,然后提交实验,等待10秒后,执行【刷新】,查看实验状态:1)上传源代码:已经正确上传完源代码。
2)上传目标代码:已经正确上传目标代码。
3)提交试验:已经提交实验,等待后台测试目标代码。
如果保持该状态超过1分钟,说明后台出现错误,请通知实验指导教师。
4)按时完成:程序在要求时间内完成实验。
如果错误描述显示“涉嫌作弊,请完成对应的补充实验”,则得分为总分值的10%。
可以通过完成对应的补充实验,获得剩余的90%分值。
5)超时完成:程序在要求时间后完成实验。
如果错误描述显示“涉嫌作弊,请完成对应的补充实验”,则得分为总分值的6%。
可以通过完成对应的补充实验,获得剩余的54%分值。
6)运行错误:上传的目标代码可能不能正确运行,再一次提交实验进行尝试,如果仍然没有解决问题,进一步测试你的程序能够正确运行,是否按要求的格式输入数据。
7)结果错误:程序运行后输出的结果和答案不一致,也就是你的程序存在逻辑错误,需要你进一步修改调试。
8)正在查重:后台已经开始查重。
如果保持该状态超过1分钟,说明后台出现错误,请通知实验指导教师。
9)正在测试:后台已经开始测试目标代码。
如果保持该状态超过1分钟,说明后台出现错误,请通知实验指导教师。
11)文件名错误:源程序文件名采用test01_ID.cpp,目标文件名称采用test01_ID.exe。
12)文件太小:源程序有效代码太少,低于20行。
如果你的程序确实低于20行代码,请联系指导教师。
特别注意:错误描述是系统自动给出的错误判断,因此不一定准确指明错误的原因,可以通过多次刷新,查看是否有更加准确的错误描述。
5、如果没有通过,根据提示继续调试你的程序直到通过。
实验一递归练习一、要求完成时间实验开始后的第二周之前完成二、实验目的1、熟悉开发工具的使用。
2、掌握递归的实现思想。
三、实验内容1、输入2-10个大于0的正整数,如果输入0作为结束。
2、输出这几个整数的全排列,每个数之间用半角“,”隔开,中间不要有空格,每个排列单独一行。
3、程序一定要有Input、Output、End提示信息,但是不要有格式没有出现的其他提示,以下各实验相同。
4、程序最后增加system(pause),显示Press any key to continue并暂停。
四、输入输出请严格按下面要求的格式实现实验二排序算法一、要求完成时间实验开始后的第三周之前完成二、实验目的掌握各种排序方法的实现思想。
三、实验内容1、输入2-10个不为零的正整数,遇到0代表输入结束,0不参与排序。
2、数字选择排序方法,1-冒泡排序、2-插入排序、3-基数排序3、基数排序能够实现小于10的正整数的排序。
4、使用所选排序方法的排序,结果输出所用方法以及结果,每个数之间用“,”隔开,中间不要有空格。
5、输入输出请严格按下面要求的格式实现实验三线性表操作一、要求完成时间实验开始后的第四周之前完成二、实验目的1、掌握线性表的基本操作:插入、删除、查找。
2、掌握链表遍历器的使用方法。
三、实验内容1、创建线性表类。
线性表的存储结构使用链表。
2、完成表首插入元素、删除指定元素、搜索表中是否有指定元素、输出链表。
3、输入n个不为零的整数作为节点元素值,遇到0代表输入结束(不创建元素值为0的节点),创建链表。
输出整个链表。
4、输入一个整数,将该数作为一个元素值插入表首位置。
输出整个链表。
5、输入一个整数,在链表中进行搜索,输出其在链表中的位置。
如果不存在输出0。
6、再一次输入一个整数,在链表中进行搜索,输出其在链表中的位置。
如果不存在输出0。
7、再一次输入n个不为零的整数作为节点元素值,遇到0代表输入结束(不创建元素值为0的节点),创建并输出整个链表。
8、实现上面两个链表的合并,第一个链表在前第二个在后,输出合并后的链表。
9、使用链表遍历器输出合并后的链表的反序输出。
四、输入输出请严格按下面要求的格式实现实验四堆栈的应用一、要求完成时间实验开始后的第五周之前完成二、实验目的掌握堆栈的使用。
三、实验内容1、输入一个数学表达式(假定表达式输入格式合法),计算表达式结果并输出。
2、数学表达式由单个数字和运算符“+”、“-”、“*”、“/”、“(、) ”构成,例如 2 + 3 * ( 4 + 5 ) - 6 / 4。
3、变量、输出采用整数,只舍不入。
四、输入输出请严格按下面要求的格式实现(结果可能不对)实验五二叉树操作一、要求完成时间实验开始后的第六周之前完成二、实验目的掌握二叉树的基本概念,二叉树的存储结构使用链表。
三、实验内容1、输入一个完全二叉树的层次遍历字符串,创建这个二叉树,输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个结果独立一行显示)。
2、输入二叉树前序序列和中序序列(各元素各不相同),创建这个二叉树,输出该二叉树的后序序列、层次遍历。
四、输入输出请严格按下面要求的格式实现实验六堆和搜索树一、要求完成时间实验开始后的第七周之前完成二、实验目的掌握堆和搜索树的基本概念,插入、删除方法。
三、实验内容1、输入一系列不为零的正整数(最多不超过20个),遇到0代表输入结束(不包含0)。
2、根据上面输入的数据序列,用初始化方法创建最大堆(不要用节点依次插入的办法创建最大堆),然后输出最大堆的层次序列。
3、输出用堆排序后的排序结果。
4、根据上面输入的数据,创建二叉搜索树,输出二叉搜索树的前序序列、中序序列(分行输出)。
5、根据上面输入的数据作为字母出现的频率(第1个数代表A频率,第2个数代表B频率,……),创建Huffman树,输出Huffman编码,要求左子树权值小于右子树权值,左边为0,右边为1。
按字母由A到Z的顺序输出,格式采用“大写字母:编码”,例如A:0,B:10……Z:1100四、输入输出请严格按下面要求的格式实现(结果可能不对)实验七图的操作一、要求完成时间实验开始后的第八周之前完成二、实验目的掌握图的基本概念,描述方法;遍历方法。
三、实验内容1、创建图类,存储结构使用邻接矩阵。
2、输入图的节点数n(不超过10个)、边数m,节点分别用1-n代表。
3、采用“起始节点,终止节点,权值”输入图的m条边,创建图。
4、输出从节点1开始的BFS遍历,要求小的节点在前大的在后。
5、输出从节点1开始的DFS遍历,要求小的节点在前大的在后。
6、输出从第1节点到第n节点最短路径的长度,如果没有路经,输出0。
7、输出最小生成树的所有边。
输出格式采用“起始节点-终止节点:权值”,小的节点在前,大的节点在后,每个边独立一行输出,例如1-2:12是正确的,2-1:12是错误的。
如果没有最小生成树,输出0-0:0四、输入输出请严格按下面要求的格式实现(结果可能不对)查重涉嫌作弊,要求完成如下对应的实验补充实验一递归练习一、要求完成时间实验开始后的第二周之前完成二、实验目的1、熟悉开发工具的使用。
2、掌握递归的实现思想。
三、实验内容1、输入2-10个大于0的正整数,如果输入0作为结束。
2、输出这几个整数的形成集合的所有子集,每个子集用{}括起来,每个数之间用半角“,”隔开,中间不要有空格,每个子集单独一行。
四、输入输出请参考下面要求的格式实现补充实验二排序算法一、要求完成时间实验开始后的第三周之前完成二、实验目的掌握基数排序方法的实现思想。
三、实验内容1、输入2-10个不为零的正数(非正整数),遇到0代表输入结束,0不参与排序。
2、数字选择排序方法,1-冒泡排序、2-插入排序、3-归并排序3、使用所选排序方法的排序,结果输出所用方法以及结果,每个数之间用“,”隔开,中间不要有空格,如果输出是整数,则小数点后面不要输出0。