南京工业大学 数据结构 实验报告6-7
数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。
二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。
在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。
三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。
2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。
3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。
4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。
5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。
四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。
2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。
通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。
3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。
链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。
在实现链表时,我们定义了一个节点结构,包含数据域和指针域。
通过指针的方式将节点连接起来,形成一个链式结构。
同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。
4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。
《数据结构》实验报告

《数据结构》实验报告目录一、实验概述 (2)二、实验原理 (2)2.1 数据结构基本概念 (3)2.2 选择的数据结构类型 (4)2.3 实验原理说明 (5)三、实验步骤 (6)3.1 实验准备 (7)3.2 数据结构选择与实现 (7)3.2.1 数据结构类型选择 (9)3.2.2 数据结构实现细节 (9)3.3 实验功能实现 (10)3.3.1 功能一 (11)3.3.2 功能二 (12)四、实验结果与分析 (13)4.1 实验数据 (15)4.2 结果展示 (16)4.2.1 结果一展示 (17)4.2.2 结果二展示 (17)4.3 结果分析 (18)4.3.1 结果一分析 (19)4.3.2 结果二分析 (20)五、实验总结与讨论 (22)5.1 实验总结 (23)5.2 实验中遇到的问题及解决方法 (24)5.3 对数据结构的认识与体会 (25)5.4 对实验教学的建议 (27)一、实验概述本次实验旨在通过实际操作,加深对《数据结构》课程中所学理论知识的理解和掌握。
实验内容围绕数据结构的基本概念、常用算法以及在实际应用中的实现进行设计。
通过本次实验,学生将能够:理解并掌握线性表、栈、队列、链表、树、图等基本数据结构的特点和适用场景。
掌握常用的数据结构操作算法,如插入、删除、查找等,并能够运用这些算法解决实际问题。
学习使用C++、或其他编程语言实现数据结构的操作,提高编程能力和算法设计能力。
本次实验报告将对实验的目的、内容、步骤、结果及分析等方面进行详细阐述,旨在通过实验过程的学习,提高学生对数据结构理论知识的理解和应用能力。
二、实验原理数据结构的基本概念:介绍数据结构的基本定义,包括数据元素、数据集合、数据关系等基本概念,以及数据结构的三要素:逻辑结构、存储结构和运算。
栈和队列:介绍栈和队列的定义、特点、基本运算及其在算法设计中的重要性。
树和二叉树:讲解树的基本概念、二叉树的结构特点、遍历方法、二叉搜索树及其在数据检索中的应用。
数据结构实验报告

数据结构实验报告数据结构实验报告1-引言本实验旨在深入理解数据结构的基本知识,并通过实践掌握相关算法和数据结构的应用。
本报告详细描述了实验的背景、目的、实验环境、实验内容和实验结果分析等内容。
2-实验背景介绍数据结构的概念和作用,解释为什么数据结构在计算机科学中至关重要。
同时,介绍本次实验所涉及的具体数据结构和算法,如数组、链表、栈、队列、二叉树等。
3-实验目的明确本次实验的目标,如掌握数据结构的基本操作,理解不同数据结构的适用场景,评估不同算法的时间和空间复杂度等。
4-实验环境描述实验所使用的软硬件环境,包括计算机配置、操作系统、编程语言和相关的开发工具等。
5-实验内容详细描述实验的具体步骤和要求,包括以下几个部分:5-1 数据结构的创建和初始化:例如,创建一个数组或链表,并初始化数据。
5-2 数据结构的插入和删除操作:例如,在数组中插入一个元素或删除一个元素。
5-3 数据结构的遍历和搜索:例如,遍历树的节点或搜索链表中指定的元素。
5-4 数据结构的排序和查找:例如,对数组进行排序或在有序链表中查找指定元素。
5-5 实验的额外要求:例如,优化算法的实现、分析不同数据结构的性能等。
6-实验结果分析对实验的结果进行详细的分析和解释,包括各个数据结构和算法的性能比较、时间复杂度和空间复杂度的评估等。
7-结论总结本次实验的主要内容和收获,归纳实验结果,并对实验过程中遇到的问题和不足进行反思和改进。
附件:随报告一同提交的附件包括:源代码、实验数据集等相关文件。
法律名词及注释:1-版权:指作品的创作权、发表权和署名权等综合权利。
2-侵权:指未经权利人允许,在未向权利人支付报酬的情况下,使用受版权保护的作品的行为。
3-知识产权:包括著作权、商标权、专利权等,是指人们在创造性劳动中创造出的精神财富所享有的权利。
数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告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一.实验内容:实现哈夫曼编码的生成算法。
数据结构_实验六_报告

