数据结构与算法的实验报告
数据结构与算法实验报告

数据结构与算法实验报告一、实验目的1.学习并掌握线性表的链式存储结构和链表的基本操作;2.掌握链表的插入、删除、查找等基本操作算法的实现;3.了解链表的应用场景。
二、实验内容与过程本次实验主要包括以下实验内容:1.链表的定义与建立;2.链表的插入操作;3.链表的删除操作;4.链表的查找操作;5.链表的遍历操作;6.链表的逆序操作;7.链表的合并操作。
实验过程如下:1.链表的定义与建立首先,我们定义一个链表的结构,其中包括节点的定义,节点的数据域和指针域。
节点的数据域存放具体的数据,指针域用于指向下一个节点。
```typedef struct Nodeint data;struct Node* next;} Node;```然后,我们定义链表的头指针,并初始化为空链表。
```Node* head = NULL;```2.链表的插入操作插入操作是指在链表中间或末尾插入一个新节点。
首先,我们创建一个新节点,并为其分配内存空间。
```Node* newNode = (struct Node*) malloc(sizeof(Node));newNode->data = 10;newNode->next = NULL;```然后,我们遍历链表,找到插入位置。
```Node* current = head;while (current->next != NULL)current = current->next;```最后,我们将新节点插入到链表中。
```current->next = newNode;```3.链表的删除操作删除操作是指删除链表中的一些节点。
首先,我们找到要删除的节点的前一个节点。
```Node* current = head;while (current->next != NULL && current->next->data != data) current = current->next;```然后,我们将要删除的节点的指针域赋值给前一个节点的指针域。
数据结构与算法分析实验报告

数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
数据结构与算法实验报告5-查找与排序

北京物资学院信息学院实验报告
课程名_数据结构与算法
实验名称查找与排序
实验日期年月日实验报告日期年月日姓名______ ___ 班级_____ ________ 学号___
一、实验目的
1.掌握线性表查找的方法;
2.了解树表查找思想;
3.掌握散列表查找的方法.
4.掌握插入排序、交换排序和选择排序的思想和方法;
二、实验内容
查找部分
1.实现顺序查找的两个算法(P307), 可以完成对顺序表的查找操作, 并根据查到和未查到两种情况输出结果;
2.实现对有序表的二分查找;
3.实现散列查找算法(链接法),应能够解决冲突;
排序部分
4.分别实现直接插入排序、直接选择排序、冒泡排序和快速排序算法
三、实验地点与环境
3.1 实验地点
3.2实验环境
(操作系统、C语言环境)
四、实验步骤
(描述实验步骤及中间的结果或现象。
在实验中做了什么事情, 怎么做的, 发生的现象和中间结果, 给出关键函数和主函数中的关键段落)
五、实验结果
六、总结
(说明实验过程中遇到的问题及解决办法;个人的收获;未解决的问题等)。
数据结构与算法实验报告

竭诚为您提供优质文档/双击可除数据结构与算法实验报告篇一:数据结构与算法实验报告-图沈阳工程学院学生实验报告(课程名称:数据结构与算法)实验题目:班级网络本112学号27姓名郑乐乐地点F606指导教师吕海华祝世东实验日期:20XX年11月13日1234篇二:《数据结构与算法》实验报告模板软件工程系实验报告封面课程名称:数据结构与算法课程代码:ss1005实验指导老师:钟迅科实验报告名称:本实验报告包括以下几个内容:一、实验(实践)目的二、实验(实践)环境三、实验(实践)实现过程四、实验(实践)分析与总结五、指导教师评语与评分我申明,本报告内的实验已按要求完成,报告完全是由我个人完成,并没有抄袭行为。
我已经保留了这份实验报告的副本。
申明人(签名):学生姓名:张三学号:1140888888教学班:FJ01递交日期:20XX年10月11日篇三:数据结构与算法实验报告c++版算法与数据结构实验报告实验一:栈与队列一、实验目的1、掌握栈和队列特点、逻辑结构和存储结构2、熟悉对栈和队列的一些基本操作和具体的函数定义。
3、利用栈和队列的基本操作完成一定功能的程序。
二、实验任务1.出顺序栈的类定义和函数实现,利用栈的基本操作完成十进制数n与其它d进制数的转换。
(如n=1357,d=8)2.给出顺序队列的类定义和函数实现,并利用队列计算并打印杨辉三角的前n行的内容。
(n=8)3.给出链栈的类定义和函数实现,并设计程序完成如下功能:读入一个有限大小的整数n,并读入n个数,然后按照与输入次序相反的次序输出各元素的值。
三、实验原理1、将十进制数n转化为d进制时,用除去余数法,用d 除n所得余数作为d进制当前个位,将相除所得的商的整数部分作为新的n值重复上述计算,直到n为0为止。
将前所得到的各余数反过来连接便得到最终结果。
将每次求出的余数入栈,求解结束后,再依次出栈。
2、在杨辉三角中可用上一行的数来求出对应位置的下一行的内容。
数据结构与算法实验报告

