数据结构_实验六_报告
数据结构实验报告
《数据结构》实验报告姓名:学号:班级:学院:实验一单链表实验(一)实验目的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<iostream>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(){return head; //读取头指针}void insert2(const int x);friend void SplitList(list L1, list&L2, list &L3);friend void get_public(list L1, list L2, list &L3);private:int count;node *head;};list::list(){head=new node;head->next=NULL;count=0;}void list::create() //链表构建,以0为结束标志{int x;cout<<"请输入当前链表,以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、队列队列的特点是先进先出,常用于排队、任务调度等场景。
数据结构 实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
操作系统为 Windows 10。
三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。
对链表进行排序,如冒泡排序或插入排序。
2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。
利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。
3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。
进行二叉树的插入、删除节点操作。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先遍历和广度优先遍历。
四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。
数据结构实验6报告
数据结构实验报告第 6 次实验一、实验目的1.理解栈是操作受限(插入push, 删除pop)的线性表, 受限的是插入删除的位置。
2.在链式存储结构下实现:StackEmpty, Push,Pop, 几个基本操作。
3.通过调用基本操作实现括号匹配算法。
二、实验内容(问题)写一个算法, 识别依次读入的一个字符序列是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’, 且序列2是序列1的逆序列。
例如, ‘a+b&b+a’是属该模式的字符序列, 而’1+3&3-1’则不是。
测试数据: ’1+3&3-1’; ’a+b+c&c+b+a’; ’a+b+c&c+b’; ’b+c&c+b+a’;提示:利用栈 , 利用已实现的基本操作三、算法描述(给出自然语言描述的算法)1.向后依次扫描字符序列, 如果考察的字符不等于‘&’则入栈, 遇到‘&’则停止。
2.从‘&’后继续扫描, 考察字符的时候, 栈顶元素出栈, 若二者相等, 继续扫描;不等, 模式不成立。
3.扫描结束后, 栈空则模式成立四、详细设计(画流程图)五、程序代码#include<stdio.h>#include<stdlib.h>#define True 1#define False 0#define OK 1#define ERROR 0typedef int status;typedef char ElemType;typedef struct SNode{ElemType data;struct SNode *next;}SNode, *LinkStack;status InitStack(LinkStack &S);int StackEmpty(LinkStack S);status Push(LinkStack &S, ElemType e);status Pop(LinkStack &S, ElemType &e);status Is_Match(ElemType f[20]);main(){ElemType formula[20];int i;for(i=0;i<=3;i++){printf("\n请输入一个字符序列表达式: ");scanf("%s",formula);if(Is_Match(formula)==1) printf(" \n这个表达式符合‘序列1&序列2’模式!\n"); else printf("\n 这个表达式不符合‘序列1&序列2’模式!\n");}return(1);}status InitStack(LinkStack &S){S=NULL;return(OK);}int StackEmpty(LinkStack S){if(S==NULL) return(True);else return(False);}status Push(LinkStack &S, ElemType e){LinkStack p;p=(LinkStack)malloc(sizeof(SNode));if(!p) return(ERROR);p->data=e;p->next=S;S=p;return(OK);}status Pop(LinkStack &S, ElemType &e){LinkStack p;if(!S) return(ERROR);e=S->data;p=S;S=S->next;free(p);return(OK);}status Is_Match(ElemType f[20]){LinkStack St; ElemType *p,c;InitStack(St);p=f;for(;*p!='&';p++){ Push(St,*p);if(!Push(St, *p)) return(ERROR);}p++;for(;*p!='\0';p++){Pop(St,c);if(!Pop(St,c)) return(ERROR);else if(c!=*p) return(ERROR);}if(StackEmpty(St)) return(OK);else return(ERROR);}七、用户手册(教用户怎么用这个程序)用途: 判断字符串是否是“序列1&序列2’模式”用法:启动此程序, 屏幕会提示你输入数据, 输入数据并按下回车键即可。
数据结构实验二叉树
实验六:二叉树及其应用一、实验目的树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。
二、问题描述首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。
其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。
如算术表达式:a+b*(c-d)-e/f三、实验要求如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。
求二叉树的深度。
十进制的四则运算的计算器可以接收用户来自键盘的输入。
由输入的表达式字符串动态生成算术表达式所对应的二叉树。
自动完成求值运算和输出结果。
四、实验环境PC微机DOS操作系统或Windows 操作系统Turbo C 程序集成环境或Visual C++ 程序集成环境五、实验步骤1、根据二叉树的各种存储结构建立二叉树;2、设计求叶子结点个数算法和树的深度算法;3、根据表达式建立相应的二叉树,生成表达式树的模块;4、根据表达式树,求出表达式值,生成求值模块;5、程序运行效果,测试数据分析算法。
六、测试数据1、输入数据:2.2*(3.1+1.20)-7.5/3正确结果:6.962、输入数据:(1+2)*3+(5+6*7);正确输出:56七、表达式求值由于表达式求值算法较为复杂,所以单独列出来加以分析:1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。
例如有如下的中缀表达式:a+b-c转换成后缀表达式为:ab+c-然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。
如上述的后缀表达式先将a 和b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和b 进行a+b 的运算,并将其结果d(假设为d)放入栈中,然后再将c 放入栈中,最后是操作符“-”,所以再弹出d和c 进行d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。
数据结构实验六报告
数据结构实验六报告第一篇:数据结构实验六报告实验六报告课程名称:数据结构实验名称:二叉树的应用实验日期2011/11/23一、实验目的:掌握赫夫曼二叉树的建立及赫夫曼编码的生成。
二、实验内容与要求:根据给定的n个权值生成赫夫曼二叉树,输出赫夫曼编码。
三、数据结构设计顺序表的存储结构,建立了二叉树的关系Struct HTNode{int weight;unsigned int parent,lchild,rchild;};四、算法设计1、从数据中选择较小的两个数据元素void Select(HTNode *HT, const int n, int &a, int &b){ //选择较小的两个元素} int x,y;x=y=0x7fff;for(int j=0;jif(HT[j].parent==0)if(HT[j].weight2、建立赫夫曼树void CreatHuff(HTNode *HT,int *p,const int n){} int m=2*n-1;int i,a,b;for(i=0;iSelect(HT ,i,a,b);HT[a].parent=HT[b].parent=i;HT[i].weight=H T[a].weight+HT[b].weight;HT[i].lchild=a;HT[i].rchild=b;}3、生成赫夫曼编码void HuffCoding(HTNode *HT, Huffcode &HC, const int n){ //}HC=newchar*[n+1];char *code=new char[n];code[n-1]='';int i,j,p,k;for(i=0;i} delete[] code;j=n-1;k=i;while(HT[k].parent){p=HT[k].parent;if(HT[p].lchild==k)code[--j]='0';else code[--j]='1';k=p;} HC[i]=(char*)malloc((n-j)*sizeof(char));HC[i]=new char[n-j];strcpy(HC[i],&code[j]);五、测试结果测试数据一:测试数据二:六、心得体会这次实验是在前面的实验基础之上,加上只用了顺序表的存储结构,所以比较简单。
数据结构 实验报告
数据结构实验报告数据结构实验报告一、引言数据结构是计算机科学中非常重要的一门课程,它涉及到数据的存储、组织和管理等方面。
通过实验学习,我们可以更好地理解和掌握不同的数据结构,提升我们在编程中解决实际问题的能力。
二、实验目的本次实验的主要目的是通过实际操作,加深对数据结构的理解,学习并掌握不同数据结构的特点和应用场景,提高编程能力。
三、实验内容1. 实验环境的搭建在开始实验之前,我们需要搭建相应的实验环境。
首先,我们选择合适的集成开发环境(IDE),如Eclipse或IntelliJ IDEA,并安装好Java Development Kit(JDK)。
然后,根据实验要求,下载并安装相应的数据结构库或框架。
2. 实验一:线性表线性表是最基本且最常用的数据结构之一,它可以用于存储一系列具有相同数据类型的元素。
实验中,我们需要实现一个线性表的基本操作,包括插入、删除、查找、修改等。
3. 实验二:栈和队列栈和队列是两种常用的数据结构,它们都是线性表的衍生结构,但在操作上有一些特殊的限制。
实验中,我们需要实现栈和队列的基本操作,并比较它们在不同场景下的优劣。
4. 实验三:树和二叉树树是一种非线性的数据结构,它以分层的方式存储数据。
二叉树是树的一种特殊情况,其中每个节点最多只有两个子节点。
实验中,我们需要实现树和二叉树的构建和遍历算法,并掌握它们在实际问题中的应用。
5. 实验四:图图是一种非线性的数据结构,由节点和边组成。
实验中,我们需要实现图的构建和遍历算法,并应用它们解决实际的图相关问题。
四、实验结果与分析通过实验,我们得到了以下结果和分析:1. 在线性表实验中,我们成功实现了插入、删除、查找和修改等基本操作,并验证了其正确性和效率。
2. 在栈和队列实验中,我们对比了它们在不同场景下的应用,发现栈适用于后进先出(LIFO)的情况,而队列适用于先进先出(FIFO)的情况。
3. 在树和二叉树实验中,我们掌握了树和二叉树的构建和遍历算法,并应用它们解决了一些实际问题,如树形结构的存储和搜索。
数据结构试验报告
数据结构实验报告学号:姓名:指导老师:实验一线形表的应用实验目的1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;2.线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3.掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;4.通过对本章实验帮助学生加深对C语言的使用(特别是函数参数调用、指针类型的应用和链表的建立等各种基本操作)实验内容约瑟夫问题的实现:n只猴子要选猴王,所有猴子按1,2,…,n编号围坐一圈,从第1只开始按1,2,…,m报数,凡报到m号的猴子退出圈外,如此循环报数,直到圈内省剩下一只猴子时,这个猴子就是猴王。
编写一个程序实现上述过程,n和m由键盘输入。
实验要求1.要求用顺序表和链表分别实现约瑟夫问题;2.独立完成,严禁抄袭;3.上交的实验报告由如下部分组成:①实验名称②实验目的③实验内容(问题描述,算法描述,程序清单,测试结果,算法分析)。
实验实现#include<stdio.h>#define MaxSize 100void jose(int n,int m){int mon[MaxSize];int i,d,count;for(i=0;i<n;i++)mon[i]=i+1;printf("出队前:"); for(i=0;i<n;i++)printf("%d\t",mon[i]);printf("\n");printf("出队序列:");count=0;i=-1;while (count<n){d=0;while (d<m){i=(i+1)%n;if(mon[i]!=0)d++;}printf("%d\t",mon[i]);mon[i]=0;count++;}printf("\n");}void main(){int n,m;printf("输入猴子数!\n");scanf("%d",&n);printf("输入报号退出数!\n");scanf("%d",&m);jose(n,m);}运行结果实验二栈和队列的应用实验目的1. 熟练掌握栈和队列的结构,以及这两种数据结构的特点;2. 能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空时的判断条件和描述方法;3. 熟练掌握链队列和循环列表的基本运算,特别注意队列满和队列空时的判断条件和描述方法。
数据结构实验报告
数据结构实验报告一、引言数据结构是计算机科学中的重要概念,它涉及到组织和管理数据的方式和算法。
数据结构实验是计算机科学专业的必修实践课程之一,通过实验,我们可以探索不同的数据结构类型,并理解它们的优势和应用。
本报告旨在总结我在数据结构实验中的学习和实践经验。
二、实验目的本次实验的主要目的是熟练掌握线性表、二叉树和图等常见数据结构的构建与操作方法。
通过编写代码,我们可以加深对这些数据结构的理解并且通过实验验证其性能。
三、实验过程1.线性表实验:在这一部分,我们使用C++语言实现了顺序表和链表两种线性表的数据结构,并比较了它们在插入、删除、查找等操作上的性能差异。
2.二叉树实验:我们在实验中实现了二叉树的构建和遍历算法,包括前序遍历、中序遍历和后序遍历。
通过实验,我们发现不同的遍历算法对于不同的问题有不同的效果。
3.图实验:本次实验中,我们实现了图的邻接矩阵和邻接表两种存储结构,并比较了它们在图的遍历和搜索等操作上的性能差异。
同时,我们还实现了最小生成树和最短路径算法,这些算法对实际应用具有重要意义。
四、实验结果根据我们的实验结果,我们可以得出以下结论:1.对于插入和删除等频繁变动的操作,链表比顺序表更适合,因为链表的插入和删除操作时间复杂度为O(1),而顺序表的插入和删除操作时间复杂度为O(n)。
2.在二叉树的遍历中,前序遍历是最简单和常用的一种方式,而中序遍历和后序遍历在某些特定情况下更有用。
例如,在寻找路径上的节点时,后序遍历可以更方便地找出叶子节点。
3.在图的存储中,邻接表比邻接矩阵更节省空间,特别在稀疏图的情况下。
而邻接矩阵在搜索操作中更高效,因为邻接矩阵可以在O(1)的时间内检查两个节点之间是否存在边。
4.最小生成树和最短路径算法在实际生活中有很多应用,例如在城市规划和网络布线中。
通过实验可以发现,Prim算法和Dijkstra算法都可以有效地解决这些问题。
五、实验总结通过本次实验,我对线性表、二叉树和图等常见数据结构有了更深入的了解,并且通过实践中的编码和测试,提高了我的编程能力和问题解决能力。
数据结构实验报告(实验)
数据结构实验报告(实验)数据结构实验报告(实验)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 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。
数据结构实习报告(共8篇)
数据结构实习报告(共8篇)数据结构实习报告(共8篇)第1篇:数据结构实_报告附件:实_报告格式,如下:数据结构实_报告班级:姓名:xxx(1514)xxx(1514)xxx(1514)指导教师:日期:题目一、问题描述(把你所选的题目及要求说一下)二、概要设计(抽象数据类型定义)三、详细设计(主要算法和函数间的调用关系)四、调试分析(调式过程中出现的问题及如何改正)五、心得体会(组内成员的分工及实_期间的体会)六、用户手册(系统的使用方法介绍)可参照_题集上的实_报告格式。
第2篇:数据结构实_报告数据结构实_报告班级:13软件二班姓名:殷健学号:1345536225子集和数问题1:问题描述子集和数问题1:子集和问题的为W,c。
其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(02:问题分析程序中设计了函数voidputeSumofSub(ints,intk,intr),其意义是从第k项开始,如果s(已经决策的和数)和wk(当前元素)之和为和数,就把结果输出来,否则如果s与,wk,wk+1之和小于和数,则调用puteSumofsub(s+wk,k+1,r-wk),意为选择此结点的左分支,再判断s和后面所有元素之和是否不小于M(所有的加起来都小,必定无解),并且s+wk+1M,也是无解),若条件符合即调用puteSumofSub(s,k+1,r-wk),即选择当前结点的右分支。
算法展示:#includeusingnamespacestd;#include#include#defineM50claSu mOfSubprivate:intwM;intm;intxM;public:SumOfSub(inta,intb, intn)for(inti=0;i=mvoidmain()intsum=0;intwM;srand(unsigne d)time(NULL);for(inti=0;icoutcoutcoutm;sum=m*sum;cout复杂性分析:对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。
数据结构课程实验报告
数据结构课程实验报告目录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、提高编程能力和解决实际问题的能力,能够运用合适的数据结构解决具体的问题。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的实现与操作单向链表的创建、插入和删除节点。
双向链表的实现和基本操作。
循环链表的特点和应用。
2、栈和队列的实现栈的后进先出特性,实现入栈和出栈操作。
队列的先进先出原则,完成入队和出队功能。
3、树的操作二叉树的创建、遍历(前序、中序、后序)。
二叉搜索树的插入、查找和删除操作。
4、图的表示与遍历邻接矩阵和邻接表表示图。
深度优先搜索和广度优先搜索算法的实现。
四、实验步骤及结果1、链表的实现与操作单向链表:首先,定义了链表节点的结构体,包含数据域和指向下一个节点的指针域。
通过创建链表头节点,并使用循环依次插入新节点,实现了链表的创建。
插入节点时,根据指定位置找到插入点的前一个节点,然后修改指针完成插入操作。
删除节点时,同样找到要删除节点的前一个节点,修改指针完成删除。
实验结果:成功创建、插入和删除了单向链表的节点,并正确输出了链表的内容。
双向链表:双向链表节点结构体增加了指向前一个节点的指针。
创建、插入和删除操作需要同时维护前后两个方向的指针。
实验结果:双向链表的各项操作均正常,能够双向遍历链表。
循环链表:使链表的尾节点指向头节点,形成循环。
在操作时需要特别注意循环的边界条件。
实验结果:成功实现了循环链表的创建和遍历。
2、栈和队列的实现栈:使用数组或链表来实现栈。
入栈操作将元素添加到栈顶,出栈操作取出栈顶元素。
实验结果:能够正确进行入栈和出栈操作,验证了栈的后进先出特性。
数据结构(C语言版) 实验报告
数据结构(C语言版) 实验报告数据结构(C语言版) 实验报告1:引言1.1 问题描述在本实验中,我们需要设计一个基于C语言的数据结构,用于解决特定问题。
1.2 目的本实验的目的是通过设计和实现数据结构,加深对数据结构和C语言的理解,并应用所学的知识解决实际问题。
1.3 相关工作在这一章节中,我们将介绍与本实验相关的先前工作,并分析其优缺点,为我们的设计提供参考。
2:需求分析2.1 功能需求本节将详细描述所设计的数据结构需要实现的功能。
2.2 性能需求在这一节中,我们将明确数据结构的性能需求,例如时间复杂度和空间复杂度限制。
3:数据结构设计3.1 数据结构定义在这一节中,我们将给出所设计数据结构的定义,并详细说明每个字段的含义和作用。
3.2 数据结构操作在这一节中,我们将详细描述每个数据结构操作的实现。
这些操作包括插入,删除,查找等。
4:算法设计4.1 算法描述在这一节中,我们将给出在实现数据结构过程中使用的算法的详细描述。
我们将分析算法的时间复杂度,并讨论其优缺点。
4.2 算法优化在这一节中,我们将分析并设计优化算法,以提高数据结构的性能。
5:实验结果在这一节中,我们将给出实验结果,并分析实验数据。
我们还将展示实验中所涉及的示例输入和输出。
6:结论在这一节中,我们将总结本实验的设计和实现,并讨论所得实验结果的意义和潜在的改进方向。
7:附录本文档附带以下附件:- 代码实现:包含所设计数据结构的C语言源代码。
- 实验数据文件:包含用于测试数据结构的示例输入和输出文件。
8:法律名词及注释本文档中涉及的法律名词及注释见附件。
数据结构图实验报告
数据结构图实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构图的基本概念、原理和操作方法,通过实际编程和操作,提高对数据结构的应用能力和解决问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容(一)线性表1、顺序表实现顺序表的创建、插入、删除、查找等基本操作。
分析顺序表在不同操作下的时间复杂度。
2、链表实现单链表、双向链表的创建、插入、删除、查找等基本操作。
比较单链表和双向链表在操作上的优缺点。
(二)栈和队列1、栈实现顺序栈和链式栈。
用栈解决表达式求值问题。
2、队列实现顺序队列和链式队列。
用队列模拟银行排队问题。
(三)树1、二叉树实现二叉树的创建、遍历(前序、中序、后序)。
计算二叉树的深度和节点数。
2、二叉搜索树实现二叉搜索树的插入、删除、查找操作。
分析二叉搜索树的性能。
(四)图1、图的存储实现邻接矩阵和邻接表两种图的存储方式。
比较两种存储方式的优缺点。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
用图的遍历解决最短路径问题。
四、实验步骤(一)线性表1、顺序表定义一个数组来存储顺序表的元素,并使用一个变量记录当前表的长度。
插入操作时,需要判断插入位置是否合法,如果合法则将插入位置后的元素依次向后移动一位,然后将新元素插入指定位置。
删除操作时,先判断删除位置是否合法,合法则将删除位置后的元素依次向前移动一位,并更新表的长度。
查找操作通过遍历数组来实现。
分析不同操作的时间复杂度,插入和删除操作在最坏情况下为O(n),查找操作在平均情况下为 O(n/2)。
2、链表对于单链表,定义一个节点结构体,包含数据域和指向下一个节点的指针域。
通过操作指针来实现插入、删除和查找操作。
双向链表则在节点结构体中增加指向前一个节点的指针,使得操作更加灵活,但也增加了空间复杂度。
比较单链表和双向链表在插入、删除操作中指针的调整过程,得出双向链表在某些情况下更方便,但空间开销较大的结论。
数据结构实验报告
数据结构实验报告一、实验目的数据结构是计算机科学中的重要基础课程,通过本次实验,旨在加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解和运用,提高编程能力和问题解决能力,培养算法设计和分析的思维。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、数组与链表的实现与操作分别实现整数数组和整数链表的数据结构。
实现数组和链表的插入、删除、查找操作,并比较它们在不同操作下的时间复杂度。
2、栈与队列的应用用数组实现栈结构,用链表实现队列结构。
模拟栈的入栈、出栈操作和队列的入队、出队操作,解决实际问题,如表达式求值、任务调度等。
3、二叉树的遍历构建二叉树的数据结构。
实现先序遍历、中序遍历和后序遍历三种遍历算法,并输出遍历结果。
4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。
实现图的深度优先搜索(DFS)和广度优先搜索(BFS)算法,并分析它们的时间复杂度。
四、实验步骤1、数组与链表数组的实现:定义一个固定大小的整数数组,通过索引访问和操作数组元素。
链表的实现:定义链表节点结构体,包含数据和指向下一个节点的指针。
插入操作:对于数组,若插入位置在末尾,直接赋值;若不在末尾,需移动后续元素。
对于链表,找到插入位置的前一个节点,修改指针。
删除操作:数组需移动后续元素,链表修改指针即可。
查找操作:数组通过索引直接访问,链表需逐个节点遍历。
2、栈与队列栈的实现:用数组模拟栈,设置栈顶指针。
队列的实现:用链表模拟队列,设置队头和队尾指针。
入栈和出栈操作:入栈时,若栈未满,将元素放入栈顶,栈顶指针加 1。
出栈时,若栈不为空,取出栈顶元素,栈顶指针减 1。
入队和出队操作:入队时,在队尾添加元素。
出队时,取出队头元素,并更新队头指针。
3、二叉树构建二叉树:采用递归方式创建二叉树节点。
先序遍历:先访问根节点,再递归遍历左子树,最后递归遍历右子树。
中序遍历:先递归遍历左子树,再访问根节点,最后递归遍历右子树。
大学数据结构实验报告模板
大学数据结构实验报告模板一、实验目的数据结构实验是计算机相关专业课程中的重要实践环节,通过实验可以加深对数据结构理论知识的理解,提高编程能力和解决实际问题的能力。
本次实验的主要目的包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。
2、学会运用数据结构解决实际问题,培养算法设计和分析能力。
3、提高程序设计的规范性和代码质量,培养良好的编程习惯。
4、熟悉编程语言(如C、C++、Java 等)的开发环境和调试技巧。
二、实验环境1、操作系统:_____2、编程语言:_____3、开发工具:_____三、实验内容(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构。
实现顺序表的初始化、插入、删除、查找等基本操作。
2、链表的实现定义链表的数据结构(单链表、双向链表或循环链表)。
实现链表的创建、遍历、插入、删除等操作。
(二)栈和队列的实现与应用1、栈的实现定义栈的数据结构。
实现栈的入栈、出栈、栈顶元素获取等操作。
利用栈解决括号匹配、表达式求值等问题。
2、队列的实现定义队列的数据结构。
实现队列的入队、出队、队头元素获取等操作。
利用队列实现广度优先搜索、任务调度等应用。
(三)树的实现与遍历1、二叉树的实现定义二叉树的数据结构(二叉链表或顺序存储)。
实现二叉树的创建、前序遍历、中序遍历、后序遍历。
2、二叉搜索树的实现实现二叉搜索树的插入、删除、查找操作。
3、平衡二叉树(如 AVL 树)的实现(选做)理解平衡二叉树的平衡调整算法。
实现平衡二叉树的插入和删除操作,并保持树的平衡。
(四)图的表示与遍历1、图的邻接矩阵和邻接表表示定义图的数据结构(邻接矩阵或邻接表)。
实现图的创建和初始化。
2、图的深度优先遍历和广度优先遍历实现图的深度优先遍历和广度优先遍历算法。
应用图的遍历解决最短路径、连通性等问题。
(五)排序算法的实现与性能比较1、常见排序算法的实现实现冒泡排序、插入排序、选择排序、快速排序、归并排序等算法。
数据结构课程实验报告(6)
课程实验报告课程名称:数据结构专业班级:信息安全1302学号:姓名:指导教师:报告日期:计算机科学与技术学院目录1 课程实验概述 (3)2 实验一基于顺序结构的线性表实现2.1 问题描述 (3)2.2 系统设计 (3)2.3 系统实现 (8)2.4 效率分析 (10)3 实验二基于链式结构的线性表实现3.1 问题描述 (11)3.2 系统设计 (11)3.3 系统实现 (16)3.4 效率分析 (18)4 实验三基于二叉链表的二叉树实现4.1 问题描述 (19)4.2 系统设计 (19)4.3 系统实现 (30)4.4 效率分析 (35)5 实验总结与评价 (36)1课程实验概述本课程实验基于数据结构课程的理论知识。
要求我们用C语言实现顺序结构线性表,链式结构顺序表以及二叉树结构的链式表三种数据结构,并实现它们相应的基本操作。
通过本实验,我们可以比较这三种数据结构的相似之处,区别以及应用场景,在以后处理问题时可以根据不同的情况采用不同的数据结构,本实验加强了我们编写代码的能力,加深了我们对数据结构的理解,下面将分成三部分依次介绍基于顺序结构的线性表实现,基于链式结构的线性表实现以及基于二叉链表的二叉树实现。
2 实验一基于顺序结构的线性表实现2.1 问题描述基于顺序存储结构,实现线性表的基本的,常见的运算(1)提供一个实现功能的演示系统;(2)具体物理结构和数据元素类型自行选定;2.2 系统设计2.2.1 总括本系统共实现了顺序线性表的13种基本操作,开始先定义了一个顺序表结构体:typedef struct{ElemType * elem;int length;int listsize;}SqList;其中定义了一个ElemType类型的数组,用来存放数据,表的长度由length存储,表的最大大小用listsize存储。
接下来声明了13个基本操作函数,在main函数中编写了一个简单的功能系统界面,用户在使用时可以输入序号来调用各个函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告实验六图的应用及其实现一、实验目的1.进一步功固图常用的存储结构。
2.熟练掌握在图的邻接表实现图的基本操作。
3.理解掌握AOV网、AOE网在邻接表上的实现以及解决简单的应用问题。
二、实验内容一>.基础题目:(本类题目属于验证性的,要求学生独立完成) [题目一]:从键盘上输入AOV网的顶点和有向边的信息,建立其邻接表存储结构,然后对该图拓扑排序,并输出拓扑序列. 试设计程序实现上述AOV网的类型定义和基本操作,完成上述功能。
[题目二]:从键盘上输入AOE网的顶点和有向边的信息,建立其邻接表存储结构,输出其关键路径和关键路径长度。
试设计程序实现上述AOE网类型定义和基本操作,完成上述功能。
测试数据:教材图7.29【题目五】连通OR 不连通描述:给定一个无向图,一共n个点,请编写一个程序实现两种操作:D x y 从原图中删除连接x,y节点的边。
Q x y 询问x,y节点是否连通输入第一行两个数n,m(5<=n<=40000,1<=m<=100000)接下来m行,每行一对整数 x y (x,y<=n),表示x,y之间有边相连。
保证没有重复的边。
接下来一行一个整数 q(q<=100000)以下q行每行一种操作,保证不会有非法删除。
输出按询问次序输出所有Q操作的回答,连通的回答C,不连通的回答D样例输入3 31 21 32 35Q 1 2D 1 2Q 1 2D 3 2Q 1 2样例输出CCD【题目六】 Sort ProblemAn ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.【Input】Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n<= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. 1 <= m <= 100. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.【Output】For each problem instance, output consists of one line. This line should be one of the following three:Sorted sequence determined: y y y… y.Sorted sequence cannot be determined.Inconsistency found.y y y… y is the sorted, ascending sequence.Sample Input Sample Output4 6 Sorted sequence determined: A B C D. A<B Inconsistency found.A<C Sorted sequence cannot be determined. B<CC<DB<DA<B3 2A<BB<A26 2A<ZD<S0 0设计要求:1、上机前,认真学习教材,熟练掌握AOV网、AOE网的构造和拓扑排序算法。
2、上机前,认真独立地写出本次程序清单,流程图,该程序包括图类型以及每一种操作的具体的函数定义和主函数。
有关算法分别参阅讲义和参考教材事例三、实验步骤㈠、数据结构与核心算法的设计描述#define MAX_VERTEX_NUM 20//变量声明typedef struct ArcNode//弧结点定义{int adjvex; //该弧所指向的顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针//InfoType *info;}ArcNode;typedef struct VNode//顶点结点定义{char data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct//图的定义{AdjList vertices;int vexnum,arcnum; //图的当前顶点数和弧数int kind; //图的种类标志}ALGraph;ALGraph G; //定义图变量bool visited[MAX_VERTEX_NUM]; //访问标志数组int indegree[MAX_VERTEX_NUM];//入度数组struct Stack//栈类型定义{int s[21];int top;};Stack stack;//定义一个栈相关函数声明:void CreateGraph(MGraph &G)// 输入图的顶点和边的信息,建立图void DFSTraverse(Graph G, int v)//深度优先搜索遍历图void BFSTraverse(Graph G, int v)//广度优先搜索遍历图int LocateVertices(ALGraph G,char a)//查找字符a在图中的位置int FirstAdjVex(ALGraph G,int v)//查找图中位置v的第一个邻接点在图中所在的位置int NextAdjVex(ALGraph G,int v,int w)//查找相对于图中位置v的邻接点w的下一邻接点在图中的位置void DestroyGraph(ALGraph &G)//销毁图void InitStack(Stack &stack)//初始化栈void PushStack(Stack &stack,int i)//元素i入栈void PopStack(Stack &stack,int &i)//栈顶元素出栈int StackEmpty(Stack stack)//判断栈是否为空,若为空则返回1,否则返回0void FindInDegree(ALGraph G,int *indegree)//求图中各个顶点的入度,并相应的存入入度数组中indegree[]int TopologicalSort(ALGraph G)//对图进行拓扑排序,并输出相应的拓扑序列㈡、函数调用及主函数设计㈢程序调试及运行结果分析由于以前已经做过了关于图的一些算法设计,例如:图的深度优先遍历,广度优先遍历等,因此,这次试验基本没有什么错误。
㈣实验总结这次的实验使得我对图的定义及其更多的操作有了更深入的了解,运用起来更加地熟练,掌握了拓扑排序的书写,利用栈实现图的拓扑排序的算法与分析问题的能力,让我能够对以前的知识有所复习,例如:栈的使用。
对以前的知识有了更深入的理解,例如:图的数据结构及算法实现,图的存储结构。
这是我收获最大的地方。
四、主要算法流程图及程序清单1、主要算法流程图:查找相对于图中位置v的邻接点w的下一邻接点在图中的位置int NextAdjVex(ALGraph G,int v,int w)利用邻接有向图voidCreateGraph(ALGraph &G)否是查找图中位置v的第一个邻接点在图中所在的位置int FirstAdjVex(ALGraph G,int v)对图进行拓扑排序,并输出相应的拓扑序列#include<iostream.h>#include<stdlib.h>#define MAX_VERTEX_NUM 20typedef struct ArcNode//弧结点定义{int adjvex; //该弧所指向的顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针//InfoType *info;}ArcNode;typedef struct VNode//顶点结点定义{char data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct//图的定义{AdjList vertices;int vexnum,arcnum; //图的当前顶点数和弧数int kind; //图的种类标志}ALGraph;ALGraph G; //定义图变量bool visited[MAX_VERTEX_NUM]; //访问标志数组int indegree[20]; //各结点入度数组struct Stack//栈类型定义{int s[21];int top;};Stack stack; //定义一个栈int LocateVertices(ALGraph G,char a)//查找字符a在图中的位置{for(int i=0;i<G.vexnum;i++)if(G.vertices[i].data==a)return i;return -1;}void CreateGraph(ALGraph &G)//利用邻接表存储结构构造有向图{int a,b;char s;ArcNode *p;cout<<endl<<"现在要构造一个有向图"<<endl;cout<<"请输入顶点个数和图中弧的个数"<<endl;cin>>G.vexnum>>G.arcnum;cout<<"请输入各个顶点的值,顶点的值类型为字符类型"<<endl;for(int i=0;i<G.vexnum;i++){cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;}cout<<"请输入图中各个弧"<<endl<<"(每一个弧用其所依附的两个顶点值表示,先输入弧尾顶点值,再输入弧头顶点值)"<<endl;for(i=1;i<=G.arcnum;i++){cin>>s;a=LocateVertices(G,s);cin>>s;b=LocateVertices(G,s);p=new ArcNode;if(!p)return;p->adjvex=b;p->nextarc=G.vertices[a].firstarc;G.vertices[a].firstarc=p;}}int FirstAdjVex(ALGraph G,int v)//查找图中位置v的第一个邻接点在图中所在的位置{if(G.vertices[v].firstarc)return G.vertices[v].firstarc->adjvex;return -1;}int NextAdjVex(ALGraph G,int v,int w)//查找相对于图中位置v的邻接点w的下一邻接点在图中的位置{ArcNode *p;p=G.vertices[v].firstarc;while(p->adjvex!=w)p=p->nextarc;if(p->nextarc)return p->nextarc->adjvex;return -1;}void DestroyGraph(ALGraph &G)//销毁图{ArcNode *p,*p1;for(int i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;if(p)p1=p->nextarc;while(p){delete p;p=p1;if(p1)p1=p1->nextarc;}}}void InitStack(Stack &stack)//初始化栈{stack.top=0;}void PushStack(Stack &stack,int i)//元素i入栈{stack.s[stack.top++]=i;}void PopStack(Stack &stack,int &i)//栈顶元素出栈{i=stack.s[--stack.top];}int StackEmpty(Stack stack)//判断栈是否为空,若为空则返回1,否则返回0{if(!stack.top)return 1;return 0;}void FindInDegree(ALGraph G,int *indegree)//求图中各个顶点的入度,并相应的存入入度数组中indegree[] {ArcNode *p;for(int i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){indegree[p->adjvex]++;p=p->nextarc;}}}int TopologicalSort(ALGraph G)//对图进行拓扑排序,并输出相应的拓扑序列{int count=0,w;FindInDegree(G,indegree);for(int i=0;i<G.vexnum;i++)if(!indegree[i])PushStack(stack,i);while(!StackEmpty(stack)){PopStack(stack,i);cout<<G.vertices[i].data<<" ";count++;for(w=FirstAdjVex(G,i);w>=0;w=NextAdjVex(G,i,w)) if(!(--indegree[w]))PushStack(stack,w);}if(count<G.vexnum)return -1;return 1;}void main(){CreateGraph(G);cout<<endl<<"拓扑排序的结果如下:"<<endl;if(!TopologicalSort(G))cout<<"图中存在有环"<<endl;cout<<endl;DestroyGraph(G);}题目二:#include<iostream.h>#include<stdlib.h>#define MAX_VERTEX_NUM 20typedef struct ArcNode//弧结点定义{int adjvex; //该弧所指向的顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针int info;}ArcNode;typedef struct VNode//顶点结点定义{char data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct//图的定义{AdjList vertices;int vexnum,arcnum; //图的当前顶点数和弧数int kind; //图的种类标志}ALGraph;ALGraph G; //定义图变量bool visited[MAX_VERTEX_NUM]; //访问标志数组int indegree[20]; //各结点入度数组int ve[20]; //定义顶点最早开始时间存储数组int vl[20]; //定义顶点最迟开始时间存储数组struct Stack//栈类型定义{int s[21];int top;};Stack stack; //定义一个栈,用于拓扑排序时存储入度为0的顶点Stack stack1; //存储逆拓扑排序有序序列Stack stack2; //存储关键路径int LocateVertices(ALGraph G,char a)//查找字符a在图中的位置{for(int i=0;i<G.vexnum;i++)if(G.vertices[i].data==a)return i;return -1;}void CreateGraph(ALGraph &G)//利用邻接表存储结构构造有向图{int a,b;char s;ArcNode *p;cout<<endl<<"现在要构造一个有向图"<<endl;cout<<"请输入顶点个数和图中弧的个数"<<endl;cin>>G.vexnum>>G.arcnum;cout<<"请输入各个顶点的值,顶点的值类型为字符类型"<<endl;for(int i=0;i<G.vexnum;i++){cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;}cout<<"请输入图中各个弧"<<endl<<"(每一个弧用其所依附的两个顶点值表示,先输入弧尾顶点值,再输入弧头顶点值)"<<endl;for(i=1;i<=G.arcnum;i++){cin>>s;a=LocateVertices(G,s);cin>>s;b=LocateVertices(G,s);p=new ArcNode;if(!p)return;p->adjvex=b;cout<<"请输入该弧的长度"<<endl;cin>>p->info;p->nextarc=G.vertices[a].firstarc;G.vertices[a].firstarc=p;}}void DestroyGraph(ALGraph &G)//销毁图{ArcNode *p,*p1;for(int i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;if(p)p1=p->nextarc;while(p){delete p;p=p1;if(p1)p1=p1->nextarc;}}}void InitStack(Stack &stack)//初始化栈{stack.top=0;}void PushStack(Stack &stack,int i)//元素i入栈{stack.s[stack.top++]=i;}void PopStack(Stack &stack,int &i)//栈顶元素出栈{i=stack.s[--stack.top];}int StackEmpty(Stack stack)//判断栈是否为空,若为空则返回1,否则返回0 {if(!stack.top)return 1;return 0;}int GetTopStack(Stack stack)//获得栈顶元素{return stack.s[stack.top-1];}void FindInDegree(ALGraph G,int *indegree)//求图中各个顶点的入度,并相应的存入入度数组中indegree[]{ArcNode *p;for(int i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){indegree[p->adjvex]++;p=p->nextarc;}}}int TopologicalSort(ALGraph G)//对图进行拓扑排序,并输出相应的拓扑序列{int count=0;ArcNode *p;FindInDegree(G,indegree);InitStack(stack);InitStack(stack1);for(int i=0;i<G.vexnum;i++)ve[i]=0;for(i=0;i<G.vexnum;i++)if(!indegree[i])PushStack(stack,i);while(!StackEmpty(stack)){PopStack(stack,i);PushStack(stack1,i);count++;for(p=G.vertices[i].firstarc;p;p=p->nextarc){if(!(--indegree[p->adjvex]))PushStack(stack,p->adjvex);if(ve[i]+p->info>ve[p->adjvex])ve[p->adjvex]=ve[i]+p->info;}}if(count<G.vexnum)return -1;return 1;}int CriticalPath(ALGraph G)//求关键活动,并输出所有活动,关键活动用*标志,同时获得关键路径的逆序序列{char tag;int j,sum=0;ArcNode *p;InitStack(stack2);PushStack(stack2,0);if(TopologicalSort(G)==-1)return -1;for(int i=0;i<G.vexnum;i++)vl[i]=ve[G.vexnum-1];while(!StackEmpty(stack1))for(PopStack(stack1,j),p=G.vertices[j].firstarc;p;p=p->nextarc) if(vl[p->adjvex]-p->info<vl[j])vl[j]=vl[p->adjvex]-p->info;for(j=0;j<G.vexnum;j++)for(p=G.vertices[j].firstarc;p;p=p->nextarc){tag=(ve[j]==vl[p->adjvex]-p->info)?'*':' ';cout<<G.vertices[j].data<<""<<G.vertices[p->adjvex].data<<" "<<p->info<<" "<<ve[j]<<" "<<vl[p->adjvex]-p->adjvex<<" "<<tag<<endl;if(j==GetTopStack(stack2)&&tag=='*'){PushStack(stack2,p->adjvex);sum+=p->info;}}cout<<endl<<"关键路径的长度为:"<<sum<<endl;return 1;}void main(){CreateGraph(G);CriticalPath(G);cout<<"该图其中之一的关键路径为:"<<endl;int i;while(!StackEmpty(stack2)){PopStack(stack2,i);cout<<G.vertices[i].data<<" ";}cout<<endl;DestroyGraph(G);}题目五:#include<iostream.h>#include<stdlib.h>#define MAX_VERTEX_NUM 20typedef struct ArcNode{int adjvex; //该弧所指向的顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针//InfoType *info;}ArcNode;typedef struct VNode{char data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct{AdjList vertices;int vexnum,arcnum; //图的当前顶点数和弧数int kind; //图的种类标志}ALGraph;ALGraph G; //定义图变量bool visited[MAX_VERTEX_NUM]; //访问标志数组int num=0;bool found=false;int LocateVertices(ALGraph G,char a)//查找字符a在图中的位置{for(int i=0;i<G.vexnum;i++)if(G.vertices[i].data==a)return i;return -1;}int LocateArc(ALGraph G,char a,char b)//判断弧ab是否已经存在于图中,若已经存在则返回1,否则返回0 {ArcNode *p;if(LocateVertices(G,a)>=0){p=G.vertices[LocateVertices(G,a)].firstarc;while(p&&p->adjvex!=LocateVertices(G,b))p=p->nextarc;if(p)return 1;return 0;}return 0;}void CreateGraph(ALGraph &G)//利用邻接表存储结构构造有向图{int a,b;char s1,s2;ArcNode *p;for(int i=0;i<G.vexnum;i++){G.vertices[i].data='#';G.vertices[i].firstarc=NULL;}for(i=1;i<=G.arcnum;i++){cin>>s1;a=LocateVertices(G,s1);if(a<0){num++;G.vertices[num-1].data=s1;a=LocateVertices(G,s1);}cin>>s2;b=LocateVertices(G,s2);if(b<0){num++;G.vertices[num-1].data=s2;b=LocateVertices(G,s2);}if(!LocateArc(G,s1,s2)){p=new ArcNode;if(!p)return;p->adjvex=b;p->nextarc=G.vertices[a].firstarc;G.vertices[a].firstarc=p;p=new ArcNode;if(!p)return;p->adjvex=a;p->nextarc=G.vertices[b].firstarc;G.vertices[b].firstarc=p;}}}int FirstAdjVex(ALGraph G,int v)//查找图中位置v的第一个邻接点在图中所在的位置{if(G.vertices[v].firstarc)return G.vertices[v].firstarc->adjvex;return -1;}int NextAdjVex(ALGraph G,int v,int w)//查找相对于图中位置v的邻接点w的下一邻接点在图中的位置{ArcNode *p;p=G.vertices[v].firstarc;while(p->adjvex!=w)p=p->nextarc;if(p->nextarc)return p->nextarc->adjvex;return -1;}void DestroyGraph(ALGraph &G)//销毁图{ArcNode *p,*p1;for(int i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;if(p)p1=p->nextarc;while(p){delete p;p=p1;if(p1)p1=p1->nextarc;}}}void DFSearch(ALGraph G,int i,int s)//查找i与s之间是否有路径,以此来判断二者是否连通,若连通found=true,否则found=false{int w;// for(int x=0;x<G.vexnum;x++)// visited[x]=false;visited[i]=true;for(w=FirstAdjVex(G,i);w>=0&&!found;w=NextAdjVex(G,i,w) ){if(w==s){found=true;visited[s]=true;}else if(!visited[w])DFSearch(G,w,s);}}void DeleteArc(ALGraph &G,char a,char b)//删除有向边ab{ArcNode *p,*p1;if(LocateVertices(G,a)>=0){p1=G.vertices[LocateVertices(G,a)].firstarc;while(p1&&p1->adjvex!=LocateVertices(G,b)){p=p1;p1=p1->nextarc;}if(!p1)return;if(p1==G.vertices[LocateVertices(G,a)].firstarc){G.vertices[LocateVertices(G,a)].firstarc=p1->nextarc;free(p1);}else{p->nextarc=p1->nextarc;free(p1);}}return;}void main(){char a,b,k;int n;cin>>G.vexnum>>G.arcnum;CreateGraph(G);cin>>n;for(int i=1;i<=n;i++){found=false;cin>>k;switch(k){case 'Q':cin>>a>>b;int x;for(x=0;x<G.vexnum;x++)visited[x]=false;DFSearch(G,LocateVertices(G,a),LocateVertices(G,b));if(found){cout<<"C"<<endl;}else{cout<<"D"<<endl;}break;case 'D':cin>>a>>b;DeleteArc(G,a,b);DeleteArc(G,b,a);break;default:cout<<"输入有误"<<endl;break;}}DestroyGraph(G);}题目六:#include<iostream.h>#include<stdlib.h>#define MAX_VERTEX_NUM 28typedef struct ArcNode//弧结点定义{int adjvex; //该弧所指向的顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针//InfoType *info;}ArcNode;typedef struct VNode//顶点结点定义{char data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct//图的定义{AdjList vertices;int vexnum,arcnum; //图的当前顶点数和弧数int kind; //图的种类标志}ALGraph;ALGraph G; //定义图变量bool visited[MAX_VERTEX_NUM]; //访问标志数组int indegree[28]; //各结点入度数组int num=0; //记录顶点字符种类数char a[28]; //存储拓扑排序序列struct Stack//栈类型定义{int s[21];int top;};Stack stack; //定义一个栈int LocateVertices(ALGraph G,char a)//查找字符a在图中的位置{for(int i=0;i<G.vexnum;i++)if(G.vertices[i].data==a)return i;return -1;}int LocateArc(ALGraph G,char a,char b)//判断弧ab是否已经存在于图中,若已经存在则返回1,否则返回0 {ArcNode *p;if(LocateVertices(G,a)>=0){p=G.vertices[LocateVertices(G,a)].firstarc;while(p&&p->adjvex!=LocateVertices(G,b))p=p->nextarc;if(p)return 1;return 0;}return 0;}void CreateGraph(ALGraph &G)//利用邻接表存储结构构造有向图{int a,b;char s1,s2;ArcNode *p;for(int i=0;i<G.vexnum;i++){G.vertices[i].data='#';G.vertices[i].firstarc=NULL;}for(i=1;i<=G.arcnum;i++){cin>>s1;a=LocateVertices(G,s1);if(a<0){num++;G.vertices[num-1].data=s1;a=LocateVertices(G,s1);}cin>>s2;cin>>s2;b=LocateVertices(G,s2);if(b<0){num++;G.vertices[num-1].data=s2;b=LocateVertices(G,s2);}if(!LocateArc(G,s1,s2)){p=new ArcNode;if(!p)return;p->adjvex=b;p->nextarc=G.vertices[a].firstarc;G.vertices[a].firstarc=p;}}}int FirstAdjVex(ALGraph G,int v)//查找图中位置v的第一个邻接点在图中所在的位置{if(G.vertices[v].firstarc)return G.vertices[v].firstarc->adjvex;return -1;}int NextAdjVex(ALGraph G,int v,int w)//查找相对于图中位置v的邻接点w的下一邻接点在图中的位置{ArcNode *p;p=G.vertices[v].firstarc;while(p->adjvex!=w)p=p->nextarc;if(p->nextarc)return p->nextarc->adjvex;return -1;}void DestroyGraph(ALGraph &G)//销毁图{ArcNode *p,*p1;for(int i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;if(p)p1=p->nextarc;while(p){delete p;p=p1;if(p1)p1=p1->nextarc;}}}void InitStack(Stack &stack)//初始化栈{stack.top=0;}void PushStack(Stack &stack,int i)//元素i入栈{stack.s[stack.top++]=i;}void PopStack(Stack &stack,int &i)//栈顶元素出栈{i=stack.s[--stack.top];}int StackEmpty(Stack stack)//判断栈是否为空,若为空则返回1,否则返回0{if(!stack.top)return 1;return 0;}void FindInDegree(ALGraph G,int *indegree)//求图中各个顶点的入度,并相应的存入入度数组中indegree[]{ArcNode *p;for(int i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){indegree[p->adjvex]++;p=p->nextarc;}}}int TopologicalSort(ALGraph G)//对图进行拓扑排序,并存储相应的拓扑序列{int count=0,w;FindInDegree(G,indegree);for(int i=0;i<G.vexnum;i++)if(!indegree[i])PushStack(stack,i);while(!StackEmpty(stack)){PopStack(stack,i);a[count]=G.vertices[i].data;count++;for(w=FirstAdjVex(G,i);w>=0;w=NextAdjVex(G,i,w)) if(!(--indegree[w]))PushStack(stack,w);}if(count<G.vexnum)return -1;return 1;}void SortProblem(ALGraph G)//解决问题的函数{if(TopologicalSort(G)==-1)cout<<"Inconsistency found."<<endl;elseif(num<G.vexnum)cout<<"Sorted sequence cannot be determined."<<endl; else{cout<<"Sorted sequence determined: ";for(int i=0;i<G.vexnum;i++)cout<<a[i]<<" ";cout<<"."<<endl;}}void main(){G.vexnum=1;G.arcnum=1;while(G.vexnum&&G.arcnum){num=0;cin>>G.vexnum>>G.arcnum;CreateGraph(G);if(G.vexnum&&G.arcnum){SortProblem(G);}DestroyGraph(G);}}。