实验报告实验六图的应用及其实现一、实验目的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网的构造和拓扑排序算法。
数据结构 实验报告

数据结构实验报告数据结构是计算机科学中重要的概念之一,它是计算机存储、组织数据的方式和方法。
在计算机科学的课程中,数据结构通常是一门重要的课程,也是程序设计的基础。
本文将围绕数据结构展开,介绍其基本概念、分类和应用。
一、基本概念数据结构是指数据元素之间的关系和操作方法的集合。
它包括两个方面的内容,一是数据元素之间的逻辑关系,二是数据元素的存储结构。
数据元素之间的逻辑关系可以是线性关系(如线性表、队列、栈等),也可以是非线性关系(如树、图等)。
数据元素的存储结构可以是顺序存储结构(如数组),也可以是链式存储结构(如链表)。
二、分类根据数据元素之间的关系,数据结构可以分为线性结构和非线性结构。
线性结构是指数据元素之间存在一对一的关系,如线性表、队列、栈等;非线性结构是指数据元素之间存在一对多或多对多的关系,如树、图等。
根据数据元素的存储结构,数据结构可以分为顺序存储结构和链式存储结构。
顺序存储结构是指数据元素按照一定的顺序存放在连续的存储单元中,如数组;链式存储结构是指数据元素按照不同的存储地址存放在不同的存储单元中,通过指针来连接,如链表。
三、应用数据结构在计算机科学中有广泛的应用。
首先,它是算法设计和分析的基础。
算法是解决问题的方法和步骤,而数据结构是算法的载体。
不同的数据结构适用于不同的算法,选择合适的数据结构可以提高算法的效率。
数据结构在数据库系统中起着重要的作用。
数据库是指存储和管理大量数据的系统,而数据结构是数据库的内部实现方式。
合理的数据结构设计可以提高数据库的查询和操作效率。
数据结构在图形学和计算机图像处理中也有重要的应用。
图形学是研究计算机图像的表示和处理方法的领域,而数据结构是图形学算法的基础。
例如,二叉树广泛应用于图形学中的空间划分和三维模型的表示。
数据结构还在人工智能和机器学习中发挥着重要的作用。
人工智能是研究如何使计算机能够模拟人类智能的学科,而机器学习是人工智能的一个重要分支。
数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。
具体目标包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。
2、学会运用数据结构解决实际问题,培养算法设计和分析的能力。
3、提高程序设计的规范性和可读性,培养良好的编程习惯。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容本次实验共包括以下几个部分:(一)线性表的实现与操作1、顺序表的实现定义一个顺序表结构体,包含数据元素数组和表的长度。
实现顺序表的初始化、插入、删除、查找等基本操作。
2、链表的实现定义链表节点结构体,包含数据域和指针域。
实现链表的创建、插入、删除、遍历等操作。
(二)栈和队列的实现与应用1、栈的实现采用顺序存储或链式存储实现栈。
实现栈的入栈、出栈、栈顶元素获取等操作,并应用于表达式求值。
2、队列的实现用循环队列或链式队列实现队列。
实现队列的入队、出队、队头元素获取等操作,应用于模拟排队系统。
(三)树的基本操作与遍历1、二叉树的实现定义二叉树节点结构体,包含数据域、左子树指针和右子树指针。
实现二叉树的创建、插入、删除节点等操作。
2、二叉树的遍历分别实现前序遍历、中序遍历和后序遍历,并输出遍历结果。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图定义图的结构体,使用邻接矩阵和邻接表两种方式存储图的信息。
实现图的创建、添加边等操作。
2、图的遍历分别用深度优先搜索(DFS)和广度优先搜索(BFS)遍历图,并输出遍历序列。
四、实验步骤(一)线性表的实现与操作1、顺序表的实现首先,定义了一个结构体`SeqList` 来表示顺序表,其中包含一个整数数组`data` 用于存储数据元素,以及一个整数`length` 表示表的当前长度。
在初始化函数`InitSeqList` 中,将表的长度初始化为 0,并分配一定的存储空间给数组。
数据结构图实验报告