数据结构与算法实验报告数据结构与算法实验报告一、引言1.1 背景介绍:介绍数据结构与算法在现代科技领域中的重要性和应用。
1.2 实验目的:明确本实验的目标和需要解决的问题。
1.3 实验内容:详细描述本次实验所使用的数据结构和算法。
1.4 实验方法:阐述实验过程中所采用的步骤和方法。
1.5 实验环境:列出本次实验所使用的硬件和软件环境要求。
二、需求分析2.1 功能需求:详细描述实验所要求实现的功能和效果。
2.2 性能需求:阐述实验对资源利用率和运行效率的要求。
2.3 输入输出需求:明确实验所需输入和期望输出的格式和要求。
三、设计与实现3.1 数据结构设计:给出实验所需的数据结构定义和描述。
3.1.1 数据结构一:介绍数据结构一的定义和特点。
3.1.2 数据结构二:介绍数据结构二的定义和特点。
3.2 算法设计:描述实验所需的算法思路和流程。
3.2.1 算法一:阐述算法一的实现原理和步骤。
3.2.2 算法二:阐述算法二的实现原理和步骤。
3.3 实现过程:详细描述根据设计完成的实现过程。
3.3.1 步骤一:列出实现过程中的第一步骤。
3.3.2 步骤二:列出实现过程中的第二步骤。
3.4 算法优化:对实现过程中的算法进行优化和改进。
3.4.1 优化一:介绍所进行的优化操作和效果。
3.4.2 优化二:介绍所进行的优化操作和效果。
四、实验结果与分析4.1 实验数据:给出实验过程中所使用的测试数据。
4.2 实验结果:列出实验运行的结果和输出。
4.3 结果分析:对实验结果进行详细分析和解释。
五、实验总结5.1 实验心得:总结实验过程中所学到的知识和经验。
5.2 实验收获:列出实验中获得的成果和收获。
六、附件本文档涉及的附件包括但不限于:源代码、输入输出样例、实验数据等。
七、注释本文档中涉及的法律名词及其注释如下:- 法律名词一:注释一。
- 法律名词二:注释二。
数据结构与算法实验报告(线性表)

