数据结构实验报告范例
数据结构上机实验报告
实验报告
谭文治
电信0801
080900120
【实验一】线性表
【实验目的】:
1.掌握线性表的两类存储结构(顺序存储结构和链式存储结构)的描述方法。
2.掌握在顺序结构中实现查找、插入、删除操作的基本方法。
3.掌握在各种链表结构中实现查找、插入、删除操作的基本方法。
【实验内容】
【1】已知线性表LA的数据元素(n个,n为偶数),现要求将LA拆开成两个新的线性表LB,LC。要求LB中的数据元素为LA中的奇数位序的数据元素(a1, a3, …, an-1),LC中的数据元素为LA中的偶数位序的数据元素(a2, a4, …, an)。
for(i=0;i<v.length;i++)
scanf("%c",&v.list[i]); //对la进行赋值
}来自百度文库
void initlist(sqlist &v) //构造一个空的线性表
{v.elem=(char *)malloc(max*sizeof(char));
v.length=0;
}
void insert(sqlist &v,int j,char c)
void initlist(sqlist &);
void print(sqlist); //显示线性表中所有元素
数据结构图的实验报告
数据结构图的实验报告
数据结构图的实验报告
引言:
数据结构图是计算机科学中重要的概念之一。它是一种用图形表示数据元素之间关系的数据结构,广泛应用于算法设计、程序开发和系统优化等领域。本实验报告旨在介绍数据结构图的基本原理、实验过程和结果分析。
一、实验目的
本次实验的主要目的是掌握数据结构图的基本概念和操作方法,以及通过实验验证其在解决实际问题中的有效性。具体而言,我们将通过构建一个社交网络关系图,实现对用户关系的管理和分析。
二、实验方法
1. 确定数据结构
在本次实验中,我们选择了无向图作为数据结构图的基础。无向图由顶点集和边集组成,每条边连接两个顶点,且没有方向性。
2. 数据输入
为了模拟真实的社交网络,我们首先需要输入一组用户的基本信息,如姓名、年龄、性别等。然后,根据用户之间的关系建立边,表示用户之间的交流和联系。
3. 数据操作
基于构建好的数据结构图,我们可以进行多种操作,如添加用户、删除用户、查询用户关系等。这些操作将通过图的遍历、搜索和排序等算法实现。
三、实验过程
1. 数据输入
我们首先创建一个空的无向图,并通过用户输入的方式逐步添加用户和用户关系。例如,我们可以输入用户A和用户B的姓名、年龄和性别,并建立一条边
连接这两个用户。
2. 数据操作
在构建好数据结构图后,我们可以进行多种操作。例如,我们可以通过深度优
先搜索算法遍历整个图,查找与某个用户具有特定关系的用户。我们也可以通
过广度优先搜索算法计算某个用户的社交网络影响力,即与该用户直接或间接
相连的其他用户数量。
3. 结果分析
通过实验,我们可以观察到数据结构图在管理和分析用户关系方面的优势。它
《数据结构》线性结构实验报告
《数据结构》线性结构实验报告
2、源程序:
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 1024
typedef int elemtype;
typedef struct SequenStack
{
elemtype data[MAXSIZE];
int top;
}SequenStack;
SequenStack * Init_SequenStack()
{
SequenStack * S;
S = (SequenStack *)malloc(sizeof(SequenStack));
if (S == NULL)
return S;
S->top = -1;
return S;
}
int SequenStack_Empty(SequenStack * S)//判栈空
{
if (S->top == -1)
{
return 1;
}
{
int a;
printf("请以十进制输入一个数:\n");
scanf_s("%d", &a);
printf("转化为二进制为:");
Conversion(a);
printf("\n");
}
运行结果:
3、源程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char data;
struct node* next;
}LinkStack;
//初始化
LinkStack* Init_LinkStack()
数据结构实验报告
《数据结构》
实验报告
姓名:
学号:
班级:
学院:
实验一单链表实验
(一)实验目的
1.理解线性表的链式存储结构。
2.熟练掌握动态链表结构及有关算法的设计。
3.根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。
(二)实验任务
编写算法实现下列问题的求解
1.求链表中第i个结点的指针(函数),若不存在,则返回NULL。
2.在第i个结点前插入值为x的结点。
3.删除链表中第i个元素结点。
4.在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。
5.将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将
这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。
6.求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。
(三)主要仪器设备
PC机,Windows操作平台,Visual C++
(四)实验分析
顺序表操作:定义一个顺序表类,该类包括顺序表的存储空间、存储容量和长度,以及构造、插入、删除、遍历等操作的方法
(五)源程序
头文件文件名:linklist.h
#include
using namespace std;
struct node
{
int data;
node *next;
};
class list
{
public:
list();
int length()const
{
return count; //求链表长度
}
~list();
void create(); //链表构建,以0为结束标志
void output(); //链表输出
int get_element(const int i)const; //按序号取元素node *locate(const int x) const; //搜索对应元素int insert(const int i,const int x); //插入对应元素int delete_element(const int i); //删除对应元素node *get_head()
《数据结构》实验1实验报告
南京工程学院实验报告
<班级>_<学号>_<实验X>.RAR文件形式交付指导老师。
一、实验目的
1.熟悉上机环境,进一步掌握语言的结构特点。
2.掌握线性表的顺序存储结构的定义及实现。
3.掌握线性表的链式存储结构——单链表的定义及实现。
4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。
5.掌握线性表在链式存储结构——单链表中的各种基本操作。
二、实验内容
1.顺序线性表的建立、插入及删除。
2.链式线性表的建立、插入及删除。
三、实验步骤
1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。
2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。
3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。
四、程序主要语句及作用
程序1的主要代码(附简要注释)
public struct sequenlist
{
public const int MAXSIZE=1024; /*最大值为1024*/
public elemtype[] vec;
public int len; /* 顺序表的长度 */
public sequenlist( int n)
{
vec=new elemtype[MAXSIZE ];
len = n;
}
};
class Program
{
static void Main(string[] args)
{
sequenlist list1 = new sequenlist(5);
数据结构实验报告及心得体会
2011~2012第一学期数据结构实验报告
班级:信管一班
学号:201051018
姓名:史孟晨
实验报告题目及要求
一、实验题目
设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。
1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统),
输出实验结果。(15分)
2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学
生的学号、姓名和成绩。
3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。
二、实验要求
1.修改算法。将奇偶排序算法升序改为降序。(15分)
2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分))
3.编译、链接以上算法,按要求写出实验报告(25)。
4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。
5.用A4纸打印输出实验报告。
三、实验报告说明
实验数据可自定义,每种排序算法数据要求均不重复。
(1) 实验题目:《N门课程学生成绩名次排序算法实现》;
(2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性;
(3) 实验要求:对算法进行上机编译、链接、运行;
(4) 实验环境(Windows XP-sp3,Visual c++);
(5) 实验算法(给出四种排序算法修改后的全部清单);
(6) 实验结果(四种排序算法模拟运行后的实验结果);
(7) 实验体会(文字说明本实验成功或不足之处)。
三、实验源程序(算法)
Score.c
数据结构实验一 实验报告
班级:姓名:学号:
实验一线性表的基本操作
一、实验目的
1、掌握线性表的定义;
2、掌握线性表的基本操作;如建立、查找、插入和删除等..
二、实验内容
定义一个包含学生信息学号;姓名;成绩的顺序表和链表二选一;使其具有如下功能:
1 根据指定学生个数;逐个输入学生信息;
2 逐个显示学生表中所有学生的相关信息;
3 根据姓名进行查找;返回此学生的学号和成绩;
4 根据指定的位置可返回相应的学生信息学号;姓名;成绩;
5 给定一个学生信息;插入到表中指定的位置;
6 删除指定位置的学生记录;
7 统计表中学生个数..
三、实验环境
Visual C++
四、程序分析与实验结果
#include
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; // 定义函数返回值类型
typedef struct
{
char num10; // 学号
char name20; // 姓名
double grade; // 成绩
}student;
typedef student ElemType;
typedef struct LNode
{
ElemType data; // 数据域
struct LNode *next; //指针域
}LNode;*LinkList;
Status InitListLinkList &L // 构造空链表L {
L=struct LNode*mallocsizeofstruct LNode; L->next=NULL;
数据结构图实验报告
数据结构图实验报告
数据结构图实验报告
1. 引言
数据结构是计算机科学中的重要概念之一,它研究数据的组织、存储和管理方式。图作为一种重要的数据结构,广泛应用于各个领域,如网络拓扑、社交网
络分析等。本实验旨在通过实际操作,深入理解数据结构图的基本概念和操作。
2. 实验目的
本实验的主要目的是掌握图的基本概念和相关操作,包括图的创建、遍历、搜
索和最短路径算法等。
3. 实验环境
本实验使用C++语言进行编程,采用图的邻接矩阵表示法进行实现。
4. 实验内容
4.1 图的创建
在实验中,我们首先需要创建一个图。通过读取输入文件中的数据,我们可以
获得图的顶点数和边数,并根据这些信息创建一个空的图。
4.2 图的遍历
图的遍历是指从图的某个顶点出发,按照一定的规则依次访问图中的其他顶点。常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。我们可
以通过实验来比较这两种遍历算法的效率和应用场景。
4.3 图的搜索
图的搜索是指从图的某个顶点出发,找到与之相关的特定顶点或边。常用的图
的搜索算法有深度优先搜索和广度优先搜索。在实验中,我们可以通过输入特
定的顶点或边,来观察图的搜索算法的执行过程和结果。
4.4 图的最短路径算法
图的最短路径算法是指在图中找到两个顶点之间的最短路径。常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。通过实验,我们可以比较这两种算法的执行效率和应用场景。
5. 实验结果与分析
通过实验,我们可以得到以下结论:
- 图的邻接矩阵表示法在创建和操作图的过程中具有较高的效率。
- 深度优先搜索算法适用于查找图中的连通分量和回路等问题。
数据结构实验报告及心得体会
数据结构实验报告及心得体会
一、引言
数据结构是计算机科学中的重要基础课程,通过实验环节的学习,
我们能够更好地掌握和应用数据结构的概念、算法和操作。本报告旨
在总结和分享我们进行的数据结构实验,并提出相应的心得体会。
二、实验一:线性表的实现与应用
1. 实验目的
本实验旨在通过实现和应用线性表的基本操作,掌握线性表的存储
结构和算法。
2. 实验内容
我们选择了顺序表和链表两种线性表的实现方式,并实现了插入、
删除和查找等基本操作。通过实验,我们发现顺序表适用于元素个数
较少、频繁查找的情况,而链表适用于插入和删除操作较多、元素个
数不确定的情况。
3. 实验心得
通过实验一,我们深刻认识到数据结构的不同实现方式对算法的影响。选择合适的数据结构可以提高算法效率,提高程序的性能。同时,我们也意识到了在实际应用中,根据问题的具体特点选择不同的数据
结构才能得到最优解。
三、实验二:栈与队列的应用
本实验旨在通过实现和应用栈和队列的基本操作,掌握栈和队列的
特性及其在实际应用中的作用。
2. 实验内容
我们分别实现了顺序栈、链式栈、顺序队列和链式队列,并实现了
入栈、出栈、入队和出队等基本操作。我们发现栈适用于实现回溯算法、递归算法等,而队列适用于广度优先搜索、线程池等场景。
3. 实验心得
通过实验二,我们进一步理解了栈和队列在实际编程中的运用。它
们提供了方便的数据结构,帮助我们解决了许多实际问题。同时,实
验过程中,我们也发现了栈溢出的问题,意识到了合理管理栈空间的
重要性。
四、实验三:树与二叉树的实现与应用
1. 实验目的
本实验旨在通过实现和应用树和二叉树的基本操作,掌握树和二叉
数据结构上机实验报告
数据结构实验报告
课程数据结构 _ 院系
专业班级实验地点
姓名学号
实验时间指导老师
数据结构上机实验报告1
一﹑实验名称:
实验一——链表
二﹑实验目的:
1.了解线性表的逻辑结构特性;
2.熟悉链表的基本运算在顺序存储结构上的实现,熟练掌握链式存
储结构的描述方法;
3.掌握链表的基本操作(建表、插入、删除等)
4. 掌握循环链表的概念,加深对链表的本质的理解。
5.掌握运用上机调试链表的基本方法
三﹑实验内容:
(1)创建一个链表
(2)在链表中插入元素
(3)在链表中删除一个元素
(4)销毁链表
四﹑实验步骤与程序
#include
#include
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<<"请输入一个链表:"<
for(int i=0;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)
数据结构课程实验报告
数据结构课程实验报告
一、实验目的
本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基
本操作,包括线性结构、树形结构和图形结构。同时,也要求学生能
够熟练运用C++语言编写程序,并且能够正确地使用各种算法和数据结构解决具体问题。
二、实验内容
本次实验涉及到以下几个方面:
1. 线性表:设计一个线性表类,并且实现线性表中元素的插入、删除、查找等基本操作。
2. 栈和队列:设计一个栈类和队列类,并且分别利用这两种数据结构
解决具体问题。
3. 二叉树:设计一个二叉树类,并且实现二叉树的遍历(前序遍历、
中序遍历和后序遍历)。
4. 图论:设计一个图类,并且利用图论算法解决具体问题(如最短路径问题)。
三、实验过程
1. 线性表
首先,我们需要设计一个线性表类。在这个类中,我们需要定义一些成员变量(如线性表大小、元素类型等),并且定义一些成员函数(如插入元素函数、删除元素函数等)。在编写代码时,我们需要注意一些细节问题,如边界条件、异常处理等。
2. 栈和队列
接下来,我们需要设计一个栈类和队列类。在这两个类中,我们需要定义一些成员变量(如栈顶指针、队头指针等),并且定义一些成员函数(如入栈函数、出栈函数、入队函数、出队函数等)。在编写代码时,我们需要注意一些细节问题,如空间不足的情况、空栈或空队列的情况等。
3. 二叉树
然后,我们需要设计一个二叉树类,并且实现二叉树的遍历。在这个
类中,我们需要定义一个节点结构体,并且定义一些成员变量(如根
节点指针、节点数量等),并且定义一些成员函数(如插入节点函数、删除节点函数、遍历函数等)。在编写代码时,我们需要注意一些细
数据结构实验报告-树(二叉树)
实验5:树(二叉树)(采用二叉链表存储)
一、实验项目名称
二叉树及其应用
二、实验目的
熟悉二叉树的存储结构的特性以及二叉树的基本操作。
三、实验基本原理
之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。
四、主要仪器设备及耗材
Window 11、Dev-C++5.11
五、实验步骤
1.导入库和预定义
2.创建二叉树
3.前序遍历
4.中序遍历
5.后序遍历
6.总结点数
7.叶子节点数
8.树的深度
9.树根到叶子的最长路径
10.交换所有节点的左右子女
11.顺序存储
12.显示顺序存储
13.测试函数和主函数
对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。
实验完整代码:
#include <bits/stdc++.h>
using namespace std;
#define MAX_TREE_SIZE 100
typedef char ElemType;
ElemType SqBiTree[MAX_TREE_SIZE];
struct BiTNode
{
ElemType data;
BiTNode *l,*r;
}*T;
void createBiTree(BiTNode *&T)
数据结构课程实验报告
数据结构课程实验报告
数据结构课程实验报告
引言:
数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和
管理方法。在数据结构课程中,我们学习了各种数据结构的原理和应用,并通
过实验来加深对这些概念的理解。本文将对我在数据结构课程中的实验进行总
结和分析。
实验一:线性表的实现与应用
在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺
序存储和链式存储两种方式。通过实验,我深刻理解了线性表的插入、删除和
查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。实验二:栈和队列的实现与应用
栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。
在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。同时,
我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转
后缀表达式等。
实验三:树的实现与应用
树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。在这个
实验中,我们学习了二叉树和二叉搜索树的实现和应用。通过实验,我掌握了
二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树
实现排序算法。
实验四:图的实现与应用
图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。
实验五:排序算法的实现与比较
数据结构回文序列判断实验报告
数据结构回文序列判断实验报告
1.实验目的
本实验旨在通过使用数据结构中的栈来判断一个给定的序列是否为回
文序列。
2.实验原理
回文序列是指正读和反读都相同的序列。在本实验中,我们使用栈来
实现回文序列的判断。具体原理如下:
-将给定的序列逐个字符入栈,直到遇到序列结束符(如空格或结束
符号)。
-之后,将栈中的字符逐个出栈,并与序列的对应字符比较。
-如果出栈的字符与序列的对应字符不相同,则该序列不是回文序列;如果全部对应字符相同,则该序列是回文序列。
-需要注意的是,如果序列为奇数个字符,那么中间的字符可以不进
行比较。
3.实验步骤
本实验的具体步骤如下:
1)初始化一个空栈。
2)读入一个字符,并将其入栈,直到遇到序列结束符。
3)读入序列的每一个字符,并将其与栈顶字符进行比较。
4)如果比较结果不相同,则该序列不是回文序列;如果比较结果相同,则继续比较下一个字符。
5)如果栈为空且所有字符都比较完毕,则该序列是回文序列;否则,
该序列不是回文序列。
4.实验结果
本实验使用了多组样例数据进行测试,以下是部分实验结果:
- 输入序列:"aba",输出:是回文序列。
- 输入序列:"abcba",输出:是回文序列。
- 输入序列:"abcca",输出:不是回文序列。
- 输入序列:"abcdcba",输出:是回文序列。
5.实验分析
通过对实验结果的分析,可以得出以下结论:
-本实验的算法能够正确判断给定序列是否为回文序列。
-由于使用了栈来辅助判断,算法的时间复杂度为O(n),其中n为序
列的长度。
6.实验总结
本实验通过使用数据结构中的栈,成功判断了一个给定序列是否为回
数据结构实验报告_9
本科生实验报告
(二)
姓名:
学院:
专业:
班级:
实验课程名称: 数据结构
实验日期: 2013年 5月 25 日
指导教师及职称:
实验成绩:
开课时间:2012~2013 学年第二学期
k++;
a[j][n-i-1]=k;
}
for (j=n-i-2;j>=i;j--)
{
k++;
a[n-i-1][j]=k;
}
for (j=n-i-2;j>=i+1;j--)
{
k++;
[j][i]=k;
}
}
}
void main()
{
int n,i,j;
int a[MaxLen][MaxLen];
printf("输入n(n<10):");
scanf("%d",&n);
fun(a,n);
printf("%d阶数字方阵如下:\n",n);
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
运行结果:
6.2:如果矩阵A中存在这样的一个元素A[i][j]满足条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称为该矩阵的一个马鞍点。设计一个程序exp6-2.cpp 计算出m*n的矩阵A的所有马鞍点。
主程序如下:
6.3:已知A和B为两个n*n阶的对称矩阵,输入时,对称矩阵只输入下三角形元素,存入一维数组,如图6.5所示(对称矩阵M存储在一维数组A中),设计一个程序exp6-3.cpp 实习如下功能:
(1)求对称矩阵A和B的和。
(2)求对称矩阵A和B的乘积。
A:
图6.5 对称矩阵的存储转换形式主程序如下:
数据结构课程实验报告
数据结构课程实验报告
目录
1. 实验简介
1.1 实验背景
1.2 实验目的
1.3 实验内容
2. 实验方法
2.1 数据结构选择
2.2 算法设计
2.3 程序实现
3. 实验结果分析
3.1 数据结构性能分析
3.2 算法效率比较
3.3 实验结论
4. 实验总结
1. 实验简介
1.1 实验背景
本实验是数据结构课程的一次实践性操作,旨在帮助学生加深对数据结构的理解和运用。
1.2 实验目的
通过本实验,学生将学会如何选择合适的数据结构来解决特定问题,了解数据结构与算法设计的关系并能将其应用到实际问题中。
1.3 实验内容
本实验将涉及对一些经典数据结构的使用,如链表、栈、队列等,并结合具体问题进行算法设计和实现。
2. 实验方法
2.1 数据结构选择
在实验过程中,需要根据具体问题选择合适的数据结构,比如针对需
要频繁插入删除操作的情况可选择链表。
2.2 算法设计
针对每个问题,需要设计相应的算法来实现功能,要考虑算法的效率
和实际应用情况。
2.3 程序实现
根据算法设计,编写相应的程序来实现功能,并进行调试测试确保程
序能够正确运行。
3. 实验结果分析
3.1 数据结构性能分析
在实验过程中,可以通过对不同数据结构的使用进行性能分析,如时
间复杂度和空间复杂度等,以便选择最优的数据结构。
3.2 算法效率比较
实验完成后,可以对不同算法在同一数据结构下的效率进行比较分析,找出最优算法。
3.3 实验结论
根据实验结果分析,得出结论并总结经验教训,为后续的数据结构和
算法设计提供参考。
4. 实验总结
通过本次实验,学生将对数据结构与算法设计有更深入的了解,并能
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构与算法》实验报告
专业班级姓名学号
实验项目
实验一二叉树的应用
实验目的
1、进一步掌握指针变量的含义及应用。
2、掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3、掌握用指针类型描述、访问和处理二叉树的运算。
实验内容
题目1:编写一个程序,采用一棵二叉树表示一个家谱关系。要求程序具有如下功能:(1)用括号表示法输出家谱二叉树,
(2)查找某人的所有儿子,
(3)查找某人的所有祖先。
算法设计分析
(一)数据结构的定义
为了能够用二叉树表示配偶、子女、兄弟三种关系,特采用以下存储关系,则能在二叉树上实现家谱的各项运算。
二叉树型存储结构定义为:
typedef struct SNODE
{char name[MAX]; //人名
struct SNODE *left; //指向配偶结点
struct SNODE *right; //指向兄弟或子女结点
}FNODE;
(二)总体设计
实验由主函数、家谱建立函数、家谱输出函数、儿子查找函数、祖先查找函数、结点定位函数、选择界面函数七个函数共同组成。其功能描述如下:
(1)主函数:统筹调用各个函数以实现相应功能
void main()
(2)家谱建立函数:与用户交互建立家族成员对应关系
void InitialFamily(FNODE *&head) //家谱建立函数
(3)家谱输出函数:用括号表示法输出家谱
输出形式为:父和母(子1和子妻1(孙1),子2和子妻2(孙2))
void PrintFamily(FNODE *head) //家谱输出函数
(4)儿子查找函数:在家谱中查找到某人所有的子女并输出,同时也能辨别出其是否为家族成员与是否有子女
void FindSon(FNODE *b,char p[]) //儿子查找函数
(5)祖先查找函数:在家谱中查找到某人所有的祖先并输出,同时也能辨别出其是否为家族中成员。
int FindAncestor(FNODE *head,char son[ ]) //祖先查找函数
(6)结点定位函数:在家谱中找到用户输入人名所对应的结点。
FNODE *findnode(FNODE *b,char p[]) //结点定位函数
(7)选择界面函数:为便于编写程序,将用户选择部分独立为此函数。
void PRINT(int &n)
(三)各函数的详细设计:
void InitialFamily(FNODE *&head) //家谱建立函数
1:首先建立当前人的信息,将其左右结点置为空,
2:然后让用户确定其是否有配偶,如果没有配偶,则当前程序结束,
3:如果有则建立其配偶信息,并将配偶结点赋给当前人的左结点;
4:再让用户确定其是否有子女,如果有则递归调用家谱建立函数建立子女结点,并将其赋给配偶结点的下一个右结点。
5:如无,则程序结束
void PrintFamily(FNODE *head) //家谱输出函数
1:首先判断当前结点是否为空,如果为空则结束程序;
2:如果不为空,则输出当前结点信息,
3:然后判断其左结点(配偶结点)是否为空,如不为空则输出“和配偶信息。
4:再判断配偶结点的右结点是否为空,如不为空则递归调用输出其子女信息,最后输出“)”;
5:当配偶结点为空时,则判断其右结点(兄弟结点)是否为空
6:如果不为空,则输出“,”,并递归调用输出兄弟信息
7程序结束
FNODE *findnode(FNODE *b,char p[]) //结点定位函数
1:当前结点是否为空,为空则返回空;
2:如果和查找信息相同,则返回当前结点;
3:如不然,则先后递归访问其左结点,再不是则递归访问右结点
void FindSon(FNODE *b,char p[]) //儿子查找函数
1:在家谱中定位到要查找的结点,如无则输出“查找不到此人”
2:判断其配偶结点与子女结点是否为空,为空则输出“无子女”
3:不为空则输出其配偶结点的所有右结点(子女结点)。
int FindAncestor(FNODE *head,char son[ ]) //祖先查找函数
1:先在家谱中定位到要查找的结点,如为空输出“不存在此人”,程序结束
2:先将父母结点入栈,当栈为空时程序结束,
3:栈不为空时,判断栈顶元素是否已访问过,
4:访问过,再判断是否为查找结点,如是则输出栈中保存的其祖先结点,并滤过其兄弟结点不输出;不是查找结点,则退栈一个元素
5:未访问过,则取当前栈顶元素,置访问标志——1,同时取其右结点
6:栈不为空或当前所取结点不为空时,转到2;
实验测试结果及结果分析
(一)测试结果
(二)结果分析(略)
实验总结
(略)
附录实验程序代码(该部分请加注释)
/*程序定义部分:*/
#include
#include
#include
#define MAX 20
typedef struct SNODE
{
char name[MAX]; //人名
struct SNODE *left; //指向配偶结点
struct SNODE *right; //指向兄弟或子女结点
}FNODE;
/*家谱建立函数*/
void InitialFamily(FNODE *&head)
{
FNODE *s,*r,*q;
int tag;
q=(FNODE *)malloc(sizeof(FNODE));
q=NULL;
s=(FNODE *)malloc(sizeof(FNODE));
printf("输入姓名:\n");
scanf("%s",,s->name);
s->left=s->right=NULL;
head=r=s;
printf("%s是否有配偶?有1,无0\n",head->name); //建立配偶结点
scanf("%d",&tag);
if(tag)
{
s=(FNODE *)malloc(sizeof(FNODE));
printf("输入其配偶姓名:\n");
scanf("%s",s->name);
s->left=s->right=NULL;
r->left=s;
r=s;
do{ //递归调用建立孩子结点printf("%s是否还有子女?有1,无0\n",head->name);
scanf("%d",&tag);
if(tag)
{
InitialFamily(q);