数据结构实验报告格式

2023-02-21

随着国民文化水平的提升,报告在工作与学习方面,已经成为了常见记录方式。报告是有着写作格式与技巧的,写出有效的报告十分重要。下面是小编为大家整理的《数据结构实验报告格式》,希望对大家有所帮助。

第一篇:数据结构实验报告格式

数据结构实验报告

注意:实验结束后提交一份实验报告电子文档

电子文档命名为“学号+姓名”,如: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);

//删除所有结点,释放内存 }

实验结果:

心得体会:

通过本次实验,我了解了线性表的逻辑结构和链式结构,从中也发现自己在一些知识上掌握的不是很牢固,自己下来要多看书。

上一篇:数据结构实习报告模板下一篇:暑假里最难忘的事作文