数据结构实验报告2

合集下载

数据结构表达式求值实验报告

数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告篇一:数据结构实验二——算术表达式求值实验报告《数据结构与数据库》实验报告实验题目算术表达式求值学院:化学与材料科学学院专业班级:09级材料科学与工程系pb0920603姓学邮名:李维谷号:pb09206285箱:指导教师:贾伯琪实验时间:20XX年10月10日一、需要分析问题描述:表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。

设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析:在计算机中,算术表达式由常量、变量、运算符和括号组成。

由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。

因而在程序设计时,借助栈实现。

设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。

在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。

在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。

算法规定:输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。

为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。

输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。

程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。

测试数据:正确输入:12*(3.6/3+4^2-1)#输出结果:194.4无定义运算:12*(3.6/(2^2-4)+1)#输出结果:表达式出错,除数为0,无意义错误输入:12+s#输出结果:eRRoR!二、概要设计拟采用两种类型的展分别对操作数和操作符进行操作。

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

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

算法与数据结构实验报告实验二实验名称:线性表实现集合运算姓名:卢丽娟学号:211006289专业:软件工程班级:二班指导教师:陈亦萍日期: 2012年3月24日一、实验目的本实验是要实现线性表的集合运算,通过该实验更深刻地理解线性结构的特点,学会并掌握线性表的顺序或链式表示和实现。

二、实验内容与实验步骤采用线性表表示集合,用线性表实现集合以及基本操作,实现两个集合的并、交、差运算。

用到的各种函数如下程序步骤所示。

步骤:1. 链表销毁void DestoryList_L(list& L){ list p=L->next,s;while(p){ s=p; p=p->next;free(s);}L->next=NULL;}2. 链表初始化void InitList(list &L){ L=NULL;}3. 往链表L中插入元素e,并按升序排列,如果L中已有元素e,则不插入ListInsert_L(list &L, char e){ list p=L->next,t,s; t = L;while(p!=NULL &&p->data<= e){ if(p->data==e) return OK;t=p; p=p->next;}s =(list)malloc(sizeof(LNode));s->data=e;s->next=p;t->next=s;return OK;}4. 创建链表,按字符串输入元素void CreateList_L(list &L, int n){ L =(list)malloc(sizeof(LNode));L->next=NULL;int i=0;for(i=n;i>0;i--){ char e; scanf("%c",&e);ListInsert_L(L,e);}getchar();}5.定义输入函数,分配存储空间void inputdata(list head)//定义输入函数{ list p;char tmp;scanf("%c",&tmp);while(tmp!='\n'){ p=(list)malloc(sizeof(struct LNode));//分配存储空间p->data=tmp;p->next=head->next;head->next=p;scanf("%c",&tmp); }}6.定义输出函数,初始化,并判断其是否为空void outputdata(list head)//定义输出集合函数{ list p;p=head->next;//初始化,p指向第一个结点while(p!=NULL)//判断是否为空{ printf("%c",p->data);p=p->next;} printf("\n");//输出集合函数}7.定义集合的并集函数,其中函数的数据元素均已按值非递减排列void MergeList(list head1,list head2,list head3)//定义集合的并集函数{//已知p1、p2中的数据元素按值非递减排列。

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

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

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

数据结构实验报告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一.实验内容:实现哈夫曼编码的生成算法。

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

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

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。

通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。

下面对每一部分实验进行总结。

实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。

在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。

实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。

通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。

实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。

通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。

实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。

通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。

通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。

同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。

在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。

通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。

总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。

在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。

数据结构实验2报告总结

数据结构实验2报告总结

一实验目的和要求理解二叉树的基本概念,熟练使用多种表示法构造二叉树,掌握采用二叉链表存储结构实现二叉树的构造、遍历、插入、删除等操作算法;理解线索二叉树的作用,掌握获得线索二叉树节点在指定遍历次序下的前驱或后继结点的方法;理解哈弗曼编码和哈弗曼树的作用,掌握由指定文本求得哈弗曼编码的方法。

理解树的基本概念,熟悉树的多种存储结构,掌握采用孩子兄弟链表存储结构实现树的遍历、插入、删除等操作算法。

通过研究树和二叉树,深刻理解链式存储结构用于表达非线性结构的作用,掌握采用递归算法实现递归数据结构基本操作的设计方法。

