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

《数据结构》实验报告姓名:学号:班级:学院:实验一单链表实验(一)实验目的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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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);}}。