数据结构实验报告九

合集下载

数据结构实验报告_实验报告_

数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。

数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。

本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。

2) 利用栈,实现任一个表达式中的语法检查(选做)。

3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。

数据结构实验报告

数据结构实验报告

数据结构实验报告
本次数据结构实验的任务主要包括两部分,分别是学习使用链表数据结构和掌握链表排序算法。

在此基础上,我们完成了一组关于链表基本操作和排序算法的实验。

实验一:链表基本操作
在这个实验中,我们学习了链表的插入、删除、查找等基本操作。

链表的插入和删除操作是通过一个链表节点来实现的。

链表节点包括一个数据域和一个指向下一个节点的指针域。

通过修改指针域,我们就可以实现节点的插入和删除操作。

具体来说,我们编写了一个基本的链表程序,其中包括链表头指针初始化、链表节点插入、链表节点删除、查找指定节点等操作。

通过对程序的调试和功能测试,我们验证了链表操作的正确性。

实验二:链表排序算法
在这个实验中,我们学习了链表排序算法,并编写了链表的快速排序和归并排序两种算法。

快速排序是一种分治思想的排序算法,通过选择一个基准元素,分别将小于和大于基准元素的元素分别放在它的左右两边,再递归地对左右两个子序列进行排序,最终得到有序序列。

归并排序是另一种经典的排序算法,它利用归并思想,将两个有序序列合并成一个更大的有序序列,这个过程不断重复,最终得到完整的有序序列。

通过实现这两种排序算法,并在大样本数据下进行测试,我们验证了算法的正确性和效率。

实验总结:
通过本次实验,我们深入学习了链表数据结构的相关基本操作和排序算法的实现原理。

同时,在实际编程实践中,我们也掌握了链表程序的调试、测试和优化技术。

这些都是我们今后从事软件开发工作需要掌握的重要技能,在这个方面的积累将会对我们有很大帮助。

《数据结构》实验报告

《数据结构》实验报告

《数据结构》实验报告实验一一、实验目的及要求理解线性表的顺序存储结构;熟练掌握顺序表结构及其有关算法的设计;理解线性表的链式存储结构;熟练掌握动态链表结构及其有关算法的设计;根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法;深入了解栈和队列的特性,以便在实际问题背景下灵活运用他们;同时巩固对这两种结构的构造方法的理解。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以顺序表作存储结构,实现线性表的插入、删除;2.以单链表作存储结构,实现有序表的合并;3.利用栈(以顺序栈作存储结构)实现进制转换,并用队列(以链队列作存储结构)计算并打印杨辉三角。

四、源程序清单五、实验结果六、总结实验二一、实验目的及要求掌握二叉树的动态存储结构--二叉链表,掌握二叉树的三种遍历方法,会运用三种遍历的方法求解有关问题。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以二叉链表作存储结构,建立一棵二叉树;2.输出其先序、中序、后序遍历序列;3.求出它的深度;4.统计其叶子结点数四、源程序清单五、实验结果六、总结实验三一、实验目的及要求掌握图的存储结构及其建立算法,熟练掌握图的两种遍历算法及其应用。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以邻接矩阵法作存储结构,建立一个无向图;2.输出该图的深度优先搜索序列;3.输出该图的广度优先搜索序列;4. 设计算法求出该图的连通分量个数及边的数目。

四、源程序清单五、实验结果六、总结实验四一、实验目的及要求掌握顺序表的查找方法,尤其是折半查找方法。

掌握二叉排序树的查找算法。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.建立一个顺序表,用顺序查找的方法对其实施查找;2.建立一个有序表,用折半查找的方法对其实施查找;3.建立一个二叉排序树,根据给定值对其实施查找;4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。

数据结构实验报告总结

数据结构实验报告总结

数据结构实验报告总结本次数据结构实验主要涉及到线性表、栈和队列的基本操作,通过实验操作和总结,我对数据结构的相关知识有了更深入的理解和掌握。

首先,我们进行了线性表的实验操作。

线性表是一种数据结构,它是由n(n≥0)个数据元素组成的有限序列。

在实验中,我们学习了线性表的顺序存储结构和链式存储结构。

通过代码实现,我深刻理解了顺序表和链表的存储方式和特点。

在实验过程中,我发现顺序表适合查找操作,而链表适合插入和删除操作。

这让我对线性表的应用场景有了更清晰的认识。

其次,我们进行了栈的实验操作。

栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。

在实验中,我学习了栈的基本操作,包括入栈和出栈。

通过实际操作,我深刻理解了栈的“先进后出”的特性,以及它在计算机程序设计中的应用。