二题目及题意分析题目:插入x元素作为p结点的第i个孩子分析:以中国城市作为元素,以插入孩子结点的方式构造一棵树,找到结点p,p不为空时,若p的孩子结点为空,则直接插入x元素作为p的孩子;若p的孩子结点不为空,插入的x元素的位置n小于等于1时,将x元素直接插在最前面;若n大于1时,查找插入的位置执行插入。

三设计方案和功能说明源程序如下:TreeNode.htemplate<class T>class TreeNode //数的孩子兄弟链表结点类{public: //数据域,保存元素T data;TreeNode<T>* child,*sibling; //指针域,分别指向孩子兄弟结点TreeNode<T>(T data,TreeNode<T>*child=NULL,TreeNode<T>*sibling=NULL){this->data=data;this->child=child;this->sibling=sibling;}};Tree.h#include<iostream.h>#include"TreeNode.h" //树的孩子兄弟链表节点类template<class T>class Tree //树类{public:TreeNode<T>*root; //指向根结点Tree(); //构造空树bool isEmpty();//判断是否空树TreeNode<T>* insertChild(TreeNode<T>*p,T value); // 插入value作为结点p的孩子TreeNode<T>* insertChild(TreeNode<T>*p,T x,int i);// 插入x元素作为p结点的第i 个孩子friend ostream&operator<<(ostream&out,Tree<T>&tree);//先根次序遍历树并以树的横向凹入表示法输出树void preOrder(TreeNode<T> *p,int i);};template<class T>Tree<T>::Tree() //构造空树{root=NULL;}template<class T>bool Tree<T>::isEmpty()//判断是否空树{return root==NULL;}template<class T>TreeNode<T>* Tree<T>::insertChild(TreeNode<T>*p,T value) //插入value作为结点p的孩子{TreeNode<T>*q=NULL;if(p!=NULL){q=new TreeNode<T> (value);if(p->child==NULL)p->child=q;else{p=p->child;while(p->sibling!=NULL)p=p->sibling;p->sibling=q;}}return q;}template<class T>TreeNode<T>*Tree<T>::insertChild(TreeNode<T>* p,T x,int i)// 插入x元素作为p结点的第i 个孩子{TreeNode<T>*q=NULL;if(p!=NULL){q=new TreeNode<T>(x);if(p->child==NULL)p->child=q;else{{if(i<=1)//带有容错功能{p->child=new TreeNode<T>(x,NULL,p->child);return p->child;}p=p->child;for(int j=1;p->sibling!=NULL&&j<i-1;j++)p=p->sibling;if( p->sibling==NULL)p->sibling=q;elsep->sibling=new TreeNode<T>(x,NULL,p->sibling);}}}return q;}template<class T>void Tree<T>::preOrder(TreeNode<T> *p,int i){if(p!=NULL){for(int j=0;j<i;j++)cout<<"\t";cout<<p->data<<endl;preOrder(p->child,i+1);preOrder(p->sibling,i);}}template<class T>ostream&operator<<(ostream&out,Tree<T> &tree)//先根次序遍历树并以树的横向凹入表示法输出树{tree.preOrder(tree.root,0);return out;}Main.cpp#include "Tree.h"TreeNode<char*>*aa;void make(Tree<char*>&tree){tree.root=new TreeNode<char*>("中国");tree.insertChild(tree.root,"北京");tree.insertChild(tree.root,"上海");TreeNode<char*>*js=tree.insertChild(tree.root,"江苏省");tree.insertChild(js,"南京市");tree.insertChild(js,"苏州市");TreeNode<char*> *zj=tree.insertChild(tree.root,"浙江省");tree.insertChild(zj,"杭州市");tree.insertChild(zj,"宁波市");TreeNode<char*> *sx=tree.insertChild(tree.root,"山西省");tree.insertChild(sx,"太原市");tree.insertChild(sx,"大同市");aa=zj;}int main(){Tree<char*>tree;make(tree);cout<<tree;tree.insertChild(aa,"无锡市",2);cout<<tree;return 0;}四运行结果及分析1插入位置小于等于1(即n<=1)n=-2时n=0时n=1时2插入位置大于1(即n>1)n=2时五实验总结通过实验理解了树及二叉树的存储结构熟悉掌握了孩子兄弟链表的存储结构实现,以及遍历、查找、删除等操作,深刻理解实现链式存储结构表达非线性的树存储结构。

数据结构实验报告2

数据结构实验报告2

数据结构实验报告2数据结构实验报告21、实验目的本次实验的目的是通过使用数据结构来解决一个特定的问题。

具体而言,我们将会使用某种数据结构(例如链表、堆栈、队列等)来实现一个特定功能,并对其性能进行评估。