一、实验目的1、深刻理解线性结构的特点以及线性表的概念。
2、熟练掌握线性表的顺序存储结构、链式存储结构及基本运算算法的实现,特别是查找、插入和删除等算法。
二、实验环境1) 硬件:每个学生需配备计算机一台,操作系统:Windows2000/XP。
2) 软件:visual c++6.0。
三、实验题目和实验内容实验题目:线性表的顺序、链式表示及其应用实验内容:1、基本题:实验2.1、实验2.2、实验2. 4、实验2.72、附加题:实验2.3、实验2.6(没做)四、实验数据和实验结果2.1a,b,c,d,e2.2a,b,c,d,e22.4a,b,c,d,e2.7第一个多项式:2x+6x^2-4x^3+3x^4 第二个多项式1x-3x^2+6x^3-3x^4五、附录(程序代码)2.1#include<iostream.h>#include<malloc.h>#define MaxSize 50typedef struct{char data[MaxSize];int length;}SqList;void CreateList(SqList *&L,char a[],int n) {int i;L=(SqList *)malloc(sizeof(SqList));for(i=0;i<n;i++)L->data[i]=a[i];L->length=n;}void InitList(SqList *&L){L=(SqList *)malloc(sizeof(SqList));L->length=0;}void DestroyList(SqList *&L){free(L);}int ListEmpty(SqList *L){return (L->length==0);}int ListLength(SqList *L){return (L->length);}void DispList(SqList *L){int i;for(i=0;i<L->length;i++)cout<<L->data[i];cout<<endl;}char GetElem(SqList *L,int i,char &e){if(i<1||i>L->length)return 0;e=L->data[i-1];return e;}第3 页共15 页int LocateElem(SqList *L,char e){int i=0;while(i<L->length&&L->data[i]!=e) i++;if(i>=L->length)return 0;elsereturn i+1;}int ListInsert(SqList*&L,int i,char e) {int j;if(i<1||i>L->length+1)return 0;i--;for(j=L->length;j>i;j--)L->data[j]=L->data[j-1];L->data[i]=e;L->length++;return 1;}int ListDelete(SqList *&L,int i,char &e) {int j;if(i<1||i>L->length)return 0;i--;e=L->data[i];for(j=i;j<L->length-1;j++)L->length--;return 1;}void main (){SqList *p;char b[10],e;int k;cout<<"元素个数:";cin>>k;cout<<"输入元素:";for(int m=0;m<k;m++)cin>>b[m];InitList(p);4CreateList(p,b,k);cout<<"输出顺序表:";DispList(p);cout<<"顺序表长度是:"<<ListLength(p)<<endl;if(ListEmpty(p))cout<<"顺序表为空"<<endl;elsecout<<"顺序表不为空"<<endl;cout<<"顺序表第3位元素是:"<<GetElem(p,3,e)<<endl;cout<<"元素a的位置是:第"<<LocateElem(p,'a')<<"位"<<endl;ListInsert(p,4,'f');cout<<"在第4个元素上插入元素f:";DispList(p);cout<<"删除顺序表第3个元素:";ListDelete(p,3,e);DispList(p);DestroyList(p);}2.2#include<iostream.h>#include<malloc.h>typedef struct LNode{char data;struct LNode *next;}LinkList;void CreateListR(LinkList *&L,char a[],int n){LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList));r=L;for(i=0;i<n;i++){s=(LinkList *)malloc(sizeof(LinkList));s->data=a[i];r->next=s;r=s;}r->next=NULL;}第5 页共15 页void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;}void DestroyList(LinkList *&L){LinkList *pre=L,*p=pre->next;while(p){free(pre);pre=p;p=pre->next;}free(pre);}int ListEmpty(LinkList *L){return(L->next==NULL);}int ListLength(LinkList *L){int n=0;LinkList *p=L;while(p->next){n++;p=p->next;}return(n);}void DispList(LinkList *L){LinkList *p=L->next;while(p){cout<<p->data;p=p->next;}cout<<endl;}char GetElem(LinkList *L,int i,char &e) {int j=0;6LinkList *p=L;while(j<i&&p!=NULL){j++;p=p->next;}if(!p)return 0;else{e=p->data;return e;}}int LocateElem(LinkList *L,char e){int i=1;LinkList *p=L->next;while(p&&p->data!=e){p=p->next;i++;}if(!p)return(0);elsereturn(i);}int ListInsert(LinkList *&L,int i,char e){int j=0;LinkList *p=L,*s;while(j<i-1&&p){j++;p=p->next;}if(!p)return 0;else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;第7 页共15 页p->next=s;return 1;}}int ListDelete(LinkList *&L,int i,char &e){int j=0;LinkList *p=L,*q;while(j<i-1&&p){j++;p=p->next;}if(!p)return 0;else{q=p->next;if(!q)return 0;e=q->data;p->next=q->next;free(q);return 1;}}void main(){LinkList *h;char b[10],e;int k;cout<<"元素个数:";cin>>k;cout<<"输入元素:";for(int m=0;m<k;m++)cin>>b[m];InitList(h);CreateListR(h,b,k);cout<<"输出单链表:";DispList(h);cout<<"单链表长度是:"<<ListLength(h)<<endl;if(ListEmpty(h))cout<<"单链表为空"<<endl;else8cout<<"单链表不为空"<<endl;cout<<"单链表第3位元素是:"<<GetElem(h,3,e)<<endl;cout<<"元素a的位置是:第"<<LocateElem(h,'a')<<"位"<<endl;ListInsert(h,4,'f');cout<<"在第4个元素上插入元素f:";DispList(h);cout<<"删除单链表第3个元素:";ListDelete(h,3,e);DispList(h);DestroyList(h);}2.4#include<iostream.h>#include<malloc.h>typedef struct LNode{char data;struct LNode *next;}LinkList;void CreateListR(LinkList *&L,char a[],int n){LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList));r=L;for(i=0;i<n;i++){s=(LinkList *)malloc(sizeof(LinkList));s->data=a[i];r->next=s;r=s;}r->next=L;}void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;}void DestroyList(LinkList *&L){第9 页共15 页LinkList *pre=L->next,*p=pre->next;L->next=NULL;while(p){free(pre);pre=p;p=pre->next;}free(pre);}int ListEmpty(LinkList *L){return(L->next==NULL);}int ListLength(LinkList *L){int n=0;LinkList *p=L;while(p->next!=L&&p->next){n++;p=p->next;}return(n);}void DispList(LinkList *L){LinkList *p=L->next;while(p!=L&&p){cout<<p->data;p=p->next;}cout<<endl;}char GetElem(LinkList *L,int i,char &e) {int j=1;LinkList *p=L->next;while(j<i&&p!=L&&p){j++;p=p->next;}10return 0;else{e=p->data;return e;}}int LocateElem(LinkList *L,char e){int i=1;LinkList *p=L->next;while(p!=L&&p->data!=e&&p){p=p->next;i++;}if(!p)return(0);elsereturn(i);}int ListInsert(LinkList *&L,int i,char e){int j=1;LinkList *p=L->next,*s;while(j<i-1&&p&&p!=L){j++;p=p->next;}if(!p)return 0;else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}int ListDelete(LinkList *&L,int i,char &e) {第11 页共15 页LinkList *p=L->next,*q;while(j<i-1&&p&&p!=L){j++;p=p->next;}if(!p)return 0;else{q=p->next;if(!q||q==L->next)return 0;e=q->data;p->next=q->next;free(q);return 1;}}void main(){LinkList *h;char b[10],e;int k;cout<<"元素个数:";cin>>k;cout<<"输入元素:";for(int m=0;m<k;m++)cin>>b[m];InitList(h);CreateListR(h,b,k);cout<<"输出循环单链表:";DispList(h);cout<<"循环单链表长度是:"<<ListLength(h)<<endl;if(ListEmpty(h))cout<<"循环单链表为空"<<endl;elsecout<<"循环单链表不为空"<<endl;cout<<"循环单链表第3位元素是:"<<GetElem(h,3,e)<<endl;cout<<"元素a的位置是:第"<<LocateElem(h,'a')<<"位"<<endl;ListInsert(h,4,'f');cout<<"在第4个元素上插入元素f:";DispList(h);12cout<<"删除循环单链表第3个元素:";ListDelete(h,3,e);DispList(h);DestroyList(h);}2.7#include<iostream.h>#include<malloc.h>typedef struct polynomial{int coef; //系数int index; //指数struct polynomial *next;}LinkList;void CreateList(LinkList *&L, int n){LinkList *s,*r;int i;L=(LinkList *)malloc(sizeof(LinkList));r=L;for(i=0;i<n;i++){s=(LinkList*)malloc(sizeof(LinkList));cout<<"依次输入多项式系数和指数:";cin>>s->coef>>s->index;s->next = NULL;r->next=s;r=s;}}void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;}void AddList(LinkList *&list1,LinkList *&list2,int m,int n) {LinkList *s,*r,*t;int i;s=list1->next;r=list2->next;t=list1;第13 页共15 页for(i=0;i<n;i++){if(s==NULL){s=list1->next;t=list1;}while(s!=NULL){if(s->index!=r->index){s=s->next;t=t->next;}else break;}if(!s){s=(LinkList*)malloc(sizeof(LinkList));s->coef=r->coef;s->index=r->index;s->next=NULL;t->next=s;s=s->next;r=r->next;continue;}else{if(s->index==r->index)s->coef=s->coef+r->coef;if(s->coef==0){LinkList *temp1;temp1=s;s=s->next;t->next=s;delete temp1;}}r=r->next;s=NULL;}cout<<"多项式相加的结果是:";14list1=list1->next;while(list1){cout<<list1->coef<<"x^"<<list1->index;if(list1->next!=NULL)cout<<"+";list1=list1->next;}}void DispList(LinkList *L){L=L->next;while(L){cout<<L->coef<<"x^"<<L->index;if(L->next!=NULL)if(L->next->coef>0)cout<<"+";L=L->next;}}void main(){LinkList *list1,*list2;InitList(list1);InitList(list2);int m,n;cout<<"请输入第一个多项式的项数:";cin>>m;CreateList(list1,m);cout<<"多项式表示是:";DispList(list1);cout<<endl;cout<<"请输入第二个多项式的项数:";cin>>n;CreateList(list2,n);cout<<"多项式表示是:";DispList(list2);cout<<endl;AddList(list1,list2,m,n);cout<<endl;}第15 页共15 页。
数据结构与算法实验报告