我发现栈在递归算法、表达式求值和括号匹配等方面有着重要的作用,这让我对栈的实际应用有了更深入的认识。

最后,我们进行了队列的实验操作。

队列是一种特殊的线性表,它只能在表的一端进行插入操作,而在另一端进行删除操作。

在实验中,我学习了队列的基本操作,包括入队和出队。

通过实际操作,我深刻理解了队列的“先进先出”的特性,以及它在计算机程序设计中的重要性。

我发现队列在广度优先搜索、模拟系统等方面有着重要的应用,这让我对队列的实际应用有了更深入的了解。

通过本次数据结构实验,我不仅掌握了线性表、栈和队列的基本操作,还深刻理解了它们在实际应用中的重要性。

我相信这些知识和经验对我的学习和工作都将有着重要的帮助。

在未来的学习和实践中,我将继续加强对数据结构的理解和运用,不断提升自己的编程能力和解决问题的能力。

总之,本次数据结构实验让我受益匪浅,我将继续努力学习和实践,不断提升自己的专业能力。

希望通过不懈的努力,能够在数据结构领域取得更大的成就。

数据结构实验报告

数据结构实验报告

A
B
C D
E F
G
主程序模块
结点单元模块构建先序二叉树模块
二叉树遍历模块
main
CreatBTree Preorder Inorder Postorde
程序的功能设计、数据结构设计及整体结构
设计合理; 程序运行情况良好, 算法说明清 晰,理论分析与计算正确,实验数据无误 熟练使用开辟工具, 能够迅速准确的进行调
试、纠错和运行
良好的编程风格(缩进,注释,变量名、函
数名见名知意等,程序运行界面友好)
提交的电子文档及打印文档的书写、存放符
合规范化要求
能简明扼要地阐述设计的主要内容, 能准确
流利地回答各种问题
端正的学习态度及认真刻苦程度等
30
20
10
10
20
10。

数据结构实训实验报告

数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。

为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。

二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。

2. 熟练运用数据结构解决实际问题,提高算法设计能力。

3. 培养团队合作精神,提高实验报告撰写能力。

三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。

(2)实现线性表的插入、删除、查找等操作。

2. 栈与队列(1)实现栈的顺序存储和链式存储。

(2)实现栈的入栈、出栈、判断栈空等操作。

(3)实现队列的顺序存储和链式存储。

(4)实现队列的入队、出队、判断队空等操作。

3. 树与图(1)实现二叉树的顺序存储和链式存储。

(2)实现二叉树的遍历、查找、插入、删除等操作。

(3)实现图的邻接矩阵和邻接表存储。

(4)实现图的深度优先遍历和广度优先遍历。

4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。

(2)实现二分查找算法。

(3)设计并实现一个简单的学生成绩管理系统。

四、实验步骤1. 熟悉实验要求,明确实验目的和内容。

2. 编写代码实现实验内容,对每个数据结构进行测试。

3. 对实验结果进行分析,总结实验过程中的问题和经验。

4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。

五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。

