根据工作的内容与性质,报告划分为不同的写作格式,加上报告的内容较多,很多人不知道怎么写报告。以下是小编整理的关于《数据结构实验报告答案》,欢迎大家借鉴与参考,希望对大家有所帮助!
第一篇:数据结构实验报告答案
数据结构实验报告
注意:实验结束后提交一份实验报告电子文档
电子文档命名为“学号+姓名”,如:E01214058宋思怡
《数据结构》实验报告
(一)
学号:姓名:专业年级:
实验名称:线性表
实验日期:2014年4月14日
实验目的:
1、熟悉线性表的定义及其顺序和链式存储结构;
2、熟练掌握线性表在顺序存储结构上实现基本操作的方法;
3、熟练掌握在各种链表结构中实现线性表基本操作的方法;
4、掌握用 C/C++语言调试程序的基本方法。
实验内容:
一、编写程序实现顺序表的各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1)初始化顺序表L;
(2)依次在L尾部插入元素-1,21,13,24,8;
(3)输出顺序表L;
(4)输出顺序表L长度;
(5)判断顺序表L是否为空;
(6)输出顺序表L的第3个元素;
(7)输出元素24的位置;
(8)在L的第4个元素前插入元素0;
(9)输出顺序表L;
(10)删除L的第5个元素;
(11)输出顺序表L。
源代码
调试分析(给出运行结果界面)
二、编写程序实现单链表的各种基本运算,并在此基础上设计一个主程序完成如下功能:
„„„„
„„„„
小结或讨论:
(1)实验中遇到的问题和解决方法
(2)实验中没有解决的问题
(3)体会和提高
第二篇:数据结构实验报告
第一次实验
学号:20141060106
姓名:叶佳伟
一、实验目的
1、复习变量、数据类型、语句、函数;
2、掌握函数的参数和值;
3、了解递归。
二、实验内容
1、(必做题)采用函数统计学生成绩:输入学生的成绩,计算并输出这些学生的最低分、最高分、平均分。
2、(必做题)采用递归和非递归方法计算k阶裴波那契序列的第n项的值,序列定义如下: f0=0, f1=0, …, fk-2=0, fk-1=1, fn= fn-1+fn-2+…+fn-k(n>=k) 要求:输入k(1<=k<=5)和n(0<=n<=30),输出fn。
3、(选做题)采用递归和非递归方法求解汉诺塔问题,问题描述如下:
有三根柱子A、B、C,在柱子A上从下向上有n个从大到小的圆盘,在柱子B和C上没有圆盘,现需将柱子A上的所有圆盘移到柱子C上,可以借助柱子B,要求每次只能移动一个圆盘,每根柱子上的圆盘只能大的在下,小的在上。 要求:输入n,输出移动步骤。
三、算法描述
(采用自然语言描述)
1.先输入各个成绩,然后再逐一比较,筛选出最低分和最高分。在筛选的过程中使用累加把各个人的总成绩算出来,最后再除以总人数。 2.
四、详细设计
(画出程序流程图) 1.
五、程序代码
(给出必要注释) 1.#include float ave(int score[],int k) {int i;float s=0.0,ave; for(i=0;i
1 } int max(int score[],int k) {int i,max; max=score[0]; for(i=0;imax) max=score[i]; return max; } int min(int score[],int k) {int i,min; min=score[0]; for(i=0;i
2.#include int f(int n) {int k; if(n
2 else return (2*f(n-1)-f(n-k-1)); } void main() {int k,n,fn=0; printf("请输入k和n的值:[k(1<=k<=5)n(0<=n<=30)] "); scanf("%d",&k); scanf("%d",&n); while(k==1) {printf("f%d=1 ",n); break;} while(k>1) {fn=(n); printf("f%d=%d ",n,fn); break;} } 2.2 #include
六、测试和结果
(给出测试用例以及测试结果)
1.
2.
七、用户手册
(告诉用户如何使用程序) 1.使用Micrcosoft Visual C++。 2.使用Micrcosoft Visual C++。
3
第三篇:数据结构实验报告
实验报告4 排序
一、实验目的
1、掌握常用的排序方法,并掌握用高级语言实现排序算法的方法。
2、深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用。
3、了解各种方法的排序过程及其依据的原则,并掌握各种排序方法的时间复杂度的分析方法。
二、实验要求及内容
要求编写的程序所能实现的功能包括:
1、从键盘输入要排序的一组元素的总个数
2、从键盘依次输入要排序的元素值
3、对输入的元素进行快速排序
4、对输入的元素进行折半插入排序
三、实验代码及相关注释
#include using namespace std; #include "malloc.h"
typedef struct { int key; }RedType;
typedef struct { RedType r[100]; int length; }SqList;
//1 快速排序的结构体
typedef struct {
int data[100];
int last; }Sequenlist; //2 折半插入排序的结构体
int Partition ( SqList &L, int low, int high )
//1 寻找基准
{
L.r[0]=L.r[low];//子表的第一个记录作基准对象
int pivotkey = L.r[low].key; //基准对象关键字 while(low
while(low= pivotkey) --high;
L.r[low] = L.r[high]; //小于基准对象的移到区间的左侧
while(low
L.r[high] = L.r[low] ; //大于基准对象的移到区间的右侧 }
L.r[low] = L.r[0]; return low; }
void QuickSort ( SqList &L, int low, int high )
//1 快速排序 { //在序列low-high中递归地进行快速排序
if ( low < high)
{
int pivotloc= Partition (L, low, high);
//寻找基准
QuickSort ( L, low, pivotloc-1); //对左序列同样递归处理
QuickSort ( L, pivotloc+1, high); //对右序列同样递归处理
} }
Sequenlist *Sqlset()
//2 输入要折半插入排序的一组元素
{
Sequenlist *L;
int i;
L=(Sequenlist *)malloc(sizeof(Sequenlist));
L->last=0;
cout<<"请输入要排序的所有元素的总个数:";
cin>>i;
cout<
cout<<"请依次输入所有元素的值:";
if(i>0)
{
for(L->last=1;L->last<=i;L->last++)
cin>>L->data[L->last];
L->last--;
}
return (L); }
middlesort(Sequenlist *L)
//2 折半插入排序 { int i,j,low,high,mid; for(i=1;i<=L->last;i++) {
L->data[0]=L->data[i];
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(L->data[0]data[mid])
high=mid-1; //插入点在前半区
else
low=mid+1; //插入点在后半区
}
for(j=i;j>high+1;j--) { L->data[j]=L->data[j-1];} //后移
L->data[high+1]=L->data[0]; //插入 } return 0; }
int main() { gg: cout<<"请选择功能(1.快速排序 2.折半插入排序 3.退出程序):"; int m; cin>>m; cout<
if(m==1) { SqList L; int n; cout<<"请输入要排序的所有元素的总个数:"; cin>>n; cout<
cin>>L.r[i].key;
} cout<
QuickSort(L,1,L.length);
for(int j=1;j<=L.length;j++)
{
cout<
}
cout<
cout<
}
if(m==2) {
Sequenlist *L;
int i;
L=Sqlset();
cout<
middlesort(L);
cout<<"折半插入排序后为:";
for(i=1;i<=L->last;i++)
{
cout
}
cout<
cout<
goto gg; }
if(m==3) {
exit(0);
cout<
四、 重要函数功能说明
1、Sequenlist *Sqlset()
输入要折半插入排序的一组元素
2、int Partition ( SqList &L, int low, int high )
寻找快速排序的基准
3、void QuickSort ( SqList &L, int low, int high )
快速排序
4、middlesort(Sequenlist *L)
折半插入排序
五、 程序运行结果
下图仅为分别排序一次,可多次排序,后面有相关截图:
六、实验中遇到的问题、解决及体会
1、起初编写快速排序的程序时,我是完全按照老师PPT上的算法敲上去的,然后建立了一个SqList的结构体,调试运行时出现错误,仔细查看才意识到Partition函数中L中应该包含元素key,而我建立结构体时没有注意,然后我将key这个元素补充进去,继续调试,又出现错误,提示我Partition没有定义,我就觉得很奇怪,我明明已经写了函数定义,为什么会这样,当我又回过头来阅读程序时,我发现QuickSort函数中调用了Partition函数,但是我的Partition函数的定义在QuickSort函数的后面,于是我将Partition函数放到了QuickSort函数的前面,再次调试运行,就可以正常运行,得出结果了。这让我懂得,编程一定要认真仔细,不可大意马虎,否则又会花很多时间回过头来检查修改程序,得不偿失。
运行程序错误截图:
2、本来我是编写了两个程序,分别实现快速排序和折半插入排序的功能,但我后来想我是否可以将其合二为一,于是我想到用if选择语句用来实现不同的功能,从键盘输入功能选项m,if(m==1),可以进行快速排序,if(m==2),可以进行折半插入排序,于是我继续思考,我是否可以在一次运行程序中,多次对含有不同元素的序列进行排序,于是我用了goto语句,每次排序一次后,自动循环到选择语句,当不需要在排序的时候,可以从键盘输入3,退出程序,这样一来,程序变得更加实用和清晰明朗。这让我懂得,想要编出好的程序,要善于思考,在实现所需功能的前提下,多想问题,看是否能使程序更加实用简便。
修改程序前两个运行结果截图
(两个程序,调试运行两次,每次只能进行一次排序)
1、快速排序程序运行结果截图:
2、折半插入排序程序结果截图:
程序重要模块修改截图:
修改程序后运行截图:
(一个程序,调试运行一次,可多次进行不同序列的不同排序)
第四篇:数据结构实验报告
天 津 科 技 大 学
14学年—15学年第 2 学期 数据结构实验任务书
专业名称: 计算机科学与技术 实验学时: 4 课程名称:数据结构 任课教师: 史绍强 实验题目:图的最短路径算法的实现
实验环境: Visual C++ 实验目的:
1.掌握图的邻接矩阵的存储定义;
2.掌握图的最短路径(Dijsktra)算法的实现。 。
实验内容:
设计北京林业大学的校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。
1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图(算法6.1); 2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;
3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径(算法6.10)。
选做内容(对文件进行操作,相应信息变化后,再次进行景点信息查询和问路查询时应该有所体现)
1. 修改一个已有景点的相关信息; 2. 增加一个新景点及其相关信息; 3. 增加一条新的路径;
4. 删除一个景点及其相关信息; 5. 删除一条路径。
实现提示:
1. 校园道路是双向通行的,可设校园平面图是一个带权的无向图,用邻接矩阵表示此无向网。
typedef struct{
char name[100]; char info[10000]; }VertexType; //顶点结构 typedef struct{
VertexType vexs[10]; int arcs[100][100];//邻接矩阵
int vexnum,arcnum;//顶点个数,边的个数
}MGraph; //图结构
2. 将图的顶点信息和边的信息用数据文件graph.txt存储,数据文件格式可以设置如下形式:
图中顶点数 边的数目
景点名称 景点信息
始点
终点
路径长度
如可以在文件graph.txt中存储以下数据: 8 15 女生宿舍 有南北两栋,24层,是北林最漂亮的宿舍楼 小南门 经由北林主路通往学校北门,交通便利 „„
正门 主楼 80 正门 图书馆 400 „„
程序运行的参考结果下图:
实验要求:
(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。 (2) 程序要添加适当的注释,程序的书写要采用缩进格式。
(3) 根据实验报告模板详细书写实验报告,在实验报告中给出校园平面图。
(4) 校园平面图中的校园景点信息保存在文件graph.txt中,源程序保存为“Graph_search.cpp”,实验报告命名为“实验报告3.doc”。将这三个文件压缩为一个文件,每个同学自己先将压缩文件命名为::学号姓名.rar,上传到welcomeyouto@tust.edu.cn(由各班学习委员统一打包压缩发送,学委发送的文件格式为班级实验报告3,如132011班实验报告3)。
实验结果如下图:
第五篇:数据结构实验报告
指导教师 姓
名班
级学
号实
验 室
黄梅根
钟志伟 0140703 07310325 S331-B
2008-11-29
单链表的插入和删除实验日志
指导教师:黄梅根
实验时间:2008年10月14日 学院 通信学院 专业信息工程
班级0140703 学号07310325姓名 钟志伟 实验室S331-B
实验题目:
单链表的插入和删除 实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求:
建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤:
1 分析、理解程序。
2 调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3 修改程序:
增加插入结点的功能。
将建立链表的方法改为头插入法。
实验结果:
心得体会:
通过本次实验,我了基本上掌握了线性表的逻辑结构和链式存储结构,从中也发现自己在这方面的知识掌握的还不是很扎实,下来要多看书,将基本的知识要掌握牢固。
二叉树操作实验日志
指导教师:黄梅根
实验时间:2008年 10 月28 日 学院 通信学院 专业信息工程
班级0140703 学号07310325姓名 钟志伟 实验室S331-B 实验题目: 二叉树操作
实验目的:
掌握二叉树的定义、性质及存储方式,各种遍历算法。
实验要求:
采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
实验主要步骤; 1. 分析、理解程序。
2. 添加中序和后序遍历算法. 3. 调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。
实验结果:
心得体会:
通过此次实验,我基本掌握了建立二叉树,并且掌握了先序、中序和后序以及按层次遍历的操作,更好的掌握了书本上的知识。
图的遍历操作实验日志
指导教师:黄梅根
实验时间:2008年 11 月 11 日 学院 通信学院 专业 信息工程
班级 0140703 学号 07310325姓名 钟志伟实验室S331-B 实验题目:
图的遍历操作 实验目的:
掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。 实验要求:
采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。 实验主要步骤:
1、分析、理解程序。
2、调试程序。设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。
实验结果:
心得体会:
通过本次实验,我掌握了有向图和无向图的一些概念,了解了DFS和BFS对图的遍历操作。
循环链表实验日志
指导教师:黄梅根
实验时间:2008年 11 月 25 日 学院 通信学院 专业 信息工程
班级 0140703 学号 07310325 姓名 钟志伟 实验室S331-B 实验目的:
了解和掌握线性表的逻辑结构和链式存储结构,掌握循环链表的基本算法及相关的时间性能分析。
实验要求:
1.实现循环链表的建立
2.输出循环链表节点的指针序列,要求先输出自身的指针,再输出其指向的 节点的指针。如一个有五个节点的循环链表,各节点地址依次为3109,3290,3106,3595,3390,则输出应为:
3109
3290
3290 3106
3106 3595
3595 3390
3390
3109 3.对链表进行由大到小的排序,输出排序完成后的链表和链表的指针序列。
源代码:
#include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node
//定义结点
{ char data[10];
//结点的数据域为字符串
struct node *next;
//结点的指针域
}ListNode; typedef ListNode * LinkList;
// 自定义LinkList单链表类型 LinkList CreatListR1();
//函数,用尾插入法建立带头结点的单链表 ListNode *LocateNode();
//函数,按值查找结点 void DeleteList();
//函数,删除指定值的结点 void printlist();
//函数,打印链表中的所有值
void DeleteAll();
//函数,删除所有结点,释放内存
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL========== ListNode *LocateNode(LinkList head, char *key) {
ListNode *p=head->next; //从开始结点比较
while(p&&strcmp(p->data,key)!=0) //直到p为NULL或p-> data为key止
p=p->next;
//扫描下一个结点
return p;
//若p=NULL则查找失败,否则p指向找到的值为key的结点 }
//==========用尾插入法建立带头结点的单链表=========== LinkList CreatListR1(void) {
char ch[10];
LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点
ListNode *s,*r,*pp;
r=head;
r->next=head;
printf("Input # to end "); //输入"#"代表输入结束
printf("Please input Node_data:");
scanf("%s",ch);
//输入各结点的字符串
while(strcmp(ch,"#")!=0) {
// pp=LocateNode(head,ch);
//按值查找结点,返回结点指针
// if(pp==NULL)
{
//没有重复的字符串,插入到链表中
s=(ListNode *)malloc(sizeof(ListNode));
strcpy(s->data,ch);
r->next=s;
r=s;
r->next=head;
}
printf("Input # to end ");
printf("Please input Node_data:");
scanf("%s",ch);
}
return head;
//返回头指针 } //==========删除带头结点的单链表中的指定结点======= void DeleteList(LinkList head,char *key) {
ListNode *p,*r,*q=head;
p=LocateNode(head,key);
//按key值查找结点的
if(p==NULL ) {
//若没有找到结点,退出
printf("position error");
exit(0);
}
while(q->next!=p)
//p为要删除的结点,q为p的前结点
q=q->next;
r=q->next;
q->next=r->next;
free(r);
//释放结点 } //===========打印链表======= void printlist(LinkList head) {
ListNode *p=head->next;
//从开始结点打印
while(p!=head){ printf("%s,%s ",p->data,p->next);
p=p->next;
}
printf(" "); } //==========删除所有结点,释放空间=========== void DeleteAll(LinkList head) {
ListNode *p=head,*r;
while(p->next){ r=p->next;
free(p); p=r;
}
free(p); }
//==========主函数============== void main() {
char ch[10],num[10];
LinkList head;
head=CreatListR1();
//用尾插入法建立单链表,返回头指针
printlist(head);
//遍历链表输出其值
printf(" Delete node (y/n):"); //输入"y"或"n"去选择是否删除结点
scanf("%s",num);
if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){
printf("Please input Delete_data:");
scanf("%s",ch);
//输入要删除的字符串
DeleteList(head,ch);
printlist(head);
}
DeleteAll(head);
//删除所有结点,释放内存 }
实验结果:
心得体会:
通过本次实验,我了解了线性表的逻辑结构和链式结构,从中也发现自己在一些知识上掌握的不是很牢固,自己下来要多看书。