数据结构与算法实验报告实验目的:1.加深对链表的理解,掌握链表的基本操作;2.掌握递归算法的设计思想及应用。
实验内容:本次实验主要包括两个部分的实现与测试,分别为链表的基本操作及递归算法的应用。
一、链表的基本操作1.链表的创建链表的创建主要包括新建链表头结点和逐个插入新结点两个步骤。
首先通过malloc函数新建一个链表头结点,并使链表头结点的指针域为空。
然后通过循环输入新节点的数据值,并将新节点插入到链表的尾部。
2.链表的插入链表的插入操作主要包括在链表头部插入新节点、在链表尾部插入新节点和在链表中间插入新节点。
在插入链表头部时,首先通过malloc函数生成新节点,并将链表头节点指针域的原指向设置为新节点;在插入链表尾部时,首先通过循环找到链表的尾节点,并生成新节点,将尾节点指针域的原指向设置为新节点;在插入链表中间时,首先通过循环找到要插入的位置节点,然后生成新节点,并将新节点指针域的原指向设置为下一个节点,将前一个节点的指针域设置为新节点。
3.链表的删除链表的删除操作主要包括删除头节点、删除尾节点和删除中间节点。
在删除头节点时,首先通过free函数释放头节点的内存空间,然后将链表的头节点指针指向第二个节点;在删除尾节点时,首先通过循环找到倒数第二个节点,并将倒数第二个节点的指针域置空,最后通过free函数释放尾节点的内存空间;在删除中间节点时,首先通过循环找到要删除的节点的前一个节点,然后将前一个节点的指针域指向要删除节点的下一个节点,最后通过free函数释放要删除节点的内存空间。
4.链表的查询链表的查询操作主要包括按位置查询和按值查询。
在按位置查询时,通过循环找到指定位置的节点,然后返回节点的数据值;在按值查询时,通过循环比较节点的数据值与指定值,找到匹配的节点,并返回该节点的位置。
二、递归算法的应用递归算法是一种函数自己调用自己的算法设计思想,具有简洁、清晰的特点。
本次实验主要应用递归算法解决实际问题,包括斐波那契数列的求解和二叉树的遍历。
数据结构与算法实验报告(一)