2、实验背景在本次实验中,我们将会探索数据结构在解决实际问题中的应用。

数据结构是计算机科学的重要组成部分,它提供了一种组织和管理数据的方式,以便能够高效地访问和操作这些数据。

3、实验内容在本次实验中,我们选择了一种经典的数据结构,以实现一个特定的功能。

具体而言,我们将会使用链表来实现一个简单的联系人管理系统。

3.1 数据结构选择我们选择了链表作为联系人管理系统的数据结构。

链表是一种灵活的数据结构,它能够动态地增加或删除元素,并且支持高效的插入和删除操作。

3.2 实现功能我们的联系人管理系统将会具有以下功能:- 添加联系人:用户可以输入联系人的姓名、方式号码等信息,并将其添加到联系人列表中。

- 删除联系人:用户可以选择要删除的联系人,并从列表中删除该联系人。

- 查找联系人:用户可以根据姓名或方式号码来查找联系人,并显示相关信息。

- 显示所有联系人:系统将会将所有联系人按照姓名的字母顺序进行排序,并将其显示在屏幕上。

4、实验步骤下面是本次实验的具体步骤:4.1 初始化联系人管理系统在系统开始之前,我们需要初始化联系人管理系统。

这包括创建一个空的联系人列表,并提供用户菜单来选择相应功能。

4.2 添加联系人用户可以选择添加联系人的功能,并输入联系人的相关信息。

系统将会将联系人添加到联系人列表中。

4.3 删除联系人用户可以选择删除联系人的功能,并输入要删除联系人的姓名或方式号码。

系统将会在联系人列表中查找并删除相应联系人。

4.4 查找联系人用户可以选择查找联系人的功能,并输入要查找联系人的姓名或方式号码。

系统将会在联系人列表中查找相应联系人,并显示其相关信息。

4.5 显示所有联系人用户可以选择显示所有联系人的功能。

数据结构实验报告2

数据结构实验报告2

数据结构实验报告2一、实验目的本次数据结构实验旨在通过实际操作和编程实践,深入理解和掌握常见的数据结构,如链表、栈、队列、树等,并能够运用所学知识解决实际问题,提高编程能力和算法设计能力。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容(一)链表的实现与操作1、单向链表的创建首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。

然后,通过函数实现了单向链表的创建,从用户输入获取节点的数据,依次创建新节点并连接起来。

2、链表的遍历编写函数实现对单向链表的遍历,依次输出每个节点的数据。

3、链表的插入与删除实现了在指定位置插入节点和删除指定节点的功能。

插入操作时,需要找到插入位置的前一个节点,修改指针完成插入。

删除操作时,同样找到要删除节点的前一个节点,修改指针并释放删除节点的内存。

(二)栈的实现与应用1、栈的基本操作使用数组实现了栈的数据结构,包括入栈、出栈、判断栈空和获取栈顶元素等操作。

2、表达式求值利用栈来实现表达式求值的功能。

将表达式中的数字和运算符分别入栈,按照运算规则进行计算。

(三)队列的实现与应用1、队列的基本操作使用循环数组实现了队列,包括入队、出队、判断队空和队满等操作。

2、模拟银行排队系统通过创建队列来模拟银行客户的排队情况,实现客户的入队和出队操作,统计平均等待时间等。

(四)二叉树的遍历1、二叉树的创建采用递归的方式创建二叉树,用户输入节点数据,构建二叉树的结构。

2、先序、中序和后序遍历分别实现了二叉树的先序遍历、中序遍历和后序遍历,并输出遍历结果。

四、实验结果与分析(一)链表实验结果成功创建、遍历、插入和删除单向链表。

通过对链表的操作,深入理解了链表的动态存储特性和指针的运用。

在插入和删除操作中,能够正确处理指针的修改和内存的释放,避免了内存泄漏和指针错误。

(二)栈实验结果栈的基本操作运行正常,能够正确实现入栈、出栈等功能。

数据结构实验报告2篇

数据结构实验报告2篇

数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。

实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。

实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。

结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。

2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。

结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。

3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。

结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。

4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。

结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。

具体目标包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。

2、学会运用数据结构解决实际问题,培养算法设计和分析的能力。

3、提高程序设计的规范性和可读性,培养良好的编程习惯。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容本次实验共包括以下几个部分:(一)线性表的实现与操作1、顺序表的实现定义一个顺序表结构体,包含数据元素数组和表的长度。

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

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