数据结构图实验报告数据结构图实验报告1. 引言数据结构是计算机科学中的重要概念之一,它研究数据的组织、存储和管理方式。
图作为一种重要的数据结构,广泛应用于各个领域,如网络拓扑、社交网络分析等。
本实验旨在通过实际操作,深入理解数据结构图的基本概念和操作。
2. 实验目的本实验的主要目的是掌握图的基本概念和相关操作,包括图的创建、遍历、搜索和最短路径算法等。
3. 实验环境本实验使用C++语言进行编程,采用图的邻接矩阵表示法进行实现。
4. 实验内容4.1 图的创建在实验中,我们首先需要创建一个图。
通过读取输入文件中的数据,我们可以获得图的顶点数和边数,并根据这些信息创建一个空的图。
4.2 图的遍历图的遍历是指从图的某个顶点出发,按照一定的规则依次访问图中的其他顶点。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
我们可以通过实验来比较这两种遍历算法的效率和应用场景。
4.3 图的搜索图的搜索是指从图的某个顶点出发,找到与之相关的特定顶点或边。
常用的图的搜索算法有深度优先搜索和广度优先搜索。
在实验中,我们可以通过输入特定的顶点或边,来观察图的搜索算法的执行过程和结果。
4.4 图的最短路径算法图的最短路径算法是指在图中找到两个顶点之间的最短路径。
常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
通过实验,我们可以比较这两种算法的执行效率和应用场景。
5. 实验结果与分析通过实验,我们可以得到以下结论:- 图的邻接矩阵表示法在创建和操作图的过程中具有较高的效率。
- 深度优先搜索算法适用于查找图中的连通分量和回路等问题。
- 广度优先搜索算法适用于查找图中的最短路径和最小生成树等问题。
- 迪杰斯特拉算法适用于求解单源最短路径问题,而弗洛伊德算法适用于求解多源最短路径问题。
6. 实验总结通过本次实验,我们深入学习了数据结构图的基本概念和相关操作。
图作为一种重要的数据结构,具有广泛的应用价值。
在今后的学习和工作中,我们可以运用所学的知识,解决实际问题,提高工作效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告六/七题目:图的操作班级:电子1102学号:28 姓名:杨筠日期:6月2日程序名:一、上机实验的问题和要求:1、图的存储结构的定义和图的创建。
图的种类有:有向图、无向图、有向网、无向网。
图的存储结构可采用:邻接矩阵、邻接表。
要求:分别给出邻接矩阵和邻接表在某一种图上的创建算法2、图的遍历:非递归的深度优先搜索算法、广度优先搜索算法。
3、从键盘读入一个图的顶点信息和带路径权值的邻接矩阵,然后从键盘输入任意的起点和终点,要求找出从起点到终点的最短路径(包括中间结点和各点之间路径的权值),没有路径则输出路径为无穷大。
4、将从迷宫入口到各点的最短路径的集合看作一棵树。
用广度遍历的方法即可找到出口的最短路径。
二、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)建立存储结构的一般步骤:1、输入参数:vexnum, arcnum, GraghKind2、输入顶点信息3、根据GraghKind,决定边是否要带权重4、采用某种形式逐条输入边,将它插入到存储结构中三、源程序及注释:Status CreateGragh(ALGraph &G){//建立邻接表scanf(”%d%d%d”, &G.vexnum, &G.arcnum,&G.GraghKind);if……switch(G.GraghKind){case DG: return CreateDG(G);case DN: return CreateDN(G);case UDG: return CreateUDG(G);case UDN: return CreateUDN(G);default: return ERROR;}}Status CreateDG(ALGraph &G){for(i=0;i<G.vexnum;i++){scanf( &data);G.vertices[i].data = data}//输入顶点信息……}Status CreateDG(ALGraph &G){……for(i=0;i<G.arcnum;i++){//输入边的信息scanf(”%d%d ”,&v, &w)//形式2p= new arcnode;//建立结点if(!p) return ERROR;p.adjvex=w;p.nextarc=G.vertices[v].firstarc;//顶点v的链表G.vertices[v].firstarc=p;//添加到最左边}}Status TranslateDG(ALGraph G1, MGraph &G2){ //设置参数G2.GraghKind = G1.GraghKind;G2.vexnum = G1.vexnum;G2.arcnum = G1.arcnum//复制顶点for(i=0;i<G1.vexnum;i++)G2.vexs[i] = G1.vertices[i].data;//复制弧for(i=0;i<G2.vexnum;i++)for(j=0;j<G2.vexnum;j++)G2.arcs[i][j]=0;}Status TranlateDG(ALGraph G1, MGraph &G2){ //将G1转换为G2//设置参数G2.GraghKind = G1.GraghKind;G2.vexnum = G1.vexnum;G2.arcnum = G1.arcnum//复制顶点for(i=0;i<G1.vexnum;i++)G2.vexs[i] = G1.vertices[i].data;//复制弧for(i=0;i<G2.vexnum;i++)for(j=0;j<G2.vexnum;j++)G2.arcs[i][j]=0;}tatus TranlateDG(ALGraph G1, MGraph &G2){……for(i=0;i<G1.vexnum;i++){//复制G1每个顶点的邻接点p=G1.vertices[i].firstarc;while(p){G2.arcs[i][p.adjvex]=1;p=p->nextarc;}}}/* 迷宫探路III(最短路径)*//* DIJKSTRAMAZE.C *//* 2003-8-26 */#include <stdlib.h>#include <time.h>#include <math.h>#include <stdio.h>#include <graphics.h>#define N 22#define M 22int bg[M][N];int aa[M][N];struct pace{int pre;int x;int y;int ri;int rj;}road[M*N];struct pace bestroad[M*N];void makebg(int,int);void drawbg(int[][],int,int,int,int,int); void drawman(int,int,int);void rect(int,int,int,int);void main(){/* main()开始*/int step=20;int len=10;int size=20;int x=0,y=0;int i=0,j=0;int gdriver=DETECT,gmode;char ch;int direc;int routelen=0;int dj[]={-1,1,0,0};int di[]={0,0,-1,1};int begin;int end;int k;int t;int num;int suc;int cnt;int x0;int y0;int le;int tmp;makebg(M,N);/* registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,\"c:\\\\turboc2\");*/ initgraph(&gdriver,&gmode,\"c:\\\\tc20\\\\bgi\"); cleardevice();setwritemode(XOR_PUT);settextstyle(1,0,3);setcolor(GREEN);outtextxy(100,180,\"DIJKSTRA MAZE\"); setcolor(BLUE);setfillstyle(LINE_FILL,BLUE);/*drawbg(bg,M,N,size,0,0);*/drawbg(aa,M,N,size,0,0);setcolor(WHITE);x+=len;y+=len;drawman(x,y,len);x0=x;y0=y;/* 电脑控制*/i=j=0;aa[0][0]=1;begin=0;end=0;road[0].ri=0;road[0].rj=0;road[0].x=x0;road[0].y=y0;road[0].pre=-1;le=1;suc=0;while(!suc){cnt=0;le++;for(k=begin;k<=end;k++){for(t=0;t<4;t++){x=road[k].x+dj[t]*step;y=road[k].y+di[t]*step ;i=road[k].ri+di[t];j=road[k].rj+dj[t];if(i<M&&i>=0&&j<N&&j>=0&&aa[i][j]==0){ cnt++;aa[i][j]=le;road[end+cnt].pre=k;road[end+cnt].x=x;road[end+cnt].y=y;road[end+cnt].ri=i;road[end+cnt].rj=j;if(i==N-1&&j==M-1){suc=1;break;}}}if(suc)break;}begin=end+1;end=end+cnt;}/* output */i=end;j=0;while(i!=-1){bestroad[j].x=road[i].x;bestroad[j].y=road[i].y;bestroad[j].ri=road[i].ri;bestroad[j].rj=road[i].rj;i=road[i].pre;j++;}for(i=0;i<j/2;i++){tmp=bestroad[i].x;bestroad[i].x=bestroad[j-1-i].x;bestroad[j-1-i].x=tmp;tmp=bestroad[i].y;bestroad[i].y=bestroad[j-1-i].y;bestroad[j-1-i].y=tmp;}getch();drawman(x0,y0,len);for(i=0;i<j;i++){drawman(bestroad[i].x,bestroad[i].y,len);delay(80000);drawman(bestroad[i].x,bestroad[i].y,len);}i--;drawman(bestroad[i].y,bestroad[i].x,len);getch();closegraph();}/* main()结束*//* 绘制小人*/void drawman(int x,int y,int len){int r=len/4;rect(x-r,y-len,x+r,y-len+2*r);line(x,y-len+2*r,x,y);line(x-len,y,x+len,y);line(x,y,x-len,y+len);line(x,y,x+len,y+len);}/* 绘制迷宫地图*/void drawbg(int bg[][N],int a,int b,int size,int x,int y){ int startx=x;int i,j;for(i=0;i<a;i++){for(j=0;j<b;j++){if(bg[i][j]==-1)rect(x,y,x+size-1,y+size-1);x+=size;}x=startx;y+=size;}rectangle(0,0,size*b,size*a);line(0,0,size,0);line(0,0,0,size);line(size*b,size*(a-1),size*b,size*a);line(size*(b-1),size*a,size*b,size*a);}/* 绘制实心矩形*/void rect(int x0,int y0,int x1,int y1){int i,j;for(i=x0;i<=x1;i++)line(i,y0,i,y1);}/* 随机生成代表迷宫地图的数组*/void makebg(int a,int b){int i,j;int ran;int direc;/* 初始化迷宫地图*/for(i=0;i<a;i++)for(j=0;j<b;j++)bg[i][j]=1;/* 随机生成迷宫通路*/randomize();i=j=0;direc=2;while(1){bg[i][j]=0;if(i>=M-1&&j>=N-1)break;ran=(int)rand()*4;if(ran<1){if(direc!=1&&i<a-1){i++;direc=3;}}else if(ran<2){if(direc!=2&&j>0){j--;direc=0;}}else if(ran<3){if(direc!=3&&i>0){i--;direc=1;}}else {if(direc!=0&&j<b-1){j++;direc=2;}}}/* 随机生成迷宫其余部分*/for(i=0;i<a;i++)for(j=0;j<b;j++)if(bg[i][j]==1){ran=(int)rand()*10;if(ran<5)bg[i][j]=0;}for(i=0;i<a;i++)for(j=0;j<b;j++){if(bg[i][j]==1)aa[i][j]=-1;else aa[i][j]=0;}}四、运行输出结果:五、调试和运行程序过程中产生的问题及采取的措施:调试结果可见,在程序存在一定的问题,主要是会导致结点可能会重复输出,但如果改变起始点,运行结果又正常,关键问题还是没能找到问题的所在,但会进一步研究,修改程序使其能正常工作六、对算法的程序的讨论、分析,改进设想,其它经验教训:图是一种非线性结构,它比线性表更为复杂,在图形结构中,结点之间的关系可以是任意的,图中任意两点数据元素之间都可能相关。