数据结构与算法实验报告(二)实验人: 学号: 时间:2013.4.23实验名称:迷宫问题实验原理:利用一个二维数组maze[i][j]表示迷宫,其中,. 数组元素值为1,表示该位置是墙壁,不能通行;元素值为0,表示该位置是通路。
假定从maze[1][1]出发,出口位于maze[m] [n]。
移动方向可以是8个方向(东,东南,南,西南,西,西北,北和东北)。
实验过程记录:(1)//比较A, B是否是同一点if (A.x==B.x&&A.y==B.y){return 1;}else{return 0;}(2) case 2:B.x=A.x+1;B.y=A.y+1;break;case 3:B.x=A.x;B.y=A.y+1;break;case 4:B.x=A.x-1;B.y=A.y+1;break;case 5:B.x=A.x-1;B.y=A.y;break;case 6:B.x=A.x-1;B.y=A.y-1;break;case 7:B.x=A.x;B.y=A.y-1;break;case 8:B.x=A.x+1;B.y=A.y-1;break;(3) maze[curpos.x][curpos.y]=8; //写一个函数留下足迹,将maze[curpos.x] [curpos.y] == 0改为不等于0,1的数字(4)maze[(e.seat).x][(e.seat).y] =3; //留下不能通过的记号,将maze[(e.seat). x][(e.seat).y] == 0改为未用过的数字实验过程中的问题:实验结果报告与实验总结:迷宫是:(1 表示障碍,0表示可以通过)1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 11 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 11 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 11 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 11 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 11 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 11 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 11 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 11 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 11 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 11 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 11 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1一条通路的二元组数据序列:->(1,1)->(2,2)->(2,3)->(3,4)->(4,3)->(5,3)->(6,2)->(7,2)->(6,1)->(7,1)->(8,1) ->(9,1)->(9,2)->(10,3)->(10,4)->(10,5)->(9,5)->(8,6)->(8,7)->(9,8)->(10,8)->(11, 8)->(11,9)->(12,10)->(11,10)->(10,11)->(10,12)->(10,13)->(10,14)->(11,15)->(12, 15)路径是沿着 8 走1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 8 1 3 3 3 1 1 3 3 3 1 1 1 1 1 11 1 8 8 3 1 1 3 1 1 1 3 3 1 1 1 11 0 1 1 8 3 3 3 1 1 1 1 3 3 1 1 11 1 1 8 1 1 1 1 3 1 1 3 1 1 3 3 11 1 1 8 1 0 0 1 3 1 1 1 1 1 1 1 11 8 8 1 1 0 1 1 1 3 1 0 0 1 0 1 11 8 8 1 1 0 1 1 1 3 1 0 0 1 0 1 11 8 1 1 1 1 8 8 1 1 1 1 1 1 1 1 11 8 8 1 1 8 1 1 8 1 1 1 1 1 1 0 11 1 1 8 8 8 1 1 8 1 1 8 8 8 8 0 11 0 0 1 1 1 1 1 8 8 8 1 1 1 1 8 11 0 1 0 0 1 1 1 1 1 8 1 1 1 1 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Press any key to continue思考与疑问:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与算法第二次实验报告电子105班赵萌2010021526实验二:栈和队列的定义及基本操作一、实验目的:. 熟练掌握栈和队列的特点. 掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用. 掌握对列的定义和基本操作,熟练掌握链式队列的操作及应用, 掌握环形队列的入队和出队等基本操作. 加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力二、实验内容:定义顺序栈,完成栈的基本操作:空栈、入栈、出栈、取栈顶元素;实现十进制数与八进制数的转换;定义链式队列,完成队列的基本操作:入队和出队;1.问题描述:(1)利用栈的顺序存储结构,设计一组输入数据(假定为一组整数),能够对顺序栈进行如下操作:. 初始化一个空栈,分配一段连续的存储空间,且设定好栈顶和栈底;. 完成一个元素的入栈操作,修改栈顶指针;. 完成一个元素的出栈操作,修改栈顶指针;. 读取栈顶指针所指向的元素的值;. 将十进制数N 和其它d 进制数的转换是计算机实现计算的基本问题,其解决方案很多,其中最简单方法基于下列原理:即除 d 取余法。
例如:(1348)10=(2504)8N N div 8 N mod 81348 168 4168 21 021 2 52 0 2从中我们可以看出,最先产生的余数 4 是转换结果的最低位,这正好符合栈的特性即后进先出的特性。
所以可以用顺序栈来模拟这个过程。
以此来实现十进制数与八进制数的转换; . 编写主程序,实现对各不同的算法调用。
(2)利用队列的链式存储结构,设计一组输入数据(假定为一组整数),能够对链式队列进行如下操作:. 初始化一个空队列,形成一个带表头结点的空队;. 完成一个元素的入队操作,修改队尾指针;. 完成一个元素的出队操作,修改队头指针;. 修改主程序,实现对各不同的算法调用。
其他算法的描述省略,参见实现要求说明。
2.实现要求:对顺序栈的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
.“初始化栈算法”操作结果:构造一个空栈S;.“销毁栈算法”操作结果:销毁栈S,S 不再存在;.“置空栈算法”操作结果:把S 置为空栈;.“判是否空栈算法”操作结果:若栈S 为空栈,则返回TRUE,否则返回FALSE; .“求栈的长度算法”操作结果:返回S 的元素个数,即栈的长度;.“取栈顶元素算法”操作结果:若栈不空,则用e 返回S 的栈顶元素,并返回OK;否则返回ERROR;.“入栈算法”操作结果:插入元素e 为新的栈顶元素.“出栈算法”操作结果:若栈不空,则删除S 的栈顶元素,用e 返回其值,并返回OK;否则返回ERROR;.“实现十进制数与八进制数的转换算法”操作结果:输入任意一个非负的十进制数,输出对应的八进制数;对链式队列的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价。
.“初始化空队算法”操作结果:构造一个空队列Q;.“销毁队列算法”操作结果:销毁队列Q(无论空否均可);.“空队列算法”操作结果:将Q 清为空队列;.“判队列是否为空算法”操作结果:若Q 为空队列,则返回TRUE,否则返回FALSE;.“求队列的长度算法”操作结果:求队列的长度,返回队列中结点的个数;.“取队头元素算法”操作结果:若队列不空,则用e 返回Q 的队头元素,并返回OK,否则返回ERROR;. “入队算法”操作结果:插入元素e 为Q 的新的队尾元素;.“出队算法”操作结果:若队列不空,删除Q 的队头元素,用e 返回其值,并返回OK,否则返回ERROR;三、参考程序(一)顺序栈1.文件SqStackDef.h 中实现了栈的顺序存储表示#define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/#define STACKINCREMENT 2 /* 存储空间分配增量*/typedef struct SqStack{SElemType *base; /* 在栈构造之前和销毁之后,base 的值为NULL */SElemType *top; /* 栈顶指针*/int stacksize; /* 当前已分配的存储空间,以元素为单位*/}SqStack; /* 顺序栈*/2.文件SqStackAlgo.h 中实现顺序栈的基本操作(存储结构由SqStackDef.h 定义)Status InitStack(SqStack &S){ /* 构造一个空栈S */S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)exit(OVERFLOW); /* 存储分配失败*/S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestroyStack(SqStack &S){ /* 销毁栈S,S 不再存在*/free(S.base);S.base=NULL;S.top=NULL;S.stacksize=0;return OK;}Status ClearStack(SqStack &S){ /* 把S 置为空栈*/S.top=S.base;return OK;}Status StackEmpty(SqStack S){ /* 若栈S 为空栈,则返回TRUE,否则返回FALSE */if(S.top==S.base)return TRUE;elsereturn FALSE;}int StackLength(SqStack S){ /* 返回S 的元素个数,即栈的长度*/return S.top-S.base;}Status GetTop(SqStack S,SElemType &e){ /* 若栈不空,则用e 返回S 的栈顶元素,并返回OK;否则返回ERROR */ if(S.top>S.base){e=*(S.top-1);return OK;}elsereturn ERROR;}Status Push(SqStack &S,SElemType e){ /* 插入元素e 为新的栈顶元素*/if(S.top-S.base>=S.stacksize) /* 栈满,追加存储空间*/{S.base=(SElemType *)realloc(S.base,(S.stacksize+ STACKINCREMENT)*sizeof(SElemType));if(!S.base)exit(OVERFLOW); /* 存储分配失败*/S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top)++=e;return OK;}Status Pop(SqStack &S,SElemType &e){ /* 若栈不空,则删除S 的栈顶元素,用e 返回其值,并返回OK;否则返回ERROR */if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S,Status(*visit)(SElemType)){ /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。
*//* 一旦visit()失败,则操作失败*/while(S.top>S.base)visit(*S.base++);printf("\n");return OK;}void conversion10_8() /* 算法3.1 */{ /* 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数*/ SqStack s;unsigned n; /* 非负整数*/SElemType e;InitStack(s); /* 初始化栈*/printf("Enter an number(>=0): ");scanf("%u",&n); /* 输入非负十进制整数n */while(n) /* 当n 不等于0 */{Push(s,n%8); /* 入栈n 除以8 的余数(8 进制的低位) */n=n/8;}while(!StackEmpty(s)) /* 当栈不空*/{Pop(s,e); /* 弹出栈顶元素且赋值给e */printf("%d",e); /* 输出e */}printf("\n");}3.在SqStackUse.cpp 文件中,测试算法3.1 的调用,其中间接调用了顺序栈的其他基本算法。
typedef int SElemType; /* 定义栈元素类型为整型*/#include "pubuse.h" /* 常量定义与系统函数原型声明,与实验一中的相同*/#include "SqStackDef.h" /* 采用顺序栈的类型定义*/#include "SqStackAlgo.h" /* 利用顺序栈的基本操作*/void main(){ conversion10_8(); /* 十进制数到八进制转换的验证*/}(二)链式队列1.文件LinkQueueDef.h 中实现单链队列--队列的链式存储结构的表示。
typedef struct QNode{QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front,rear; /* 队头、队尾指针*/}LinkQueue;2.文件LinkQueueAlgo.h 中实现的链队列的基本算法,其存储结构由LinkQueueDef.h定义。
Status InitQueue(LinkQueue &Q){ /* 构造一个空队列Q */Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front->next=NULL;return OK;}Status DestroyQueue(LinkQueue &Q){ /* 销毁队列Q(无论空否均可) */while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status ClearQueue(LinkQueue &Q){ /* 将Q 清为空队列*/QueuePtr p,q;Q.rear=Q.front;p=Q.front->next;Q.front->next=NULL;while(p){q=p;p=p->next;free(q);}return OK;}Status QueueEmpty(LinkQueue Q){ /* 若Q 为空队列,则返回TRUE,否则返回FALSE */ if(Q.front==Q.rear)return TRUE;elsereturn FALSE;}int QueueLength(LinkQueue Q){ /* 求队列的长度*/int i=0;QueuePtr p;p=Q.front;while(Q.rear!=p){i++;p=p->next;}return i;}Status GetHead_Q(LinkQueue Q,QElemType &e){ /* 若队列不空,则用e 返回Q 的队头元素,并返回OK,否则返回ERROR */ QueuePtr p;if(Q.front==Q.rear)return ERROR;p=Q.front->next;e=p->data;return OK;}Status EnQueue(LinkQueue &Q,QElemType e){ /* 插入元素e 为Q 的新的队尾元素*/QueuePtr p=(QueuePtr)malloc(sizeof(QNode));if(!p) /* 存储分配失败*/exit(OVERFLOW);p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}Status DeQueue(LinkQueue &Q,QElemType &e){ /* 若队列不空,删除Q 的队头元素,用e 返回其值,并返回OK,否则返回ERROR */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,void(*vi)(QElemType)){ /* 从队头到队尾依次对队列Q 中每个元素调用函数vi()。