(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。

2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。

(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。

3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。

数据结构实验报告

数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。

具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。

2、理解栈和队列的特性,并能够实现其基本操作。

3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。

4、学会使用图的数据结构,并实现图的遍历和相关算法。

二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。

三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。

实现顺序表的初始化、插入、删除和查找操作。

2、链表的实现定义链表的节点结构,包含数据域和指针域。

实现链表的创建、插入、删除和查找操作。

(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。

实现栈的入栈、出栈和栈顶元素获取操作。

2、队列的实现采用循环队列的方式实现队列的数据结构。

完成队列的入队、出队和队头队尾元素获取操作。

(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。

2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。

3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。

(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。

2、图的遍历实现深度优先遍历和广度优先遍历算法。

四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。

删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。

2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。

(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。

入栈和出栈操作的时间复杂度均为 O(1)。

2、队列队列的特点是先进先出,常用于排队、任务调度等场景。

数据结构的实训报告结果

数据结构的实训报告结果

一、实训目的本次数据结构实训旨在通过实践操作,加深对数据结构理论知识的理解,提高解决实际问题的能力。

通过实训,使学生能够熟练掌握各种基本数据结构及其操作方法,并能够将这些知识应用于解决实际问题。

二、实训环境1. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 20194. 实训教材:《数据结构》(C语言版)三、实训内容本次实训主要内容包括线性表、栈、队列、树、图等基本数据结构的创建、操作和应用。

1. 线性表(1)单链表的创建、插入、删除和查找操作(2)双向链表的创建、插入、删除和查找操作(3)循环链表的创建、插入、删除和查找操作2. 栈(1)栈的创建、入栈、出栈和判断栈空操作(2)应用栈实现括号匹配3. 队列(1)队列的创建、入队、出队和判断队列空操作(2)应用队列实现广度优先搜索4. 树(1)二叉树的创建、插入、删除和遍历操作(2)二叉查找树的创建、插入、删除和查找操作5. 图(1)图的创建、添加边、删除边和遍历操作(2)图的深度优先遍历和广度优先遍历四、实训过程1. 线性表首先,我们学习了单链表、双向链表和循环链表的基本概念和创建方法。

通过编写代码,实现了链表的插入、删除和查找操作。

在实训过程中,我们遇到了一些问题,如链表插入操作时指针的移动、删除操作时避免内存泄漏等。

通过查阅资料和与同学讨论,我们逐步解决了这些问题。

2. 栈接着,我们学习了栈的基本概念和操作方法。

通过编写代码,实现了栈的创建、入栈、出栈和判断栈空操作。

在实训过程中,我们遇到了栈空和栈满的情况,通过设置标志位和循环队列的方法解决了这些问题。

此外,我们还学习了应用栈实现括号匹配,加深了对栈的应用理解。

3. 队列然后,我们学习了队列的基本概念和操作方法。

通过编写代码,实现了队列的创建、入队、出队和判断队列空操作。

在实训过程中,我们遇到了队列空和队列满的情况,通过设置标志位和循环队列的方法解决了这些问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构实验报告
查找
1.实验目的
(1) 掌握顺序表的查找方法,尤其是二分查找方法。

(2) 掌握二叉排序树的建立及查找。

查找是软件设计中的最常用的运算,查找所涉及到的表结构的不同决定了查找的方法及其性能。

二分查找是顺序表的查找中的最重要的方法,应能充分理解其实现方法和有关性能,并能借助其判定树结构来加深理解。

二叉排序树结构在实验时具有一定的难度,可结合二叉树的有关内容和方法来实现。

2.实验内容和要求
编写算法实现下列问题的求解。

(1) 对下列数据表,分别采用二分查找算法实现查找,给出查找过程依次所比较的元素(的下标),并以二分查找的判定树来解释。

第一组测试数据:
数据表为(1,2,3,4,6,7,8,9,10,11,12,13,17,18,19,20,24,25,26,30,35,40,45,50,,100)
查找的元素分别为:2,8,20, 30,50,5,15,33,110
第二组数据:
数据表为(2,3,5,7,8,10,12,15,18,20,22,25,30,35,40,45,50,55,60, 80,100)
查找的元素分别为:22,8,80,3,100,1,13,120
(2) 设计出在二叉排序树中插入结点的算法,在此基础上实现构建二叉排序树的算法。

测试数据:构建二叉排序树的输入序列如下:
第一组数据:
100,150,120,50,70,60,80,170,180,160,110,30,40,35,175 第二组数据:
100,70,60,80,150,120,50,160,30,40,170,180,175,35
(3) 设计算法在二叉排序树中查找指定值的结点。

测试数据:在任务<1>中第一组测试数据所构造的二叉排序树中,分别查找下列元素:150,70,160,190,10,55,175
(4) 设计算法在二叉排序树中删除特定值的结点。

测试数据:在任务(1)中第一组测试数据所构造的二叉排序树中,分别删除下列元素:30,150,100
(5) 已知整型数组A[1..26]递增有序,设计算法以构造一棵平衡的二叉排序树来存放该数组中的所有元素。

测试数据:数组元素分别为:
第一组数据:
(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26)第二组数据:
(1,3,6,10,15,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231,253,277,30 2,328)
3.算法设计
4.二分查找算法书上已给出;
5.递归算法:树空时插入第一个结点为根结点,其后插入的结点与其比较之,
若比根结点小就插入左子树反之插入右子树。

6.树不空时递归查找左右子树,若查到则返回值,当遍历树后仍未查找到该值,
则返回查找失败。

7.先是查找到删除结点的位置,用指针记住其父结点位置。

删除结点分情况进
行:1、当前结点只有左子树时直接将父结点与当前结点孩子结点链接,删除当前结点,2、当前结点只有右子树时直接用右子树的根结点替换,3、当左右子树均存在时由当前结点的直接前驱替代。

8.对数组中的数据逐个读入,第一个为当前根结点,后面插入的比它大的为右
孩子,比它小的为左孩子,并设置标记,和记录对应高度,根据左右高度差,选择平衡操作。

9.运行和测试
10.总结和心得
查找所涉及的表的结构的不同决定了查找方法及其性能上的差异。

二分查找是顺序表的查找中最重要的方法。

通过这次实验,我掌握了顺序表的查找方法,尤其是二分查找方法。

相关文档
最新文档