实现链表的创建、插入、删除、遍历等操作。

(二)栈和队列的实现与应用1、栈的实现采用顺序存储或链式存储实现栈。

实现栈的入栈、出栈、栈顶元素获取等操作,并应用于表达式求值。

2、队列的实现用循环队列或链式队列实现队列。

实现队列的入队、出队、队头元素获取等操作,应用于模拟排队系统。

(三)树的基本操作与遍历1、二叉树的实现定义二叉树节点结构体,包含数据域、左子树指针和右子树指针。

实现二叉树的创建、插入、删除节点等操作。

2、二叉树的遍历分别实现前序遍历、中序遍历和后序遍历,并输出遍历结果。

(四)图的表示与遍历1、邻接矩阵和邻接表表示图定义图的结构体,使用邻接矩阵和邻接表两种方式存储图的信息。

实现图的创建、添加边等操作。

2、图的遍历分别用深度优先搜索(DFS)和广度优先搜索(BFS)遍历图,并输出遍历序列。

四、实验步骤(一)线性表的实现与操作1、顺序表的实现首先,定义了一个结构体`SeqList` 来表示顺序表,其中包含一个整数数组`data` 用于存储数据元素,以及一个整数`length` 表示表的当前长度。

在初始化函数`InitSeqList` 中,将表的长度初始化为 0,并分配一定的存储空间给数组。

数据结构第二章实验报告

数据结构第二章实验报告

数据结构第二章实验报告一、实验目的数据结构第二章主要涉及线性表的相关知识,本次实验的目的在于通过实际操作和编程实现,深入理解线性表的概念、存储结构以及基本操作,巩固所学的理论知识,并提高编程能力和问题解决能力。

二、实验环境本次实验使用的编程语言为C++,编程环境为Visual Studio 2019。

三、实验内容(一)顺序表的实现顺序表是一种用顺序存储方式实现的线性表。

在实验中,我们定义了一个结构体来表示顺序表,包括存储数据的数组和表示表长度的变量。

实现了顺序表的初始化、插入、删除、查找等基本操作。

(二)链表的实现链表是一种通过指针链接实现的线性表。

我们分别实现了单向链表和双向链表。

在单向链表中,每个节点包含数据和指向下一个节点的指针;双向链表则在此基础上增加了指向前一个节点的指针,使得链表的操作更加灵活。

(三)线性表的应用运用实现的线性表解决了一些实际问题,如数据排序、查找特定元素等。

四、实验步骤(一)顺序表的实现步骤1、定义顺序表结构体,包括数据数组和长度变量。

2、实现顺序表的初始化函数,将长度初始化为 0。

3、插入操作:首先判断表是否已满,如果未满,在指定位置插入元素,并将后续元素后移。

4、删除操作:首先判断指定位置是否合法,然后将该位置元素删除,并将后续元素前移。

5、查找操作:遍历表中的元素,找到目标元素返回其位置,否则返回-1。

(二)链表的实现步骤1、单向链表定义单向链表节点结构体,包含数据和指向下一个节点的指针。

实现链表的初始化函数,创建头节点。

插入操作:分为头插法和尾插法,根据插入位置的不同选择相应的方法。

删除操作:找到要删除的节点,将其前后节点连接起来,释放删除节点的内存。

查找操作:遍历链表,找到目标元素返回节点指针,否则返回NULL。

2、双向链表定义双向链表节点结构体,包含数据、指向前一个节点和指向下一个节点的指针。

初始化函数与单向链表类似,但需要同时处理前后指针。

插入和删除操作:在单向链表的基础上,同时更新前后节点的指针。

数据结构_迷宫求解_实验报告 北邮

数据结构_迷宫求解_实验报告 北邮

数据结构实验报告实验名称:实验二——利用栈结构实现迷宫求解问题学生姓名:班级:班内序号:学号:日期:2012年11月19日一、实验目的1、进一步掌握指针、模板类、异常处理的使用2、掌握栈的操作的实现方法3、掌握队列的操作的实现方法4、学习使用栈解决实际问题的能力5、学习使用队列解决实际问题的能力二、实验要求:利用栈结构实现迷宫求解问题。

迷宫求解问题如下:心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口,测试算法的迷宫如下图所示。

