数据结构上机实验8
数据结构实验报告八-快速排序
![数据结构实验报告八-快速排序](https://img.taocdn.com/s3/m/062bdd2524c52cc58bd63186bceb19e8b8f6ecf2.png)
实验8 快速排序1.需求分析(1)输入的形式和输入值的范围:第一行是一个整数n,代表任务的件数。
接下来一行,有n个正整数,代表每件任务所用的时间。
中间用空格或者回车隔开。
不对非法输入做处理,及假设用户输入都是合法的。
(2)输出的形式:输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。
按此顺序进行,则使得所有任务等待时间最小。
(3)程序所能达到的功能:在操作系统中,当有n 件任务同时来临时,每件任务需要用时ni,输出所有任务等待的时间和最小的任务处理顺序。
(4)测试数据:输入请输入任务个数:9请输入任务用时:5 3 4 2 6 1 5 7 3输出任务执行的顺序:1 2 3 3 4 5 5 6 72.概要设计(1)抽象数据类型的定义:为实现上述程序的功能,应以整数存储用户的第一个输入。
并将随后输入的一组数据储存在整数数组中。
(2)算法的基本思想:如果将任务按完成时间从小到大排序,则在完成前一项任务时后面任务等待的时间总和最小,即得到最小的任务处理顺序。
采取对输入的任务时间进行快速排序的方法可以在相对较小的时间复杂度下得到从小到大的顺序序列。
3.详细设计(1)实现概要设计中定义的所有数据类型:第一次输入的正整数要求大于零,为了能够存储,采用int型定义变量。
接下来输入的一组整数,数据范围大于零,为了排序需要,采用线性结构存储,即int类型的数组。
(2)实现程序的具体步骤:一.程序主要采取快速排序的方法处理无序数列:1.在序列中根据随机数确定轴值,根据轴值将序列划分为比轴值小和比轴值大的两个子序列。
2.对每个子序列采取从左右两边向中间搜索的方式,不断将值与轴值比较,如果左边的值大于轴值而右边的小于轴值则将二者交换,直到左右交叉。
3.分别对处理完毕的两个子序列递归地采取1,2步的操作,直到子序列中只有一个元素。
二.程序各模块的伪代码:1、主函数int main(){int n;cout<<"请输入任务个数:";cin>>n;int a[n];cout<<"请输入任务用时:";for(int i=0;i<n;i++) cin>>a[i];qsort(a,0,n-1); //调用“快排函数”cout<<"任务执行的顺序:";for(int i=0;i<n;i++) cout<<a[i]<<" "; //输出排序结果}2、快速排序算法:void qsort(int a[],int i,int j){if(j<=i)return; //只有一个元素int pivotindex=findpivot(a,i,j); //调用“轴值寻找函数”确定轴值swap(a,pivotindex,j); //调用“交换函数”将轴值置末int k=partition(a,i-1,j,a[j]); //调用“分割函数”根据轴值分割序列swap(a,k,j);qsort(a,i,k-1); //递归调用,实现子序列的调序qsort(a,k+1,j);}3、轴值寻找算法://为了保证轴值的“随机性”,采用时间初始化种子。
qdr数据结构上机实验报告8-
![qdr数据结构上机实验报告8-](https://img.taocdn.com/s3/m/096024f9f78a6529657d5388.png)
数据结构上机实验报告8—AAXXX课程名称:数据结构年级:09实验日期:姓名:学号:04班级:实验名称:图实验序号:实验八成员人数:1一、实验目的及要求1.了解C语言程序的特点2.掌握简单的C语言程序结构3.熟练掌握运行C程序的步骤和方法4. 掌握图的存储表示方法、图的遍历二、实验环境三、实验内容1)使用邻接表表示图,并对图进行深度优先遍历和广度优先遍历。
四、算法描述及实验步骤用算法表示方法,流程图等形式表达算法设计思想与算法实现步骤五、调试过程及实验结果六、总结熟悉图结构,了解图的存储和遍历七、附录(源程序清单)#include<stdlib.h>#include<stdio.h>int visited[10];typedef struct ArcNode{int adjvex;struct ArcNode *next;}Edge;typedef struct VNode{char vertex;Edge *first;}Vertex;typedef Vertex AdjList[10];typedef struct{AdjList adj;int n,e;}Algraph;void creatALG(Algraph *g){int i,j,k;Edge *s=NULL;printf("please input vertex:");scanf("%d",&(g->n));printf("please input edges:");scanf("%d",&(g->e));getchar();for(i=0;i<g->n;i++){g->adj[i].vertex=i+48;g->adj[i].first=NULL;}for(k=0;k<g->e;k++){printf("please the %d edge:",k+1); scanf("%d %d",&i,&j);getchar();s=(Edge *)malloc(sizeof(Edge));s->adjvex=j;s->next=g->adj[i].first;g->adj[i].first=s;}}void DFSG(Algraph *g,int i){Edge *p;printf("%c ",g->adj[i].vertex);visited[i]=1;p=g->adj[i].first;while(p){if(!visited[p->adjvex])DFSG(g,p->adjvex);p=p->next;}}void Depth_First(Algraph *g){int i;for(i=0;i<g->n;i++)visited[i]=0;for(i=0;i<g->n;i++)if(!visited[i])DFSG(g,i);}void Breadth_First(Algraph *g,int i){Edge *p;int q[10],f=0,r=0;int j,v;for(j=0;j<g->n;j++)visited[j]=0;visited[i]=1;printf("%c ",g->adj[i].vertex);q[r++]=i;while(r!=f){v=q[f++];p=g->adj[v].first;while(p){if(!visited[p->adjvex]){visited[p->adjvex]=1;printf("%c ",g->adj[p->adjvex].vertex);q[r++]=p->adjvex;}p=p->next;}}}void main(){Algraph G;creatALG(&G);printf("\nDepth_First Search:");Depth_First(&G);printf("\nBreadth_First Search:");Breadth_First(&G,0);}。
数据结构实验8 查找与排序
![数据结构实验8 查找与排序](https://img.taocdn.com/s3/m/f66a54523169a4517723a3aa.png)
注意事项:在磁盘上创建一个目录,专门用于存储数据结构实验的程序。
因为机房机器有还原卡,请同学们将文件夹建立在最后一个盘中,以学号为文件夹名。
实验八查找和排序一、实验目的掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。
二、实验要求1.掌握本实验的算法。
2.上机将本算法实现。
三、实验内容为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作方式,其流程如下:建立数据文件,数据结构采用线性表,存储方式任选(建议用顺序存储结构),数据元素是结构类型(学号,姓名,性别,房号),元素的值可从键盘上输入,可以在程序中直接初始化。
数据文件按关键字(学号、姓名、房号)进行排序(排序方法任选一种),打印排序结果。
(注意字符串的比较应该用strcmp(str1,str2)函数)查询菜单: (查找方法任选一种)1. 按学号查询2. 按姓名查询3. 按房号查询打印任一查询结果(可以连续操作)。
参考:typedef struct {char sno[10];char sname[2];int sex; //以0表示女,1表示男int roomno;}ElemType;struct SqList{ElemType *elem;int length;};void init(SqList &L){L.elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));L.length=0;}void printlist(SqList L){ int i;cout<<" sno name sex roomno\n";for(i=0;i<L.length;i++)cout<<setw(7)<<L.elem[i].sno<<setw(10)<<L.elem[i].sname<<setw(3)<<L.elem[i].sex<<setw(6) <<L.elem[i].roomno<<endl;}。
数据结构上机操作实验报告
![数据结构上机操作实验报告](https://img.taocdn.com/s3/m/e73db6838762caaedd33d4be.png)
实验一单链表的基本操作(必做)一、实验目的1.掌握单链表的存储、初始化、插入、删除等操作的程序实现。
2.加深对单链表基本概念,基本理论及相应算法的掌握与理解。
3.了解链表的处理方式,学习体会简单的单链表程序实现相关知识。
二、实验内容1.建立一个链表、设计链表的基本操作实现算法、输出一个链表表,调试并输出结果。
2.编写一个程序实现如下功能:让计算机产生出50个0~9之间的随机数并依次保存到单链表中;输出遍历单链表;从单链表中删除与给定值相等的所有结点;输出遍历单链表;输出单链表长度,调试并输出结果。
三、实验步骤1.定义一个链表结构体。
2.利用插入功能插入一个结点。
3.利用删除功能删除一个结点。
四、程序运行测试1.利用插入功能插入一个结点。
2.利用删除功能删除一个结点。
五、实验报告要求1.绘制链表操作实现的流程图。
2.详细给出程序运行测试结果(包括测试数据和测试结果)。
3.选试验步骤2-3中的任意一个,给出程序的详细注释。
4.参考程序中某一部分功能的改进(选做)5.实验心得与体会6.附录,实验用源程序六、参考源代码#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的单链表均为带头结点。
void CreatLinkList(LinkList &L,int j){//建立一个单链表L,数据为整数,数据由键盘随机输入。
LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"在单链表内输入整数:"<<endl;for(int i=0;i<j;i++) p=(LinkList)malloc(sizeof(Lnode)); cin>>p->data;p->next=q->next;q->next=p;q=p; }int PrintLinkList(LinkList &L){//输出单链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"单链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算单链表L的数据元素个数。
数据结构《数据结构》上机实验
![数据结构《数据结构》上机实验](https://img.taocdn.com/s3/m/c1c814442e3f5727a4e96203.png)
上机实验
主讲教师:袁凌
数据结构
实验目的
1.加深对数据结构和算法的理解,进一步 提高学生编程能力; 2.培养和提高学生分析问题与解决问题的 综合能力; 3.整理资料,撰写规范的实验报告。
华中科技大学计算机学院
2
数据结构
实验要求
1. 独立完成,完全雷同者记0分;
2. 撰写实验报告,每个实验报告如下内容: 一、问题描述 二、算法和数据结构设计 三、C语言程序实现 四、程序测试 五、复杂度分析
华中科技大学计算机学院 8
实验题目
第二次上机试验
实验(三) 基于二叉链表,实现二叉树的下列运算。 ① 二叉树生成; ② 前序、中序和后序遍历; ③ 计算叶子数目; ④ 按层次遍历; ⑤ 求二叉树高度; 提示: ⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定 ⑶ ②、③和⑤运算分别采用递归和非递归算法实现
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
6
数据结构
实验题目
第一次上机试验
实验(二) 基于链式存储结构,实现线性表的基本的、常见 的运算。
提示:
⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定
⑶ 线性表数据可以使用磁盘文件永久保存
华中科技大学计算机学院
7Байду номын сангаас
数据结构
3. 《实验报告》和《源程序》,以班为单位提交光盘。
华中科技大学计算机学院
3
数据结构
报告格式
华中科技大学计算机学院
4
数据结构
报告格式
华中科技大学计算机学院
5
数据结构
实验题目
数据结构上机实验答案
![数据结构上机实验答案](https://img.taocdn.com/s3/m/07a68e53f111f18583d05a86.png)
《数据结构实验指导书》答案实验一:1、请编写函数int fun(int *a, int *b),函数的功能是判断两个指针a和b所指存储单元的值的符号是否相同;若相同函数返回1,否则返回0。
这两个存储单元中的值都不为0。
在主函数中输入2个整数、调用函数fun、输出结果。
#include <stdio.h>int fun(int *a, int *b){if (*a*(*b)>0) return(1);else return(0);}main(){int x,y;scanf("%d%d",&x,&y);if (fun(&x,&y)) printf("yes\n");else printf("no");}2、计算1+2+3+……+100,要求用指针进行设计。
即设计函数int fun(int *n)实现求1+2+3+……+*n,在主函数中输入、调用、输出结果。
#include <stdio.h>int fun(int *n){int i,sum=0;for (i=1;i<=*n;i++)sum+=i;return(sum);}main(){int x,sum;scanf("%d",&x);printf("the sum is %d\n",fun(&x));}3、函数的功能是求数组a中最大数的位置(位序号)。
在主函数中输入10个整数、调用函数fun、输出结果。
#define N 10#include <stdio.h>void input(int *a,int n){int i;for (i=0;i<n;i++)scanf("%d",a+i); /*scanf("%d",&a[i]);*/}int fun(int *a,int n){int i,*max;max=a;for (i=1;i<n;i++)if (a[i]>*max) max=a+i;return(max-a);}main(){int a[N],maxi;input(a,N);maxi=fun(a,N);printf("\n the max position is %d\n",maxi);}4、请编写函数fun(int *a,int n, int *odd, int *even),函数的功能是分别求出数组a中所有奇数之和和所有偶数之和。
华南农业大学数据结构上机实验指导书及标准答案
![华南农业大学数据结构上机实验指导书及标准答案](https://img.taocdn.com/s3/m/d4dc832fb9d528ea80c77947.png)
目录实验一线性表ﻩ错误!未定义书签。
(一)实验目的............................................................................................................... 错误!未定义书签。
(二) 实验内容ﻩ错误!未定义书签。
(三)实验报告ﻩ错误!未定义书签。
实验二堆栈ﻩ错误!未定义书签。
(一)实验目的 .............................................................................................................. 错误!未定义书签。
(二)实验内容 .............................................................................................................. 错误!未定义书签。
(三) 实验报告................................................................................................................. 错误!未定义书签。
实验三队列..................................................................................................................... 错误!未定义书签。
(一) 实验目的ﻩ错误!未定义书签。
(二) 实验内容................................................................................................................. 错误!未定义书签。
数据结构上机实验
![数据结构上机实验](https://img.taocdn.com/s3/m/82cc242c590216fc700abb68a98271fe910eaf35.png)
数据结构上机实验本课程实验中已知的预定义常量和类型如下:#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;实验一顺序表(一)一、 实验目的掌握顺序表的定义、存储结构及其基本操作。
二、 实验内容已知:线性表的动态分配顺序存储结构为#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct{int *elem;int length;int listsize;}SqList;在主程序中调用如下函数实现构造线性表,在线性表中插入数值,最后输出线性表。
1. 编写函数,Status InitList(SqList *L) 实现构造一个空的线性表,若构造成功则返回OK,否则返回ERROR。
2. 编写函数,Status ListInsert(SqList *L , int i , int e) 实现在线性表L中第i个位置之前插入新的数据元素e,L的长度加1。
若插入成功返回OK,否则返回ERROR。
(提示:i的合法值为:i>=1&&i<=L—>length+1)3. 编写函数,void ListPrint(SqList *L)实现将线性表中的元素依次输出到屏幕上。
4.编写函数,int Menu(),输出菜单项请选择你要进行的操作(请输入1-4中的任一个数字):输入1:InitList2:ListInsert3:ListPrint4:Exit实验二顺序表(二)一、 实验目的掌握顺序表的定义、存储结构及其基本操作。
二、 实验内容在实验一的基础上,继续完成如下实验内容。
1.编写函数,Status ListDelete(Splist *L ,int i ,int *e),实现删除L的第i个数据元素,并用e返回其值,L的长度减1。
数据结构上机实验报告
![数据结构上机实验报告](https://img.taocdn.com/s3/m/079e509403d8ce2f006623a8.png)
数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 4 -一、实验目的.................................................................................................... - 4 -二、实验代码.................................................................................................... - 4 -三、实验结果.................................................................................................. - 14 -四、个人思路.................................................................................................. - 15 - 实验二栈和队列 .................................................................................................. - 15 -一、实验目的.................................................................................................. - 15 -二、实验代码.................................................................................................. - 16 -三、实验结果.................................................................................................. - 24 -四、个人思路.................................................................................................. - 25 - 实验三数组 .......................................................................................................... - 26 -一、实验目的.................................................................................................. - 26 -二、实验代码.................................................................................................. - 26 -三、实验结果.................................................................................................. - 28 -四、个人思路.................................................................................................. - 28 - 实验四树 .............................................................................................................. - 29 -一、实验目的.................................................................................................. - 29 -二、实验代码.................................................................................................. - 29 -三、实验结果.................................................................................................. - 39 -四、个人思路.................................................................................................. - 39 -实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验代码1.设有一个线性表E={e1, e2, … , e n-1, e n},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ e n, e n-1 , … , e2 , e1 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。
实验8 队列(循环队列)的表示和实现
![实验8 队列(循环队列)的表示和实现](https://img.taocdn.com/s3/m/16caf13cee06eff9aef80712.png)
浙江大学城市学院实验报告课程名称数据结构基础实验项目名称实验八队列(循环队列)的表示和实现实验成绩指导老师(签名)日期一.实验目的和要求1、掌握队列的存储结构及基本操作。
2、掌握循环队列的设置及循环队列的各种基本操作的实现。
3、通过具体的应用实例,进一步熟悉和掌握队列的实际应用。
二.实验内容1、建立头文件test8.h,定义顺序存储的循环队列存储结构,并编写循环队列的各种基本操作实现函数。
同时建立一个验证操作实现的主函数文件test8.cpp,编译并调试程序,直到正确运行。
说明:队列的基本操作可包括:①void InitQueue (Queue &Q); //构造一个空队列Q②int EmptyQueue (Queue Q);//判断队列Q是否为空,若空返回1,否则返回0③void EnQueue (Queue &Q, ElemType item); //元素item 进队列Q④ElemType OutQueue (Queue &Q); //队头元素出队列Q,并返回其值⑤ElemType PeekQueue (Queue Q); //返回队头元素值⑥void ClearQueue (Queue &Q); //清空队列2、应用(选做部分):编写程序,实现舞伴问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队,跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴,若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求设计一个函数void partner(),模拟上述舞伴配对问题。
基本要求:1)由键盘输入数据,每对数据包括姓名和性别;2)输出结果包括配成舞伴的女士和男士的姓名,以及未配对者的队伍名称和队头者的姓名;3)要求利用test8.h中已实现的顺序循环队列的基本操作函数来实现。
函数void partner()添加到文件test8.cpp中,在主函数中进行调用测试。
数据结构上机实验报告
![数据结构上机实验报告](https://img.taocdn.com/s3/m/1655104303020740be1e650e52ea551810a6c9e8.png)
数据结构上机实验报告数据结构上机实验报告1. 实验目的数据结构是计算机科学中非常重要的一门课程,通过本次上机实验,旨在帮助学生巩固和应用所学的数据结构知识,培养学生分析和解决实际问题的能力。
2. 实验背景本次实验涉及到两个常用的数据结构:栈和队列。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,而队列是一种先进先出(First In First Out,FIFO)的数据结构。
通过实验,我们将学习如何使用这两种数据结构来解决实际问题。
3. 实验内容本次实验分为两个部分:栈的应用和队列的应用。
3.1 栈的应用在栈的应用部分,我们将实现一个简单的括号匹配算法。
该算法可以判断一个字符串中的括号是否匹配。
具体实现步骤如下:3.1.1 创建一个栈来存储括号字符;3.1.2 遍历字符串中的每个字符;3.1.3 如果遇到左括号,则将其入栈;3.1.4 如果遇到右括号,则判断栈顶元素是否是对应的左括号;3.1.5 如果栈为空或栈顶元素不是对应的左括号,则括号不匹配;3.1.6 如果栈顶元素是对应的左括号,则将其出栈;3.1.7 遍历完字符串后,如果栈为空,则括号匹配,否则括号不匹配。
通过实现这个算法,我们可以学习到如何使用栈来解决实际问题,并且理解栈的后进先出的特性。
3.2 队列的应用在队列的应用部分,我们将实现一个简单的任务调度算法。
该算法可以模拟多个任务按照一定的优先级进行调度的过程。
具体实现步骤如下:3.2.1 创建一个队列来存储任务;3.2.2 每个任务包含两个属性:任务名称和优先级;3.2.3 向队列中添加任务,并按照优先级进行排序;3.2.4 从队列中取出优先级最高的任务,并执行;3.2.5 执行完任务后,继续从队列中取出下一个优先级最高的任务,并执行,直到队列为空。
通过实现这个算法,我们可以学习到如何使用队列来实现任务调度,并且理解队列的先进先出的特性。
4. 实验结果与分析通过实验,我们成功实现了括号匹配算法和任务调度算法,并得到了正确的结果。
数据结构上机实验任务书一和二
![数据结构上机实验任务书一和二](https://img.taocdn.com/s3/m/9f6bec4b9e314332396893dd.png)
目录实验1 顺序表的应用 (2)实验2 链表的应用 (5)实验3 栈的应用 (6)实验4 队列的应用 (7)实验5 树的应用 (9)实验6 图的应用 (10)实验7 图的应用 (11)实验8 查找与排序 (12)0 实验要求一、实验步骤⒈问题分析充分地分析和理解问题本身,弄清要求做什么,包括功能要求、性能要求、设计要求和约束以及基本数据特性,数据间的联系等。
⒉数据结构设计针对要求解决的问题,考虑各种可能的数据结构,并且力求从中找出最佳方案(必须连同算法一起考虑),确定主要的数据结构及全局变量。
对引入的每种数据结构和全局变量要详细说明其功能、初值和操作特点。
⒊算法设计算法设计分概要设计和详细设计,概要设计着重解决程序的模块设计问题,这包括考虑如何把被开发的问题程序自顶向下分解成若干顺序模块,并决定模块的接口,即模块间的相互关系以及模块之间的信息交换问题.详细设计则要决定每个模块内部的具体算法,包括输入、处理和输出,采用类C语言描述。
⒋测试用例设计准备典型测试数据和测试方案,测试数据要有代表性、敏感性,测试方案包括模块测试和模块集成测试。
⒌上机调试对程序进行编译,纠正程序中可能出现的语法错误,测试前,先运行一遍程序看看究竟将会发生什么,如果错误较多,则根据事先设计的测试方案并结合现场情况进行错误跟踪,包括打印执行路径或输出中间变量值等手段。
二、实验报告每次实验结束后,均应撰写实验报告。
实验报告应包括如下内容:1、问题描述:简述题目要解决的问题是什么。
2、设计:概要设计采用抽象数据类型描述,详细设计包括存储结构的定义、主要操作算法设计等。
用类C语言或用框图描述。
3、调试报告:调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。
4、运行结果。
可以贴相应的运行结果截图。
5、算法分析与改进:算法的时间复杂度和空间复杂度分析;算法改进的设想。
6、经验和体会所有实验做完后,上交上机实验源程序和相应的运行结果截图。
数据结构上机实验报告
![数据结构上机实验报告](https://img.taocdn.com/s3/m/ae7bd256f68a6529647d27284b73f242336c318f.png)
实验名称:数据结构实验实验时间:2021年X月X日实验地点:计算机实验室实验目的:1. 理解并掌握基本数据结构(线性表、栈、队列、链表、树、图)的概念和操作。
2. 能够运用C语言实现基本数据结构的各种操作。
3. 培养编程能力和问题解决能力。
实验内容:1. 线性表2. 栈3. 队列4. 链表5. 树6. 图实验环境:1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 2019实验步骤:一、线性表1. 实现线性表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个线性表,包含10个元素。
- 在第3个位置插入一个新元素。
- 删除第5个位置的元素。
- 查找线性表中的第7个元素。
- 遍历线性表,并打印所有元素。
二、栈1. 实现栈的创建、入栈、出栈、判空和求栈顶元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个栈。
- 向栈中依次入栈元素1、2、3、4、5。
- 判断栈是否为空。
- 求栈顶元素。
- 出栈元素,并打印出栈的元素。
三、队列1. 实现队列的创建、入队、出队、判空和求队头元素等基本操作。
2. 编写代码,实现以下功能:- 创建一个队列。
- 向队列中依次入队元素1、2、3、4、5。
- 判断队列是否为空。
- 求队头元素。
- 出队元素,并打印出队的元素。
四、链表1. 实现单链表、双向链表和循环链表的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个单链表,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
- 查找链表中的第4个元素。
- 遍历链表,并打印所有元素。
五、树1. 实现二叉树的创建、插入、删除、查找和遍历等基本操作。
2. 编写代码,实现以下功能:- 创建一个二叉树,包含元素1、2、3、4、5。
- 在第2个位置插入一个新元素。
- 删除第3个位置的元素。
数据结构上机实验报告
![数据结构上机实验报告](https://img.taocdn.com/s3/m/8f02b289250c844769eae009581b6bd97f19bc93.png)
数据结构上机实验报告一、实验目的本次数据结构上机实验的主要目的是通过实际编程操作,深入理解和掌握常见的数据结构及其基本操作,提高解决实际问题的能力和编程技能。
具体目标包括:1、熟练掌握线性表、栈、队列、树、图等数据结构的基本概念和存储方式。
2、学会运用数据结构的相关算法进行数据的插入、删除、查找、排序等操作。
3、培养分析问题、设计算法、编写代码和调试程序的综合能力。
4、增强对数据结构在实际应用中的认识,提高解决复杂问题的思维能力。
二、实验环境1、操作系统:Windows 102、编程环境:Visual Studio 20193、编程语言:C++三、实验内容本次实验共包括以下几个部分:1、线性表的操作实现顺序表和链表的创建、插入、删除、查找和遍历操作。
比较顺序表和链表在不同操作下的性能差异。
2、栈和队列的应用利用栈实现表达式求值。
用队列模拟银行排队系统。
3、树的遍历实现二叉树的先序、中序和后序遍历算法,并输出遍历结果。
构建哈夫曼树,并进行编码和解码操作。
4、图的基本操作用邻接矩阵和邻接表存储图,并实现图的深度优先搜索和广度优先搜索算法。
四、实验步骤及结果1、线性表的操作顺序表的实现:```cppinclude <iostream>using namespace std;define MAXSIZE 100 //顺序表的最大长度class SeqList {private:int dataMAXSIZE; //存储顺序表元素的数组int length; //顺序表的当前长度public:SeqList(){//构造函数,初始化顺序表length = 0;}//插入元素bool insert(int pos, int element) {if (pos < 0 || pos > length || length == MAXSIZE) {return false;}for (int i = length; i > pos; i) {datai = datai 1;}datapos = element;length++;return true;}//删除元素bool remove(int pos) {if (pos < 0 || pos >= length) {return false;}for (int i = pos; i < length 1; i++){datai = datai + 1;}length;return true;}//查找元素int search(int element) {for (int i = 0; i < length; i++){if (datai == element) {return i;}}return -1;}//遍历输出顺序表void traverse(){for (int i = 0; i < length; i++){cout << datai <<"";}cout << endl;}};int main(){SeqList list;listinsert(0, 10);listinsert(1, 20);listinsert(2, 30);listtraverse();listremove(1);listtraverse();int position = listsearch(30);if (position!=-1) {cout <<"元素 30 在位置"<< position << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```链表的实现:```cppinclude <iostream>using namespace std;class Node {public:int data;Node next;Node(int element) {data = element;next = NULL;}};class LinkedList {private:Node head;public:LinkedList(){head = NULL;}//插入元素void insert(int element) {Node newNode = new Node(element);if (head == NULL) {head = newNode;} else {Node current = head;while (current>next!= NULL) {current = current>next;}current>next = newNode;}}//删除元素void remove(int element) {if (head == NULL) {return;}if (head>data == element) {Node temp = head;head = head>next;delete temp;return;}Node current = head;Node prev = NULL;while (current!= NULL && current>data!= element) {prev = current;current = current>next;}if (current!= NULL) {prev>next = current>next;delete current;}}//查找元素bool search(int element) {Node current = head;while (current!= NULL) {if (current>data == element) {return true;}current = current>next;}return false;}//遍历输出链表void traverse(){Node current = head;while (current!= NULL) {cout << current>data <<"";current = current>next;}cout << endl;}};int main(){LinkedList list;listinsert(10);listinsert(20);listinsert(30);listtraverse();listremove(20);listtraverse();if (listsearch(30)){cout <<"找到元素 30" << endl;} else {cout <<"未找到元素 30" << endl;}return 0;}```性能比较:在插入和删除操作中,顺序表在表头或中间位置操作时需要移动大量元素,时间复杂度较高;而链表只需要修改指针,时间复杂度较低。
数据结构上机实验报告
![数据结构上机实验报告](https://img.taocdn.com/s3/m/6e36b9264b73f242336c5f5c.png)
{ while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) { i++; j++;} else{ i = i - j + 1; j = 0; }//失配时从下一位继续找 } if (j == P.size()){//找到就输出这一行 cout << "第" << linenumb << "行" << S << endl; }
}
3. 主程序的伪码 :
void main(){ cout << "请输入文件名" << endl; cin >> filename;
ifstream infile(filename.c_str()); cout << "请输入待查找的字符串" << endl; cin >> P; while (getline(infile, S))//读完所有行结束 {
linenumb++; Find(S, P, linenumb); } infile.close(); } int Find(string S, string P, int linenumb) { int i = 0, j = 0; while (i<S.size() && j<P.size())//当找到或者找到头时循环结束 { if (S[i] == P[j]) {
数据结构上机实验报告
![数据结构上机实验报告](https://img.taocdn.com/s3/m/d57c72e3d05abe23482fb4daa58da0116d171f66.png)
数据结构上机实验报告1. 实验目的本次实验旨在通过编写程序,掌握和理解常见的数据结构及其应用。
2. 实验环境与工具- 操作系统:Windows 10- 开发语言:C++- 集成开发环境(IDE):Visual Studio Code3. 实验内容及步骤3.1 线性表操作演示程序设计与分析步骤:a) 设计一个线性表类,并包含以下基本功能:i) 初始化线性表;ii) 插入元素到指定位置;iii) 删除指定位置的元素;iv) 获取指定位置处的元素值。
b)使用该线性表类进行一系列测试,验证各个功能是否正常运行。
记录并分析每个函数调用所消耗时间以评估算法效率。
3.2 栈和队列综合应用设计与模拟步骤:a)根据给出问题需求,在已有栈、队列等相关代码基础上完成如下任务:i)利用两个堆栈来模拟浏览器前进后退功能;ii)使用循环链式存储结构表示双向链队, 并对其进行初始化、入队、出队等操作。
b). 运行以上代码片段,并输出相应结果。
同时分析算法的时间复杂度和空间复杂度。
4. 实验结果与讨论a) 线性表操作演示程序设计与分析实验结果:- 初始化线性表所需时间为X秒;- 插入元素到指定位置平均耗时Y毫秒;- 删除指定位置的元素平均耗时Z毫秒。
b)栈和队列综合应用设计与模拟实验结果:i) 浏览器前进后退功能测试:共浏览N个网页,前进M 次、后退K次。
运行总体消耗时间T1;ii) 双向链队初始化、入队、出对等操作测试: 共进行P 组数据处理, 运行总体消耗时间T2.5. 结论通过本次上机实验,我们掌握了线性表及其相关基本操作,并且成功完成了栈和队列在特定场景下的应用。
同时,在代码编写过程中也深刻理解并评估了各种算法效率。
6. 致谢感谢老师们给予我宝贵意见以及同学们之间相互交流合作提供支持。
7. 附件8. 法律名词及注释在此处添加涉及到的法律名词或术语,并提供简要注释。
数据结构实验任务书(8个)
![数据结构实验任务书(8个)](https://img.taocdn.com/s3/m/d08792f2700abb68a982fb91.png)
目录实验1 线性表顺序存储的应用 (2)实验2 线性表链式存储的应用 (5)实验3 栈及其应用 (6)实验4 队列及其应用 (7)实验5 树及其应用 (8)实验6 图的遍历和连通性应用 (9)实验7 图的最短路径应用 (11)实验8 查找和排序应用 (12)实验1 线性表顺序存储的应用实验目的1.熟悉C语言的上机环境,掌握C语言的基本结构。
2.会定义线性表的顺序存储结构。
3.熟悉对顺序表的一些基本操作和具体的函数定义。
4.掌握在线性表的顺序存储结构上的一些其它操作。
实验要求1.独立完成;2.程序调试正确,有执行结果。
实验内容1、基础题:编写应用程序(填空),实现可以在顺序表中插入任意给定数据类型(定义为抽象数据类型)数据的功能。
要求在主函数中定义顺序表并对该顺序表插入若干个整数类型的数据(正整数),对它们求和并输出。
请使用动态内存分配的方式申请数组空间,并把主函数设计为一个文件SeqList.cpp,其余函数设计为另一个文件SeqList.h。
请填空完成以下给出的源代码并调试通过。
(1)文件SeqList.h:typedef struct List{ElemType *elem;int length;int listsize;}SeqList;void InitList(SeqList &L){ //初始化线性表…………}void ClearList(SeqList &L){ //清除线性表………………}int LengthList(SeqList L){ //求线性表长度………..}bool InsertList(SeqList &L, ElemType item, int pos){ //按给定条件pos向线性表插入一个元素…….}ElemType GetList(SeqList L, int pos){ //在线性表L中求序号为pos的元素,该元素作为函数值返回…………..}(2)文件SeqList.cpp:#include <stdio.h>#include <stdlib.h>typedef ElemType;#define MAXSize 10#include "SeqList.h"void main(void){SeqList myList;int i=1, x, sum=0, n;InitList ( );scanf(“%d”, &x);while ( x!= -1 ){if ( InsertList (myList, , i )==0) {printf("错误!\n");return ;}i++;scanf(“%d”, &x);}n = LengthList (myList);for (i=1; i<=n; i++){x=GetList(myList, i);sum = + x;}printf("%d\n ", sum);ClearList(myList);}2、提高部分:编写函数bool DeleteElem(SeqList &L, int min, int max)实现从顺序表中删除其值在给定值min和max之间(min < max)的所有元素,要求把该函数添加到文件SeqList.h中,并在主函数文件SeqList.cpp中添加相应语句进行测试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机实验(八)图班级:学号:姓名:上机时间:地点:一、实验目的1.掌握图的各种存储结构,包括邻接矩阵和邻接表等。
2.掌握图的基本运算,包括创建图、输出图、深度优先遍历、广度优先遍历算法等。
二、实验内容1.实现图的相关运算,并在此基础上设计一个主程序完成如下功能:(以P234图8.26所示的有向图G为例)(1)建立如图8.26所示的有向图G的邻接矩阵并输出;(2)由有向图G的邻接矩阵产生邻接表并输出;(3)再由(2)的邻接表产生对应的邻接矩阵并输出。
2.实现图的遍历运算,并在此基础上设计一个主程序完成如下功能:(以P234图8.26所示的有向图G为例)(1)输出如图8.26所示的有向图G从顶点0开始的深度优先遍历序列(递归算法);(2)输出如图8.26所示的有向图G从顶点0开始的深度优先遍历序列(非递归算法);(3)输出如图8.26所示的有向图G从顶点0开始的广度优先遍历序列。
三、实验过程1.了解常用函数所在的头文件stdlib.hstdlib 头文件里包含了C语言的一些函数该文件包含了的C语言标准库函数的定义stdlib.h里面定义了五种类型、一些宏和通用工具函数。
类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX 和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。
具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。
conio.hconio.h不是C标准库中的头文件。
conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
&表示引用传递。
在函数参数表中,出现带&这个的形参,表示引用传递。
2.程序实现(以下代码仅起参考作用)(1)图的相关运算#include <stdio.h>#include <malloc.h>#include "graph.h"#define INF 32767 //INF表示∞void MatToList(MGraph g,ALGraph *&G)//将邻接矩阵g转换成邻接表G{int i,j,n=g.vexnum; //n为顶点数ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0;i<n;i++) //给邻接表中所有头结点的指针域置初值G->adjlist[i].firstarc=NULL;for (i=0;i<n;i++) //检查邻接矩阵中每个元素for (j=n-1;j>=0;j--)if (g.edges[i][j]!=0) //邻接矩阵的当前元素不为0{p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点*pp->adjvex=j;p->info=g.edges[i][j];p->nextarc=G->adjlist[i].firstarc; //将*p链到链表后G->adjlist[i].firstarc=p;}G->n=n;G->e=g.arcnum;}void ListToMat(ALGraph *G,MGraph &g)//将邻接表G转换成邻接矩阵g{int i,j,n=G->n;ArcNode *p;for (i=0;i<n;i++) //g.edges[i][j]赋初值0for (j=0;j<n;j++)g.edges[i][j]=0;for (i=0;i<n;i++){p=G->adjlist[i].firstarc;while (p!=NULL){g.edges[i][p->adjvex]=p->info;p=p->nextarc;}}g.vexnum=n;g.arcnum=G->e;}void DispMat(MGraph g)//输出邻接矩阵g{int i,j;for (i=0;i<g.vexnum;i++){for (j=0;j<g.vexnum;j++)if (g.edges[i][j]==INF)printf("%3s","∞");elseprintf("%3d",g.edges[i][j]);printf("\n");}}void DispAdj(ALGraph *G)//输出邻接表G{int i;ArcNode *p;for (i=0;i<G->n;i++){p=G->adjlist[i].firstarc;if (p!=NULL) printf("%3d: ",i);while (p!=NULL){printf("%3d",p->adjvex);p=p->nextarc;}printf("\n");}}void main(){int i,j;MGraph g,g1;ALGraph *G;int A[MAXV][6]={{0,5,0,7,0,0},{0,0,4,0,0,0},{8,0,0,0,0,9},{0,0,5,0,0,6},{0,0,0,5,0,0},{3,0,0,0,1,0}};g.vexnum=6;g.arcnum=10;for (i=0;i<g.vexnum;i++)for (j=0;j<g.vexnum;j++)g.edges[i][j]=A[i][j];printf("\n");printf(" 有向图G的邻接矩阵:\n");DispMat(g);G=(ALGraph *)malloc(sizeof(ALGraph));printf(" 图G的邻接矩阵转换成邻接表:\n");MatToList(g,G);DispAdj(G);printf(" 图G的邻接表转换成邻接邻阵:\n");ListToMat(G,g1);DispMat(g1);printf("\n");}(2)图的遍历运算#include <stdio.h>#include <malloc.h>#include "graph.h"int visited[MAXV]; //全局数组#define INF 32767 //INF表示∞void MatToList(MGraph g,ALGraph *&G)//将邻接矩阵g转换成邻接表G{int i,j,n=g.vexnum; //n为顶点数ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));for (i=0;i<n;i++) //给邻接表中所有头结点的指针域置初值G->adjlist[i].firstarc=NULL;for (i=0;i<n;i++) //检查邻接矩阵中每个元素for (j=n-1;j>=0;j--)if (g.edges[i][j]!=0) //邻接矩阵的当前元素不为0{p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个结点*pp->adjvex=j;p->info=g.edges[i][j];p->nextarc=G->adjlist[i].firstarc; //将*p链到链表后G->adjlist[i].firstarc=p;}G->n=n;G->e=g.arcnum;}void DispAdj(ALGraph *G)//输出邻接表G{int i;ArcNode *p;for (i=0;i<G->n;i++){p=G->adjlist[i].firstarc;if (p!=NULL) printf("%3d: ",i);while (p!=NULL){printf("%3d",p->adjvex);p=p->nextarc;}printf("\n");}}void DFS(ALGraph *G,int v){ArcNode *p;visited[v]=1; //置已访问标记printf("%3d",v); //输出被访问顶点的编号p=G->adjlist[v].firstarc; //p指向顶点v的第一条弧的弧头结点while (p!=NULL){if (visited[p->adjvex]==0) //若p->adjvex顶点未访问,递归访问它DFS(G,p->adjvex);p=p->nextarc; //p指向顶点v的下一条弧的弧头结点}}void DFS1(ALGraph *G,int v) //非递归深度优先算法{ArcNode *p;ArcNode *St[MAXV];int top=-1,w,i;for (i=0;i<G->n;i++)visited[i]=0; //顶点访问标志均置成0printf("%3d",v); //访问顶点vvisited[v]=1;top++; //将顶点v的第一个相邻顶点进栈St[top]=G->adjlist[v].firstarc;while (top>-1) //栈不空循环{p=St[top]; top--; //出栈一个顶点作为当前顶点while (p!=NULL) //查找当前顶点的第一个未访问的顶点{w=p->adjvex;if (visited[w]==0){printf("%3d",w); //访问wvisited[w]=1;top++; //将顶点w的第一个顶点进栈St[top]=G->adjlist[w].firstarc;break; //退出循环}p=p->nextarc; //找下一个相邻顶点}}printf("\n");}void BFS(ALGraph *G,int v){ArcNode *p;int queue[MAXV],front=0,rear=0; //定义循环队列并初始化int visited[MAXV]; //定义存放结点的访问标志的数组int w,i;for (i=0;i<G->n;i++) visited[i]=0; //访问标志数组初始化printf("%3d",v); //输出被访问顶点的编号visited[v]=1; //置已访问标记rear=(rear+1)%MAXV;queue[rear]=v; //v进队while (front!=rear) //若队列不空时循环{front=(front+1)%MAXV;w=queue[front]; //出队并赋给wp=G->adjlist[w].firstarc; //找与顶点w邻接的第一个顶点while (p!=NULL){if (visited[p->adjvex]==0) //若当前邻接顶点未被访问{printf("%3d",p->adjvex); //访问相邻顶点visited[p->adjvex]=1; //置该顶点已被访问的标志rear=(rear+1)%MAXV; //该顶点进队queue[rear]=p->adjvex;}p=p->nextarc; //找下一个邻接顶点}}printf("\n");}void main(){int i,j;MGraph g;ALGraph *G;int A[MAXV][6]={{0,5,0,7,0,0},{0,0,4,0,0,0},{8,0,0,0,0,9},{0,0,5,0,0,6},{0,0,0,5,0,0},{3,0,0,0,1,0}};g.vexnum=6;g.arcnum=10;for (i=0;i<g.vexnum;i++)for (j=0;j<g.vexnum;j++)g.edges[i][j]=A[i][j];G=(ALGraph *)malloc(sizeof(ALGraph));MatToList(g,G); //图G的邻接矩阵转换成邻接表printf("图G的邻接表:\n");DispAdj(G);printf("从顶点0开始的DFS(递归算法):\n");DFS(G,0);printf("\n");printf("从顶点0开始的DFS(非递归算法):\n");DFS1(G,0);printf("从顶点0开始的BFS(递归算法):\n");BFS(G,0);printf("\n");}3.运行结果(包括程序如何使用,输入数据和输出结果)及分析四、实验体会。