数据结构上机实验5

合集下载

数据结构实验报告实验5

数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。

同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。

然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。

插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。

在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。

删除节点:同样需要根据删除位置的不同进行处理。

删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。

遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。

2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。

入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。

用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。

括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。

遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。

数据结构实验报告5(电大)

数据结构实验报告5(电大)

实验报告五查找(学科:数据结构)姓名单位班级学号实验日期成绩评定教师签名批改日期实验名称:实验五查找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 二叉排序树的建立【问题描述】参阅相关资料,阅读建立二叉排序树的程序。

数据结构集中上机实验报告

数据结构集中上机实验报告

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

数据结构上机实验五实验内容:查找表和内部排序的基本算法实验要求: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)编写算法,判断一棵二叉树是否为二叉排序树。

软基第五次上机实验报告

软基第五次上机实验报告

软基第五次上机实验报告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>五、实际运行结果:六、个人体会: 在此次实验中让我更深的认识到了顺序查找。

华南农业大学数据结构上机实验指导书及标准答案

华南农业大学数据结构上机实验指导书及标准答案

目录实验一线性表ﻩ错误!未定义书签。

(一)实验目的............................................................................................................... 错误!未定义书签。

(二) 实验内容ﻩ错误!未定义书签。

(三)实验报告ﻩ错误!未定义书签。

实验二堆栈ﻩ错误!未定义书签。

(一)实验目的 .............................................................................................................. 错误!未定义书签。

(二)实验内容 .............................................................................................................. 错误!未定义书签。

(三) 实验报告................................................................................................................. 错误!未定义书签。

实验三队列..................................................................................................................... 错误!未定义书签。

(一) 实验目的ﻩ错误!未定义书签。

(二) 实验内容................................................................................................................. 错误!未定义书签。

数据结构上机实验

数据结构上机实验

数据结构上机实验本课程实验中已知的预定义常量和类型如下:#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。

数据结构上机实验报告

数据结构上机实验报告

数据结构上机实验报告学院:电子工程学院专业:信息对抗技术姓名:学号:教师:饶鲜日期:目录实验一线性表 ........................................................................................................ - 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 },要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.运行结果(包括程序如何使用,输入数据和输出结果)及分析四、实验体会。

相关文档
最新文档