提示:1、可以使用递归或非递归两种方法实现2、老鼠能够记住已经走过的路,不会反复走重复的路径3、可以自己任意设置迷宫的大小和障碍4、使用“穷举求解”的方法三、程序分析1、存储结构栈存储结构;示意图;2、关键算法分析A、绘制迷宫;伪代码:1、输出迷宫的大小及全部设置为障碍;2、根据键盘的输入绘制迷宫的路线,起始点和终点;void draw()//绘制迷宫障碍{k=getch();switch(int(k)){case 105://上if(by>5){by--;j--;}break;case 107://下if(by<M+4){by++;j++;}break;case 106://左if(bx>2){bx=bx-2;i--;}break;case 108://右if(bx<2*N){bx=bx+2;i++;}break;case 114://'R'路map[i][j]=0;cout<<".";break;case 119://'W'墙map[i][j]=-3;cout<<"■";break;case 115://'S'起点s[0].x=i;//起点入栈s[0].y=j;top=1;map[i][j]=-1;cout<<k;break;case 101://'E'终点map[i][j]=-2;cout<<k;break;}gotoxy(bx,by);}B、路径寻找伪代码;1、向某一方向查找是否有路;2、如有遍历一下栈,看是否已经进栈,一进栈就舍弃,寻求下一个;无就让其进栈。

数据结构实验报告

数据结构实验报告

数据结构实验报告数据结构实验报告1.实验目的1.1 理解数据结构的基本概念和原理1.2 掌握数据结构的常用算法和操作方法1.3 培养编写高效数据结构代码的能力2.实验背景2.1 数据结构的定义和分类2.2 数据结构的应用领域和重要性3.实验内容3.1 实验一:线性表的操作3.1.1 线性表的定义和基本操作3.1.2 实现顺序存储结构和链式存储结构的线性表 3.1.3 比较顺序存储结构和链式存储结构的优缺点3.2 实验二:栈和队列的实现3.2.1 栈的定义和基本操作3.2.2 队列的定义和基本操作3.2.3 比较栈和队列的应用场景和特点3.3 实验三:树的操作3.3.1 树的定义和基本概念3.3.2 实现二叉树的遍历和插入操作3.3.3 比较不同类型的树的存储结构和算法效率3.4 实验四:图的遍历和最短路径算法3.4.1 图的定义和基本概念3.4.2 实现深度优先搜索和广度优先搜索算法3.4.3 实现最短路径算法(例如Dijkstra算法)4.实验步骤4.1 实验一的步骤及代码实现4.2 实验二的步骤及代码实现4.3 实验三的步骤及代码实现4.4 实验四的步骤及代码实现5.实验结果与分析5.1 实验一的结果和分析5.2 实验二的结果和分析5.3 实验三的结果和分析5.4 实验四的结果和分析6.实验总结6.1 实验心得体会6.2 实验中存在的问题及解决方案6.3 对数据结构的理解和应用展望7.附件实验所使用的源代码、运行截图等相关附件。

8.法律名词及注释8.1 数据结构:指计算机中数据的存储方式和组织形式。

8.2 线性表:一种数据结构,其中的元素按照顺序排列。

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

8.4 队列:一种特殊的线性表,按照先进先出的顺序进行插入和删除操作。

8.5 树:一种非线性的数据结构,由节点和边组成。

8.6 图:一种非线性的数据结构,由顶点和边组成。

数据结构实验2——栈和队列实验报告

数据结构实验2——栈和队列实验报告

数据结构实验报告实验名称:实验2——栈和队列1 实验目的通过选择下面五个题目之一进行实现,掌握如下内容:进一步掌握指针、模板类、异常处理的使用掌握栈的操作的实现方法掌握队列的操作的实现方法学习使用栈解决实际问题的能力学习使用队列解决实际问题的能力2 实验内容利用栈结构实现八皇后问题。

八皇后问题19世纪著名的数学家高斯于1850年提出的。

他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。

请设计算法打印所有可能的摆放方法。

