数据结构上机实验5
数据结构实验报告实验5
![数据结构实验报告实验5](https://img.taocdn.com/s3/m/2453a5be6e1aff00bed5b9f3f90f76c661374cf7.png)
数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。
同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。
然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。
插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。
在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。
删除节点:同样需要根据删除位置的不同进行处理。
删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。
遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。
2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。
入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。
用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。
括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。
遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。
数据结构实验报告5(电大)
![数据结构实验报告5(电大)](https://img.taocdn.com/s3/m/05be16e39b89680203d8252e.png)
实验报告五查找(学科:数据结构)姓名单位班级学号实验日期成绩评定教师签名批改日期实验名称:实验五查找5.1 折半查找【问题描述】某班学生成绩信息表中,每个学生的记录已按平均成绩由高到低排好序,后来发现某个学生的成绩没有登记到信息表中,使用折半查找法把该同学的记录插入到信息表中,使信息表中的记录仍按平均成绩有序。
【基本信息】(1)建立现有学生信息表,平均成绩已有序。
(2)输入插入学生的记录信息。
(3)用折半查找找到插入位置,并插入记录。
【测试数据】自行设计。
【实验提示】(1)用结构数组存储成绩信息表。
(2)对记录中的平均成绩进行折半查找。
【实验报告内容】设计程序代码如下:#include<stdio.h>#include<string.h>#define N 5struct student{char name[10];float avg;}void insort(struct student s[],int n){int low,hight,mid,k;char y[10];float x;low=1;hight=n;strcpy(y,s[0].name );x=s[0].avg ;while(low<=hight){mid=(low+hight)/2;if(x>s[mid].avg )hight=mid-1;elselow=mid+1;}for(k=0;k<low-1;k++){strcpy(s[k].name,s[k+1].name) ;s[k].avg =s[k+1].avg ;}printf("%d",low);strcpy(s[low-1].name ,y) ;s[low-1].avg =x;}void main(){Struct student a[N]={{"caozh",96},{"cheng",95},{"zhao",93},{"wang",92},{"chen",91}};struct student stu[N];int i;for(i=0;i<N;i++)stu[i+1]=a[i];printf("初始%d 位同学的信息表\n",MAX);printf("排名姓名平均分数\n");for(i=1;i<=N;i++)printf("%d: %6s %3.2f\n",i,stu[i].name,stu[i].avg);printf("\n");printf("\n");printf("请输入学生的姓名:");scanf("%s",stu[0].name );printf("\n");printf("请输入平均成绩:");scanf("%f",&stu[0].avg );printf("\n");insort(stu,N);printf("折半排序后同学的信息表\n",MAX);printf("排名姓名平均分数\n");for(i=0;i<=N;i++){printf("%d: %6s %3.2f\n",i+1,stu[i].name,stu[i].avg);}printf("\n");}程序运行结果如下:5.2 二叉排序树的建立【问题描述】参阅相关资料,阅读建立二叉排序树的程序。
数据结构集中上机实验报告
![数据结构集中上机实验报告](https://img.taocdn.com/s3/m/d710f21cb7360b4c2e3f64ed.png)
XX大学信息与计算科学专业2008级《数据结构》集中上机设计题目:迷宫求解(非递归求解)设计时间:2010-2011学年第一学期目录一、实验内容 (2)二、需求分析 (2)三、总体设计 (2)(一)存储结构 (2)(二)流程图 (3)四、详细设计 (3)(一)基本算法解析 (3)(二)为实现算法,需要的象的数据类型 (4)(三)函数的调用关系 (5)(四)算法时间、空间复杂度 (5)五、代码 (5)六、运行结果分析 (10)(一)迷宫路径探索成功 (10)(二)迷宫路径未找到的情况 (13)(三)程序的优缺点与改进 (13)七、参考文献 (14)八、心得体会 (14)一、实验内容任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出。
二、需求分析1、可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出;要求使用非递归算法。
2、用户可以根据自己的需求进行输入所需的迷宫,其中1表示迷宫的墙壁,0表示迷宫的通路,从而建立迷宫。
3、可以自行输入迷宫的入口和出口坐标。
4、程序执行的命令包括:(1)构造栈函数。
其中包括了构造空栈InitStack;压入新数据元素Push;栈顶元素出栈Pop。
(2)构造求迷宫路径函数。
其中定义了二维数组maze[M][N]存取迷宫数据;输出找到的通路MazePath。
(3)建立一个迷宫initmaze。
其中包括输入迷宫行数列数以及各行各列;加一圈围墙并输出迷宫。
三、总体设计(一)存储结构:首先用二维数组存储迷宫数据,迷宫数据由用户输入。
一个以链表结构作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)形式输出,其中(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向(东南西北所用代表数字,自行定义)。
1.从入口出发,顺着某一个方向进行探索,若能走通,继续往前走,否则沿原路退回,换一个方向继续探索,直至出口位置,求得一条通路。
北京交通大学-数据结构上机实验-5
![北京交通大学-数据结构上机实验-5](https://img.taocdn.com/s3/m/aec7ca2b0722192e4536f6d8.png)
数据结构上机实验五实验内容:查找表和内部排序的基本算法实验要求:1) 基本操作要作为函数被调用,做到模块化.2) 基本上实现每个实验题目的要求.分组要求:可单独完成,也可两人一组。
实验目的:1)熟悉C/C++基本编程,培养动手能力.2)通过实验,加深对查找算法的理解.评分标准:1) 只完成第一和第二题,根据情况得4,5-分;2)完成前3题,根据情况得5,6分;3)在2)基础上,选做四)中题目,根据情况得6,7分。
题目:一)顺序表与有序表的查找(1)建立一个顺序表,利用教材9.1.1的顺序查找算法进行查找;#include"stdio.h"#include"stdlib.h"typedef struct node{int key;}keynode;typedef struct Node{keynode r[50];int length;}list,*sqlist;int Createsqlist(sqlist s){int i;printf("请输入您要输入的数据的个数:\n");scanf("%d",&(s->length));printf("请输入您想输入的%d个数据;\n",s->length);for(i=0;i<s->length;i++)scanf("%d",&(s->r[i].key));printf("\n");printf("您所输入的数据为:\n\n");for(i=0;i<s->length;i++)printf("%-5d",s->r[i].key);printf("\n\n");return 1;}int searchsqlist(sqlist s,int k){int i=0;s->r[s->length].key=k;while(s->r[i].key!=k){i++;}if(i==s->length){printf("该表中没有您要查找的数据!\n");return 0;}elsereturn i+1;}sqlist Initlist(void){sqlist p;p=(sqlist)malloc(sizeof(list));if(p)return p;elsereturn NULL;}main(){int keyplace,keynum;//sqlist T;//T=Initlist();Createsqlist(T);printf("请输入您想要查找的数据的关键字:\n\n");scanf("%d",&keynum);printf("\n");keyplace=searchsqlist(T,keynum);if(keyplace>0)printf("您要查找的数据的位置为:\n\n%d\n\n",keyplace);return 2;}(2)建立一个有序表,利用折半法进行查找;#include"stdio.h"#include"stdlib.h"typedef struct node{int key;}keynode;typedef struct Node{keynode r[50];int length;}list,*sqlist;int Createsqlist(sqlist s){int i;printf("请输入您要输入的数据的个数:\n");scanf("%d",&(s->length));printf("请由小到大输入%d个您想输入的个数据;\n\n",s->length);for(i=0;i<s->length;i++)scanf("%d",&(s->r[i].key));printf("\n");printf("您所输入的数据为:\n\n");for(i=0;i<s->length;i++)printf("%-5d",s->r[i].key);printf("\n\n");return 1;}int searchsqlist(sqlist s,int k){int low,mid,high;low=0;high=s->length-1;while(low<=high){mid=(low+high)/2;if(s->r[mid].key==k)return mid+1;else if(s->r[mid].key>k)high=mid-1;elselow=mid+1;}printf("该表中没有您要查找的数据!\n");return 0;}sqlist Initlist(void){sqlist p;p=(sqlist)malloc(sizeof(list));if(p)return p;elsereturn NULL;}main(){int keyplace,keynum;//sqlist T;//T=Initlist();Createsqlist(T);printf("请输入您想要查找的数据的关键字:\n\n");scanf("%d",&keynum);printf("\n");keyplace=searchsqlist(T,keynum);if(keyplace>0)printf("您要查找的数据的位置为:\n\n%d\n\n",keyplace);}(3)试将把(2)中的折半法改用递归算法实现;#include"stdio.h"#include"stdlib.h"typedef struct node{int key;}keynode;typedef struct Node{keynode r[50];int length;}list,*sqlist;int Createsqlist(sqlist T){int i;printf("请输入您要输入的数据的个数:\n");scanf("%d",&(T->length));printf("请由小到大输入%d个您想输入的个数据;\n\n",T->length);for(i=0;i<T->length;i++)scanf("%d",&(T->r[i].key));printf("\n");printf("您所输入的数据为:\n\n");for(i=0;i<T->length;i++)printf("%-5d",T->r[i].key);printf("\n\n");return 1;}int searchsqlist(sqlist T,int key,int low,int high){if(low>high) return 0; //查找不到时返回0int mid=(low+high)/2;if(T->r[mid].key==key)return mid;else if(T->r[mid].key>key)return searchsqlist(T,key,low,mid-1);elsereturn searchsqlist(T,key,mid+1,high);}sqlist Initlist(void){sqlist T;T=(sqlist)malloc(sizeof(list));if(T)return T;elsereturn NULL;}main(){int keyplace;//int key,low,high;sqlist T;//T=Initlist();Createsqlist(T);printf("请输入您想要查找的数据的关键字:\n\n");scanf("%d",&key);printf("\n");low=0;high=T->length;keyplace=searchsqlist(T,key,low,high);if(keyplace>0)printf("您要查找的数据的位置为:\n\n%d\n\n",keyplace+1);else printf("该表中没有您要查找的数据!\n");}二)二叉排序树的一些基本操作(1)利用二叉链表的存储形式,从键盘输入建立一棵二叉排序树;(2)对(1)中建立的二叉排序树进行中序遍历并打印;#include <iostream>using namespace std;typedef int KeyType;typedef struct Node{KeyType key ;struct Node *lchild,*rchild;}BSTNode, *BSTree;void InsertBST(BSTree *bst, KeyType key){BSTree s;if (*bst == NULL)/*递归结束条件*/{s=new BSTNode;s-> key=key;s->lchild=NULL;s->rchild=NULL;*bst=s;}elseif (key < (*bst)->key)InsertBST(&((*bst)->lchild), key);/*将s插入左子树*/elseif (key > (*bst)->key)InsertBST(&((*bst)->rchild), key); /*将s插入右子树*/ }void CreateBST(BSTree *bst){KeyType key;*bst=NULL;scanf("%d", &key);while (key!=0){InsertBST(bst, key);scanf("%d", &key);}}void InOrder(BSTree root) {if (root!=NULL){InOrder(root->lchild);printf("%d ",root->key);InOrder(root->rchild);}}BSTNode * DelBST(BSTree T, KeyType x) {BSTNode *p, *f,*s ,*q;p=T;f=NULL;while(p) /*查找关键字为x的待删结点p*/{if(p->key==x) break;f=p; /*f指向p结点的双亲结点*/if(p->key>x)p=p->lchild;elsep=p->rchild;}if(p==NULL)return T; /*若找不到,返回原来的二叉排序树*/ if(p->lchild==NULL) /*p无左子树*/{if(f==NULL)T=p->rchild;elseif(f->lchild==p)f->lchild=p->rchild ;elsef->rchild=p->rchild ;delete p;}else /*p有左子树*/{q=p;s=p->lchild;while(s->rchild) /*在p的左子树中查找最右下结点*/{q=s;s=s->rchild;}if(q==p)q->lchild=s->lchild ; /*将s的左子树链到q上*/elseq->rchild=s->lchild;p->key=s->key;delete s;}return T;}void main(){BSTree T;int x;BSTree result;printf("建立二叉排序树,请输入序列L:\n");CreateBST(&T);printf("中序遍历输出序列为:");InOrder(T);cin>>x;result = DelBST(T,x);if (result != NULL){InOrder(result);}elseprintf("无x\n");}(3)编写算法,判断一棵二叉树是否为二叉排序树。
软基第五次上机实验报告
![软基第五次上机实验报告](https://img.taocdn.com/s3/m/7d59c870bc64783e0912a21614791711cd797905.png)
软基第五次上机实验报告EX5_1一、程序流程设有序序列的数据元素为: (3, 10, 13, 17, 40, 43, 50, 70)1)编写顺序查找函数2)编写二分查找函数3)在主程序中输入关键字(43和5), 分别调用两种查找函数, 输出结果。
数据结构描述: 二分查找二、程序代码:#include<stdio.h>#include<stdlib.h>#define N 20void search_sequence(int *a,int x){int i;for(i=0;a[i+1]!=0;i++)if (a[i]==x) {printf("Location:%d\n",i);return;}if (a[i+1]==0) printf("Can not find!\n");}void search_dichotomy(int *a,int x){int i=-1,length,head,trail,p;while(a[++i]!=0);length=i;head=0;trail=length-1;while(head<trail){p=(head+trail)/2;if (a[p]<x) head=p+1;else if (a[p]>x) trail=p-1;else {printf("Location:%d\n",p);return;}}printf("Can not find!\n");}void main(){int a[]={3,10,13,17,40,43,50,70,0};printf("顺序查找43和5: \n");search_sequence(&a,43);search_sequence(&a,5);printf("二分查找43和5: \n");search_dichotomy(&a,43);search_dichotomy(&a,5);}三、典型测试数据1: 3, 10, 13, 17, 40, 43, 50, 70四上机时遇到的问题:1、文件头缺失解决办法: 添加#include<stdlib.h>五、实际运行结果:六、个人体会: 在此次实验中让我更深的认识到了顺序查找。
华南农业大学数据结构上机实验指导书及标准答案
![华南农业大学数据结构上机实验指导书及标准答案](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 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。
《数据结构》上机作业——实验报告(五)[推荐]
![《数据结构》上机作业——实验报告(五)[推荐]](https://img.taocdn.com/s3/m/b4e8d97ec950ad02de80d4d8d15abe23482f032f.png)
《数据结构》上机作业——实验报告(五)[推荐]第一篇:《数据结构》上机作业——实验报告(五)[推荐]“计算机软件技术基础”课程实验报告(五)实验名称:排序算法班级_______ 姓名__________ 学号______实验日期:实验机时:3 学时实验成绩:-----------------一.实验目的:1、掌握主要排序算法的思想和实现技术。
二.实验内容:1、设计一程序,要求:输入学生“软件技术基础”课的成绩(学号、姓名、平均成绩、总学分);按总学分对学生数据进行排序。
(要求:实现任选3种排序算法)三.程序:1、程序规范(输入数据、功能、输出数据)2、设计分析(数据表示、算法)3、C源代码(电子版)四.程序调试:第二篇:《数据结构》上机作业——实验报告(六)“计算机软件技术基础”课程实验报告(六)实验名称:数据库及SQL语言班级_______ 姓名__________ 学号______实验日期:实验机时:3 学时实验成绩:-----------------一.实验目的:1、学习数据库设计的一般过程及相关技术;2、学习access数据库管理系统;3、掌握数据库的输入、查询、更新操作。
二.实验内容:1、需求陈述:某校图书馆要建立一个图书数据管理系统。
该图书馆的图书(书名、分类号、作者、出版社)存放在不同的借阅室(室名),读者(姓名、系名、类别)在书架上找到所需图书后,可以到服务台办理借阅(借阅时间)。
设计要求:λ分析需求,建立数据库的概念模型;λ将概念模型转换为关系模型(注意:是否需要作规范化处理);λ写出创建基本表的SQL语句;λ写出以下查询要求的SQL语句:(1)所有“高等数学习题集”书的信息;(2)读者“李林”借了什么书?(3)“社会学原理”在哪个借阅室?2、在access数据库管理系统中建立所设计的关系表;3、向各表中输入一组实验数据(元组)(注意:关系完整性);4、对数据库进行查询。
三.实验结果:1、实体-关系图;2、数据库表;3、创建基本表的语句;4、查询语句。
数据结构上机实验报告
![数据结构上机实验报告](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/28975ecb804d2b160a4ec051.png)
图用0和1表示是否相邻,对于有向图有向网用权值类型表示InfoType* info; //该弧相关信息的指针}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct {//点的值char name;char* data;}VertexType[MAX_VERTEX_NUM];typedef struct{VertexType vexs; //顶点向量AdjMatrix arcs; //邻接矩阵int vexnum; //图的当前顶点数int arcnum; //图的当前弧数GraphKind kind; //图的种类标志}MGraph;//***********************以下操作默认是无向网,即Kind = AG**************************//***********************顶点是名称字母。
书上的是数字,例如v************************Status LocateVex(MGraph G,char u){if(G.vexnum == 0) return -1; //图不存在int i;for(i = 0;i < G.vexnum;i++)if(G.vexs[i].name == u)return i;return -2; //图中不存在与u相等的点}Status CreateGraph(MGraph& G){int i,j,k;VRType w;char v1,v2;char data[50];cout << "你想要创建几个顶点? " << endl;cin >> G.vexnum;cout << "你想要创建几条弧? " << endl;cin >> G.arcnum;cout << "依次输入顶点名称:" << endl;for(i = 0;i < G.vexnum;i++)cin >> G.vexs[i].name; //构造顶点向量for(i = 0;i < G.vexnum;i++)for(j = 0;j < G.vexnum;j++){G.arcs[i][j].adj = INFINITY; //初始化邻接矩阵G.arcs[i][j].info = NULL;}for(k = 0;k < G.arcnum;k++){ //构造邻接矩阵cout << "输入一条边依附的两个顶点: ";cin >> v1 >> v2;cout << "输入这条边的权值: " << endl;cin >> w;cout << "输入这条边的信息: " << endl;cin >> data;i = LocateVex(G,v1);j = LocateVex(G,v2);G.arcs[i][j].adj = w;G.arcs[i][j].info = data;G.arcs[j][i] = G.arcs[i][j];}return 1;}Status DestroyGraph(MGraph& G){G.vexnum = NULL;G.arcnum = NULL;return 1;}char* GetVex(MGraph G,char v){if(G.vexnum == 0) return NULL;int i;i = LocateVex(G,v);if(i >= 0) //判断是否是图上的顶点,后面的函数省略了这一步return G.vexs[i].data;elsereturn NULL;}Status PutVex(MGraph& G,char v,char* value){if(G.vexnum == 0) return 0;int i;i = LocateVex(G,v);G.vexs[i].data = value;return 1;}//VertexType FirstAdjVex(MGraph G,char v) {}//返回第一个邻接顶点,邻接表操作//VertexType NextAdjVex(MGraph G,char v,char w) {} //邻接表操作Status InsertVex(MGraph& G,char v){if(G.vexnum == 0) return 0;int i;G.vexs[G.vexnum].name = v;G.vexnum++;for(i = 0;i < G.vexnum;i++){G.arcs[i][G.vexnum - 1].adj = INFINITY;G.arcs[G.vexnum - 1][i].adj = INFINITY;}return 1;}Status DeleteVex(MGraph& G,char v){if(G.vexnum == 0) return 0;int i,j,k;k = LocateVex(G,v);for(i = 0,j = 0;i < G.vexnum;i++)if(G.arcs[i][k].adj != INFINITY)j++;for(i = k;i < G.vexnum - 1;i++)G.vexs[i] = G.vexs[i+1];G.vexs[i].name = NULL;G.vexs -> data = NULL;G.vexnum--;G.arcnum = G.arcnum - j;return 1;}Status InsertArc(MGraph& G,char v,char w){ if(G.vexnum == 0) return 0;int i,j;VRType q;char data[50];i = LocateVex(G,v);j = LocateVex(G,w);cout << "输入这条边的权值: " << endl;cin >> q;cout << "输入这条边的信息: " << endl;cin >> data;G.arcs[i][j].adj = q;G.arcs[i][j].info = data;G.arcs[j][i] = G.arcs[i][j];G.arcnum = G.arcnum + 2;return 1;}Status DeleteArc(MGraph& G,char v,char w){if(G.vexnum == 0) return 0;int i,j;i = LocateVex(G,v);j = LocateVex(G,w);G.arcs[i][j].adj = INFINITY;G.arcs[i][j].info = NULL;G.arcs[j][i] = G.arcs[i][j];G.arcnum = G.arcnum - 2;return 1;}Status Print(MGraph G){int i,j;for(i = 0;i < G.vexnum ;i++){for(j = 0;j < G.vexnum ;j++)cout << G.arcs [i][j].adj << " ";cout << endl;}return 1;}int main(){int j;char i,c,d;MGraph G;CreateGraph(G);cout << "此时矩阵为: " << endl;Print(G);cout << "输入i::";cin >> i;j = LocateVex(G,i);cout << "i为第"<< j+1 << "个顶点" << endl;cout << "为两个点添加边,输入添加边的两个顶点: " << endl;cin >> c >> d;InsertArc(G,c,d);cout << "此时矩阵为: " << endl;Print(G);DeleteArc(G,c,d);cout << "添加顶点V;" << endl;cout << "此时矩阵为: " << endl;Print(G);c = 'V';InsertVex(G,c);cout << "此时矩阵为: " << endl;Print(G);cout << "删除顶点B;" << endl;d = 'B';DeleteVex(G,d);cout << "此时矩阵为: " << endl;Print(G);DestroyGraph(G);return 0;}运行结果:2、题目:2. 哈夫曼树的建立。
数据结构上机实验报告
![数据结构上机实验报告](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/f62835e7caaedd3382c4d331.png)
数据结构上机实验报告(看病问题)数据结构上机实验报告题目:一个病人看病模拟程序学生姓名:周瑞楠学生学号:3013216085学院名称:计算机学院专业:计算机科学与技术时间:2014.10.28目录第一章,需求分析 (3)1.1 原题描述 (3)1.2 详细问题的解决方案 (3)1.2.1 解决方案要求 (3)1.2.2 各个环节功能要求 (4)第二章,概要设计 (5)2.1 抽象数据类型 (5)2.2 主要算法描述 (5)2.3 算法分析 (6)第三章,详细设计 (7)3.1 程序代码 (7)第四章,调试分析 (9)第五章,测试分析 (10)第六章,未来展望与思考 (11)第一章需求分析1.1 原题描述请按照如下要求编写一个病人看病模拟程序编写一个程序,反映病人到医院看病,排队看医生的情况。
在病人排队过程中,主要重复两件事:(1)病人到达诊室,将病历本交给护士,拍到等待队列中候诊。
(2)护士从等待队列中取出下一位病人的病例,该病人进入诊室就诊。
1.2详细问题的解决方案1.2.1问题分析要求模拟病人等待就诊这一过程,程序采用菜单方式,其选项及功能说明如下:(1)排队————输入排队病人的病历号,加入到病人排队队列中。
(2)就诊————病人排队队列中最前面的病人就诊,并将其从队列中删除。
(3)查看排队————从队首到队尾列出所有的排队病人的病历号。
(4)不再排队,余下依次就诊————从队首到队尾列出所有的排队病人的病历号,并退出运行。
(5)下班————退出运行。
1.2.2 解决方案要求测试数据及输出如下:1:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1 >>输入病历号:11:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1 >>输入病历号:21:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1 >>输入病历号:31:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:2 >>病人1就诊1:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:3 >>排队病人:2 31:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:1>>输入病历号:41:排队 2:就诊 3:查看排队 4:不再排队,余下依次就诊 5:下班请选择:4>>病人按以下顺序就诊:2 3 41.2.3 各个环节功能要求表1-2.1 环节功能函数功能注意条件及限制规则initQueue()建立空队列头指针尾指针建立后判断是否为NULL EnQueue() 在队尾插入元素判断节点储存分配是否失败DeQueue () 删除对头元素并返回其值释放被删除的节点删除队尾元素注意改变指针位置ShowQueu输出队列元素e()补充正文:主函数里用switch来表明各种情况下应当调用的函数第二章概要设计2.1 抽象数据类型ADT deletenode{数据对象:D={ai|ai∈ElemSet,i=1,2,…,m, m≥0TermSet 中的每个元素包含一个整数}数据关系:R1={<ai ,ai-1>| ai,ai-1∈D,且ai中的整数有序,i=2,3…,n}约定其中a1端为队列投,an 端为队列尾基本操作:InitQueue(&Q);操作结果:建立空队列。
数据结构上机实验报告
![数据结构上机实验报告](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. 法律名词及注释在此处添加涉及到的法律名词或术语,并提供简要注释。
数据结构实验报告五—四则运算表达式求值
![数据结构实验报告五—四则运算表达式求值](https://img.taocdn.com/s3/m/ece05973a417866fb84a8ed6.png)
问题描述:四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
一、需求分析:1、本程序是利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值。
2、输入输出格式:输入格式:在字符界面上输入一个中缀表达式,回车表示结束。
请输入表达式:输入一个中缀表达式输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
逆波兰表达式为:输出逆波兰表达式运算结果为:输出运算后的结果3、测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+二、概要设计:抽象数据类型二叉树类BiTree算法的基本思想根据题目要求,利用栈计算,和二叉树存储,来计算表达式该算法的基本思想是:先利用栈进行计算,然后用二叉树进行存储,和实验三算法一样来计算逆波兰表达式的值程序的流程程序由三个模块组成:(1)输入模块:输入一个运算式(2)计算模块:利用栈进行表达式的计算,二叉树来存储。
(3 )输出模块:屏幕上显示出后缀表达式和运算结果。
三、详细设计物理数据类型程序含有两个类,其中栈不再赘述,另一个类为二叉树class BiTree 包含私有成员struct BiTreeNode,根节点BiTreeNode *T;索引index; int number_of_point 优先级比较函数 compare(char a,char b);生成树的函数void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end);判断数字函数bool IsNumber(char a);求值函数double Operate(BiTreeNode *T);还有显示后缀表达式的函数void display(BiTreeNode *T) ;而公有成员函数则是对私有函数的重载,为方便使用,因为函数中普遍使用了递归的算法。
数据库上机实验五篇范文
![数据库上机实验五篇范文](https://img.taocdn.com/s3/m/4b5f42e16037ee06eff9aef8941ea76e58fa4a26.png)
数据库上机实验五篇范文第一篇:数据库上机实验创建数据表与数据输入Part I.使用SQL Server Management Studio创建数据表和输入数据 1.在SQL Server Management Studio中创建数据表 P69 1.(1)-(6)2.为数据表输入数据 P76 4.(1)-(4)3.数据浏览P771.(1)-(2)2.(1)-(3)Part II.使用SQL语句创建数据表和输入数据 1.使用SQL语句创建数据表 P72.例3-22.使用SQL语句输入数据 P82.例3.8习题:P.105(1)(2)insert 数据操作Insert、Update、DeleteP105 3.上机练习题(2)(4)Insert(100001, 1000, 2002-12-18 0:00:00)(100002, 2000, 2010-3-20 0:00:00)Update(100001, 1500, 2002-12-18 0:00:00)(100002, 2000, 2012-9-25 0:00:00)Delete Transact-SQL语句基础1 1.将teaching数据库中score 表的studentno列设置为引用表student的外键。
ALTER TABLE Score ADD CONSTRAINT FK_score_student FOREIGN KEY(studentno)REFERENCES student(studentno)2.将teaching数据库中class表的classname创建UNIQUE约束。
ALTER TABLE class ADD CONSTRAINT UQ_class UNIQUE(classname)执行如下插入语句,查看提示信息INSERT INTO class VALUES(‘090602’, ’计算机0902’, ’计算机学院’, ’马文斐’)3.为teaching数据库中student表的birthday列创建CHECK约束,规定学生的年龄在17-25岁之间。
数据结构实验五
![数据结构实验五](https://img.taocdn.com/s3/m/fd8af748fe4733687e21aa99.png)
福建农林大学金山学院实验报告系(教研室):专业:年级:实验课程:数据结构姓名:学号:实验室号:_ _ 计算机号:实验时间:指导教师签字:成绩:实验五:(快速、堆、基数等)排序算法的设计一、实验目的和要求(1) 深刻理解排序的定义和各种排序方法的特点,并能灵活运用。
(2) 掌握常用的排序方法,并掌握用高级语言实现排序算法的方法。
(3) 了解各种方法的排序过程及其依据的原则,并掌握各种排序方法的性能的分析方法。
二、实验内容和原理(1)设计直接插入排序、冒泡排序、快速排序算法。
(2)设计堆排序和基数排序算法。
三、实验环境1. 硬件:PC机;2. 软件:Windows操作系统、Visual C++ 6.0四、算法描述及实验步骤算法描述及步骤如下:(1)在VC环境下输入题目给出的程序代码。
(2)检查程序有无错误(包括语法错误和逻辑错误),有则改之。
(3)编译和连接,仔细分析编译信息,如有错误应找出原因并改正之(4)运行程序,输入数据,分析结果。
(5)将调试好的程序保存在自己的用户目录中,文件名自定五、调试过程直接排序冒泡排序快速排序基数排序堆排序六、实验结果直接排序冒泡排序快速排序基数排序堆排序七、总结(1)通过练习,了解C++源程序的编译,连接的运行,并能熟练使用集成环境的界面和有关菜单。
(2)能够通过编译时出现的出错提示信息,进行初步的纠错。
(3)完成一个程序的一般步骤为设计,录入,编译,如果出错,则修改,然后再编译,编译成功后,看看结果是否正确,如果结果不正确,则再重复以上步骤(4)通过练习能,了解直接排序、冒泡排序、快速排序、堆排序和基数排序算法的性质,并通过练习进一步掌握直接排序、冒泡排序、快速排序、堆排序和基数排序算法的应用。
附录:直接排序#include <iostream>using namespace std;int max=100;typedef struct{int key;}recordtype;void intsertsorting(recordtype R[],int n){int i,j;for(i=2;i<=n;i++){R[0]=R[i];j=i-1;while(R[0].key<R[j].key)while(R[0].key<R[j].key){R[j+1]=R[j];j--;}R[j+1]=R[0];}}}int main(){int i,n;recordtype R[100];cout<<"输入要排序的个数";cin>>n;for(i=1;i<=n;i++)cin>>R[i].key;intsertsorting(R,n);for(i=1;i<=n;i++)cout<<R[i].key<<" ";return 0;}冒泡排序#include <iostream>using namespace std;int max=100;typedef struct{int key;}recordtype;void bubblesort(recordtype R[],int n) {int i,j;recordtype temp;for(i=0;i<n;i++)for(j=i;j<n;j++)if(R[j-1].key>R[j].key){temp=R[j-1];R[j-1]=R[j];R[j]=temp;}}{int i,n;recordtype R[100];cout<<"输入要排序的个数";cin>>n;for(i=0;i<n;i++)cin>>R[i].key;bubblesort(R,n-1);for(i=0;i<n;i++)cout<<R[i].key<<" ";return 0;}快速排序#include <iostream>using namespace std;int max=100;typedef struct{int key;}recordtype;int divideareasort(recordtype R[],int s,int t) {int i,j;recordtype temp;i=s;j=t;temp=R[s];do{while ((R[j].key>=temp.key)&&i<j)j--;if(i<j){R[i]=R[j];i++;}while((R[i].key<=temp.key)&&i<j)i++;if(i<j){R[j]=R[i];j--;}}while(i<j);R[i]=temp;return i;}void quicksort(recordtype R[],int s,int t) {int i;if(s<t){i=divideareasort(R,s,t);quicksort(R,s,i-1);quicksort(R,i+1,t);}}int main(){int i,n;recordtype R[100];cout<<"输入要排序的个数";cin>>n;for(i=0;i<n;i++)cin>>R[i].key;quicksort(R,0,n-1);for(i=0;i<n;i++)cout<<R[i].key<<" ";return 0;}基数排序#include <stdio.h>#include <stdlib.h>int main(){int data[20];int temp[10][10]={0};int order[10]={0};int i,j,k,n,lsd,m;k=0;n=1;printf("请输入排序个数:");scanf("%d",&m);for(i=0;i<m;i++)scanf("%d",&data[i]);while (n<=m){for (i=0;i<m;i++){lsd=((data[i]/n)%m);temp[lsd][order[lsd]]=data[i];order[lsd]++;}for (i=0;i<m;i++){if(order[i]!=0)for (j=0;j<order[i];j++){data[k]=temp[i][j];k++;}order[i]=0;}n*=m;k=0;}printf("基数排序后:");for (i=0;i<m;i++)printf("%d ",data[i]);printf("\n");return 0;}堆排序#include<iostream>#define max 100using namespace std;typedef struct{int key;}recordtype;recordtype R[max+1] ;void heapadjust(recordtype R[], int s, int t) {int i ,j;recordtype temp;temp=R[s];i=s;j=2*i;while(j<=t){if((j<t)&&(R[j].key>R[j+1].key))j++;if(temp.key>R[j].key){R[i]=R[j];i=j;j=2*i;}elsej=t+1;}R[i]=temp;}void heapsort(recordtype R[],int n ){int i ;recordtype temp;for(i=n/2;i>=1;i--)heapadjust(R, i, n );for(i=n;i>1;i--){temp=R[1];R[1]=R[i];R[i]=temp;heapadjust(R,1,i-1);}}int main(){int i,n;cout<<"请输入数组的元素个数:" <<endl;cin>>n;for(i=1;i<=n;i++)cin>>R[i].key;heapsort(R,n);cout<<"堆排序后的结果如下: "<<endl;for(i=1;i<=n;i++)cout<<R[i].key<<" ";cout<<endl;return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机实验(五)递归
班级:学号:姓名:
上机时间:地点:
一、实验目的
1.理解递归的定义和递归模型。
2.掌握递归设计的一般方法,能用递归算法解决一些较复杂应用问题。
二、实验内容
1.编写程序求解皇后问题
要求:(1)皇后的个数n由用户输入,其值不能超过20;
(2)采用递归方法求解。
2.编写一个程序求解背包问题
三、实验过程
1.了解常用函数所在的头文件
stdlib.h
stdlib 头文件里包含了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.h
conio.h不是C标准库中的头文件。
conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
&表示引用传递。
在函数参数表中,出现带&这个的形参,表示引用传递。
2.程序实现(以下代码仅起参考作用)
(1)求解皇后问题
#include <stdio.h>
#include <stdlib.h>
const int N=20; //最多皇后个数
int q[N]; //存放各皇后所在的行号
int cont=0; //存放解个数
void print(int n) //输出一个解
{
cont++;
int i;
printf(" 第%d个解:",cont);
for (i=1;i<=n;i++)
printf("%d ",q[i]);
printf("\n");
}
int find(int i,int k) //测试第k列的i行上能否摆放皇后
{
int j;
j=1;
while (j<k) //j=1~k-1是已放置了皇后的列
{
if ((q[j]==i) || (abs(q[j]-i)==abs(j-k)))
//第j列皇后是否在i行或(q[j],j)与(i,k)是否同对角线
return 0;
j++;
}
return 1;
}
void place(int k,int n) //第k个皇后放到第k列上
{
if (k>n)
print(n); //所有皇后放置结束
else
for (int i=1;i<=n;i++) //在第k列上穷举每一个位置
if (find(i,k))
{
q[k]=i;place(k+1,n);
}
}
void main()
{
int n; //n存放实际皇后个数
printf(" 皇后问题(n<20) n=");
scanf("%d",&n);
if (n>20)
printf("n值太大,不能求解\n");
else
{
printf(" %d皇后问题求解如下:\n",n);
place(1,n);
printf("\n");
}
}
(2)求解背包问题
#include <stdio.h>
#define N 100
int limitw; //限制的总重量
int totv; //全部物品的总价int maxv;
int option[N],cop[N];
struct
{
int weight;
int value;
} a[N];
int n; //物品种数次void find(int i,int tw,int tv)
{
int k;
if (tw+a[i].weight<=limitw)
{
cop[i]=1;
if (i<n-1)
find(i+1,tw+a[i].weight,tv);
else
{
for (k=0;k<n;k++)
option[k]=cop[k];
maxv=tv;
}
cop[i]=0;
}
if (tv-a[i].value>maxv)
if (i<n-1)
find(i+1,tw,tv-a[i].value);
else
{
for (k=0;k<n;k++)
option[k]=cop[k];
maxv=tv-a[i].value;
}
}
void main()
{
int k,w,v;
printf("物品种数:");
scanf("%d",&n);
for (totv=0,k=0;k<n;k++)
{
printf(" 第%d种物品(重量,价值):",k+1);
scanf("%d,%d",&w,&v);
a[k].weight=w;
a[k].value=v;
totv+=v;
}
printf("背包所能承受的总重量:");
scanf("%d",&limitw);
maxv=0;
for (k=0;k<n;k++)
cop[k]=0;
find(0,0,totv);
printf("最佳装填方案是:\n");
for (k=0;k<n;k++)
if (option[k])
printf(" 第%d种物品\n",k+1);
printf("总价值=%d\n",maxv);
}
3.运行结果(包括程序如何使用,输入数据和输出结果)及分析四、实验体会。