提示:1、可以使用递归或非递归两种方法实现2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上2. 程序分析主程序:#include<iostream>using namespace std;const int StackSize=8; //皇后的个数int num=0;template <class T>class SeqStack //定义顺序栈模板类{public:SeqStack(){top=-1;} //构造函数,初始化空栈void Push(T x); //入栈操作void Pop();//出栈操作void PlaceQueen(int row); //放置皇后bool Judgement();//判断是否符合条件void Print();//输出符合条件的皇后排列bool Empty(){if(top==-1) return true;else return false;}; //判断栈是否为空private:T data[StackSize]; //定义数组int top; //栈顶指针};template <class T>void SeqStack<T>::Push(T x) //入栈操作{if(top>=StackSize-1) throw"上溢";top++;//栈顶指针上移data[top]=x;}template <class T>void SeqStack<T>::Pop()//出栈操作{if(Empty()) throw"下溢";top--;//栈顶指针下移}template <class T>bool SeqStack<T>::Judgement()//判断该位置是否合适{for(int i=0;i<top;i++)if(data[top]==data[i]||(abs(data[top]-data[i]))==(top-i))//判断是否满足任意两个皇后不在同列同一斜线return false;return true;}template <class T>void SeqStack<T>::PlaceQueen(int row) //放置皇后{for (int i=0;i<StackSize;i++){Push(i); //入栈if (Judgement())//判断位置是否合适{if (row<StackSize-1)PlaceQueen(row+1); //如果合适满足条件则放置一个皇后,递归调用else{num++;//不满足条件则到下一行Print();//输出符合条件的皇后}}Pop();//出栈}}template <class T>void SeqStack<T>::Print()//输出皇后函数{cout<<"NO."<<num<<":"<<endl; for(int i=0;i<StackSize;i++){for(int j=0;j<data[i];j++){cout<<"□";}cout<<"■";for(int j=StackSize-1;j>data[i];j--){cout<<"□";}cout<<endl;}cout<<endl;}void main(){SeqStack<int> Queen;Queen.PlaceQueen(0);cout<<"总共有"<<num<<"种摆放方法。

数据结构实验报告二

数据结构实验报告二
{
if (S.base==S.top)
return TRUE;
return FALSE;
}
void conversion () {
InitStack(S);
scanf ("%d",&N);
while (N) {
Push(S, N % 8);
N = N/8;
}
while (!StackEmpty(S)) {
// 插入元素e为Q的新的队尾元素
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, ElemType &e) {
{ 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;
// 若队列不空,则删除Q的队头元素,
// 用e返回其值,并返回OK; 否则返回ERROR
if (Q.front == Q.rear) return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front+1) % MAXQSIZE;

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告数据结构课程实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方法。

在数据结构课程中,我们学习了各种数据结构的原理和应用,并通过实验来加深对这些概念的理解。

本文将对我在数据结构课程中的实验进行总结和分析。

实验一:线性表的实现与应用在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺序存储和链式存储两种方式。

通过实验,我深刻理解了线性表的插入、删除和查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。

实验二:栈和队列的实现与应用栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。

在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。

同时,我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转后缀表达式等。

实验三:树的实现与应用树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。

在这个实验中,我们学习了二叉树和二叉搜索树的实现和应用。

通过实验,我掌握了二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树实现排序算法。

实验四:图的实现与应用图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。

在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。

通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。

实验五:排序算法的实现与比较排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照某种规则进行排列。

在这个实验中,我们实现了常见的排序算法,比如冒泡排序、插入排序、选择排序和快速排序等,并通过实验比较了它们的性能差异。

通过实验,我深入理解了排序算法的原理和实现细节,并了解了如何根据具体情况选择合适的排序算法。

结论:通过这些实验,我对数据结构的原理和应用有了更深入的理解。

数据结构实验报告(实验)

数据结构实验报告(实验)

数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告目录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. 实验总结通过本次实验,学生将对数据结构与算法设计有更深入的了解,并能将所学知识应用到实际问题中,提高自己的实践能力和解决问题的能力。

国家开放大学《数据结构》课程实验报告(实验2——线性表)参考答案

国家开放大学《数据结构》课程实验报告(实验2——线性表)参考答案
printf("\n");
//在链表中删除最高分和最低分结点
for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
{
if(p==pmin) { q->next=p->next; p=q; } //删除最低分结点
};
typedef struct pw PW;
//定义链表结点
struct node
{
PW data;
struct node * next;
};
typedef struct node NODE;
NODE *create(int n); //建立单链表
void input(NODE *s,int i); //输入第i个评委信息
(5)遍历链表,累加求和,计算总分及平均分,并输出相关信息。
完整程序
//实验1.1线性表的链接存储结构
#include
#include
#include
#define PWRS 5 //定义评委人数
//定义评委信息
struct pw
{
char name[8]; //姓名
short age; //年龄
float score; //评分
NODE *create(int n)
{
NODE *head,*p,*q;
inti;
p=(NODE*)malloc(sizeof(NODE));
head=p; q=p; p->next=NULL;
for(i=1; i<=n; i++)
{
p=(NODE*)malloc(sizeof(NODE));

《数据结构》实验报告二(样例参考)

《数据结构》实验报告二(样例参考)

《数据结构》实验报告二系别:班级:学号:姓名:日期:指导教师:一、上机实验的问题和要求:单链表的查找、插入与删除。

设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。

具体实现要求:1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。

2.从键盘输入1个字符,在单链表中查找该结点的位置。

若找到,则显示“找到了”;否则,则显示“找不到”。

3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。

4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。

5.(★)将单链表中值重复的结点删除,使所得的结果表中各结点值均不相同,输出单链表所有结点值,观察输出结果。

6.(★)删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。

7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。

二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)1.程序结构:定义一个主函数和五个子函数(分别用来实现单链表的创建、查找、插入、删除及单链表的打印)。

2.数据结构:定义一个结构体,作为单链表的结点。

typedef struct stu /*DataType可以是任何相应的数据类型如int, float或char*/ {char Name[Max]; /*定义了数据域,这里存放的是一个字符型数组*/struct stu *next; /*定义了指针域*/}student;3.输入输出设计:创建单链表函数:student *create();输入:通过scanf( )函数及for语句为数据域定义,并定义指针域的指针所指的下一个结点。

数据结构实验报告(二)栈的应用

数据结构实验报告(二)栈的应用

数据结构实验报告(⼆)栈的应⽤实验说明数据结构实验⼆ 栈的实验——栈的简单应⽤⼀、实验⽬的通过本实验使学⽣了解栈的简单应⽤,熟悉栈的特性及栈在顺序存储上的操作特点,深刻理解栈的基本操作与⽤栈解决应⽤问题的关系;特别训练学⽣使⽤栈解决实际问题的能⼒,为今后⽤栈解决相关问题奠定基础。

⼆、实验内容1.编程实现对给定的⼀组括号序列判断其是否匹配正确。

要求:(1)它必须成对出现,如“(”“)”是⼀对,“[”与“]”是⼀对;(2)出现时有严格的左右关系;(3)可以以嵌套的⽅式同时出现多组多括号,但必须是包含式嵌套,不允许交叉式嵌套。

⽐如“( )”、“[([][])]”这样是正确的,“[(])”或“([()))”或 “(()]”是不正确的。

(4)将处理的括号扩展为针对“()”“[]”“{}”三类。

2.编程实现⼀个简单的⾏编辑功能:⽤户可以输⼊⼀⾏内容,并可进⾏简易编辑。

要求:(1)遇到输⼊部分内容有误时操作退格符“#”表⽰前⼀位⽆效;(2)“@”表⽰之前的内容均⽆效。

实验报告1.实现功能描述编程实现对给定的⼀组括号序列判断其是否匹配正确,将处理的括号扩展为针对“()”“[]”“{}”三类,遇到输⼊部分内容有误时操作退格符“#”表⽰前⼀位⽆效;“@”表⽰之前的内容均⽆效。

2.⽅案⽐较与选择(1)可以使⽤栈和队列来实现。

因为栈的功能⾜以完成题⽬要求,所以初步打算使⽤栈来实现。

(2)因为编写⼀个标准的栈⽐较繁琐,⽽且本题中也没有⽤到所有栈的标准操作,所以通过模拟栈来完成本题。

(3)可以使⽤数组或链表来模拟栈。

因为括号匹配只有3对,所需空间不是很⼤,⼜因为特殊操作#、@可以在数组中通过-1和赋0值实现,因此选择了数组法来模拟栈。

3.设计算法描述(1)定义3个变量,分别⽤于记录()、[]、{}的出现次数。

遇到左符号时变量++,遇到右符号时--,变量为0时表⽰空栈。

当读到#时,再往前读⼀个字符,如果是()、[]、{}中的⼀种,则对其进⾏反向运算,即遇到右符号时++,遇到左符号时--。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与数据库实验报告
作者:张一鸣班级:通信二班学号:201200121241
完成日期:2014年11月18日
作业1:二叉树
编译环境:VS2013
程序语言:C
编译方式:debug模式下动态编译;release模式下静态编译。
思路:为了较为直观的表现该算法,因此设计一个简单的交互算法。图1.1为效果总览图。
//
#include "stdafx.h"
#include "malloc.h"
#include "conio.h"
#define MAXSIZE 200
typedef char datatype;
typedef struct node{
datatype data;
struct node *lchild, *rchild;
printf("\n遍历结果如下:\n");
while (front<rear)
{
front++;
s = Q[front];
printf("%c\n", s->data);
if (s->lchild != NULL)
{
rear++;
Q[rear] = s->lchild;
}
if (s->rchild != NULL)
以下为源代码:
//排序算法.cpp :定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "malloc.h"
#include "conio.h"
/*************************************
顺序表数据类型定义
*************************************/
{
root = s;
putchar('\n');
}
else
{
if (s&&Q[front])
{
if (rear % 2 == 0)
Q[front]->lchild = s;
else
Q[front]->rchild = s;
}
if (rear % 2 == 1)
front++;
if ((num = rear+1) % 2 == 0)
图1.1
源代码说明:
以下为二叉树节点的定义:
ypedef char datatype;
typedef struct node{
datatype data;
struct node *lchild, *rchild;
}bitree;
bitree *root;
整个程序有创建二叉树及二叉树遍历两个子函数,分别是bitree *CreateTree()和void Layer(bitree *p)。遍历算法为作业要求的按层次遍历,也即广度遍历算法。
}bitree;
bitree *root;
bitree *CreateTree(){
char ch;
bitree *Q[MAXSIZE];
int front, rear,num;
front = 1, rear = 0;
while ((ch = _getche()) != 13)///////////////////////enter
{
while ((num /= 2) % 2 == 0);
if (num == 1)
putchar('\n');
}
}
}
return root;
}
void Layer(bitree *p){
bitree *Q[MAXSIZE];
bitree *s;
int rear = 1, front = 0;
Q[rear] = p;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
linklist *p = NULL;
printf("\n请输入学生姓名及分数,姓名与分数之间以空格键隔开,输入完分数后按\"ENTER\"键确认\n");
p = CreateList();
printf("\n当前学生信息如下所示:\n");
为了直观的显示用户的输入对二叉树的构造过程,创建二叉树时加入一个换行算法来实现自动换行,如下if ((num = rear+1) % 2 == 0)
{
while ((num /= 2) % 2 == 0);
if (num == 1)
putchar('\n');
}
源代码如下:
//树.cpp :定义控制台应用程序的入口点。
typedef struct{
char name[20];
int grade;
}node;
typedef struct{
node *stu[1000];
int last;
}linklist;
linklist *CreateList(void){
int i = 0,j;
char c;
linklist *L;
print(p);
printf("\n利用插值排序法,得学生成绩排名如下:\n");
Requeue(p, p->last + 1);
print(p);
while (1)//程序退出
{
printf("\n请按ESC键退出程序^_^");
if (_getch() == 27)//ASCII(ESC)==27
while ((c = getchar()) != '\n' && c != EOF);
//printf("%s,%d", student[j]->name, student[j]->grade);
//while (((L->stu[i]->name)[j] = (student->name)[j]) != 0)错误?
j++;
} while (1);
return L;
}
void Requeue(linklist *L,int N){
int j, p;
node *tmp;
for (p = 1; p < N; p++)
{
tmp = L->stu[p];
for (j = p; j>0 && L->stu[j - 1]->grade > tmp->grade; j--)
Layer(t);
while (1)//程序退出
{
printf("\n请按ESC键退出程序^_^");
if (_getch() == 27)//ASCII(ESC)==27
return 0;
printf("\n注意,是ESC键!=_=!");//卖萌专用,请无视
}
}
作业2:排序算法
编译环境:VS2013
L->stu[j] = L->stu[j - 1];
L->stu[j] = tmp;
}
}
void print(linklist *L){
int i;
printf("");
for (i = 0; i <= L->last; i++){
printf("\n%12s%6d", L->stu[i]->name, L->stu[i]->grade);
{
rear++;
Q[rear] = s->rchild;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
bitree *t = NULL;
printf("请构造二叉树,对于不存在的节点请输入“*”\n注意该树最多支持存在200个节点\n");
t = CreateTree();
int grade;
}node;
typedef struct{
node *stu[1000];
int last;
}linklist;
注:名字不小心打错了,打成linklist了。
本程序用linklist *CreateList(void)函数来构造顺序表,用void Requeue(linklist *L,int N)函数来对顺序表中的结点按结点中分数高低来排序,排序算法借鉴最基本的插值算法。用void print(linklist *L)函数来按顺序打印当前顺序表的所有结点。
node *student[100];
L = (linklist*)malloc(sizeof(linklist));
L->last = -1;
do
{
j = 0;
student[j] = (node *)malloc(sizeof(node));
scanf_s("%s%d", student[j]->name,sizeof(student[j]->name), &student[j]->grade);
程序语言:C
相关文档
最新文档