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

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。
数据结构实验报告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. 队列的应用- 模拟打印任务:根据打印任务的到达时间和执行时间,模拟打印机的工作过程。
4. 递归的应用- 计算斐波那契数列:通过递归函数计算斐波那契数列的第n 项值。
实验步骤根据实验内容,进行以下步骤:1. 线性表的操作1. 初始化线性表。
2. 实现插入操作,并在指定位置插入元素。
3. 实现删除操作,并从指定位置删除元素。
4. 实现查找操作,并根据指定元素在线性表中查找。
5. 实现遍历操作,并依次访问线性表中的所有元素。
2. 栈的应用1. 实现中缀表达式转后缀表达式的函数,并进行测试。
2. 实现后缀表达式求值的函数,并进行测试。
3. 队列的应用1. 实现模拟打印任务的函数,并根据指定的打印任务进行测试。
4. 递归的应用1. 实现计算斐波那契数列的递归函数,并计算第n项的值。
实验结果经过上述步骤的实现和测试,得到以下实验结果:- 线性表的操作:插入、删除、查找和遍历操作均得到正确的结果。
- 栈的应用:中缀表达式转后缀表达式和后缀表达式求值的函数均能正确运行。
- 队列的应用:模拟打印任务的函数能够按照指定的顺序执行打印任务。
- 递归的应用:计算斐波那契数列的递归函数能够正确计算任意一项的值。
数据结构图的实验报告

数据结构图的实验报告数据结构图的实验报告引言:数据结构图是计算机科学中重要的概念之一。
它是一种用图形表示数据元素之间关系的数据结构,广泛应用于算法设计、程序开发和系统优化等领域。
本实验报告旨在介绍数据结构图的基本原理、实验过程和结果分析。
一、实验目的本次实验的主要目的是掌握数据结构图的基本概念和操作方法,以及通过实验验证其在解决实际问题中的有效性。
具体而言,我们将通过构建一个社交网络关系图,实现对用户关系的管理和分析。
二、实验方法1. 确定数据结构在本次实验中,我们选择了无向图作为数据结构图的基础。
无向图由顶点集和边集组成,每条边连接两个顶点,且没有方向性。
2. 数据输入为了模拟真实的社交网络,我们首先需要输入一组用户的基本信息,如姓名、年龄、性别等。
然后,根据用户之间的关系建立边,表示用户之间的交流和联系。
3. 数据操作基于构建好的数据结构图,我们可以进行多种操作,如添加用户、删除用户、查询用户关系等。
这些操作将通过图的遍历、搜索和排序等算法实现。
三、实验过程1. 数据输入我们首先创建一个空的无向图,并通过用户输入的方式逐步添加用户和用户关系。
例如,我们可以输入用户A和用户B的姓名、年龄和性别,并建立一条边连接这两个用户。
2. 数据操作在构建好数据结构图后,我们可以进行多种操作。
例如,我们可以通过深度优先搜索算法遍历整个图,查找与某个用户具有特定关系的用户。
我们也可以通过广度优先搜索算法计算某个用户的社交网络影响力,即与该用户直接或间接相连的其他用户数量。
3. 结果分析通过实验,我们可以观察到数据结构图在管理和分析用户关系方面的优势。
它能够快速地找到用户之间的关系,帮助我们了解用户的社交网络结构和影响力。
同时,数据结构图也为我们提供了一种可视化的方式来展示用户之间的关系,使得分析更加直观和易于理解。
四、实验结果通过实验,我们成功构建了一个社交网络关系图,并实现了多种数据操作。
我们可以根据用户的姓名、年龄和性别等信息进行查询,也可以根据用户之间的关系进行遍历和排序。
数据结构实验

数据结构实验数据结构实验是计算机科学与技术专业的重要课程之一。
通过对这门课程的学习和实验,可以让学生深入了解数据结构在计算机科学中的重要性和应用。
一、实验的目的与意义数据结构实验的主要目的是帮助学生更深入地理解数据结构在计算机科学中的应用。
在实验中,学生可以通过编写代码和执行各种数据结构算法来更好地理解数据结构的实现原理。
通过实验,学生可以更清楚地了解算法的效率、时间复杂度和空间复杂度等概念。
此外,数据结构实验也有助于提高学生的编程能力。
在实验中,学生需要编写具有规范的代码,确保算法的正确性,同时还需要处理大量的数据,这可以提高学生的编程能力和耐心。
二、实验内容简介数据结构实验通常包括以下几个方面的内容:1.线性结构:顺序存储和链式存储线性表、栈、队列等。
2.非线性结构:数组、链表、二叉树等。
3.查找算法:顺序查找、二分查找、哈希查找等。
4.排序算法:插入排序、选择排序、归并排序、堆排序等。
5.图论算法:图的遍历、最短路径、最小生成树等。
6.字符串算法:KMP算法、BM算法等。
三、实验中的具体操作实验中的具体操作是根据具体的算法和数据结构来进行的。
以下是一个简单的例子:线性表的实验假设学生已经学习了顺序存储结构和链式存储结构的操作,以下是在实验中需要进行的具体操作:1.顺序存储结构创建一个空的顺序表插入一个元素到指定位置删除一个元素查找指定元素的位置输出顺序表的所有元素2.链式存储结构创建一个空的链表插入一个元素到指定位置删除一个元素查找指定元素的位置输出链表的所有元素在实验中,学生需要将这些操作封装成具体的函数,并且通过调用这些函数来实现对线性表的操作。
同时,学生还需要进行大量的测试和调试,以保证代码的正确性和实验的效果。
四、实验中的注意事项在进行数据结构实验时,学生需要注意以下几个方面:1.理论和实验相结合:不仅要理解理论知识,还要进行实验操作,才能更好地掌握数据结构。
2.代码规范:要写出规范、可读性强的代码,让他人容易理解。
数据结构综合设计实验报告

数据结构综合设计实验报告好啦,今天咱们来聊聊“数据结构综合设计实验报告”这事儿。
首先得说,虽然这听上去像是一道艰深的题目,但其实也没想象的那么复杂。
你要知道,数据结构这个东西,说白了就是咱们用来存储和管理数据的各种方式。
就像你家里放东西的柜子,你得知道什么东西放哪个抽屉,啥该挂在墙上,啥放在桌子上。
这样生活起来才方便,对吧?数据结构就相当于是这座“数据大厦”的设计图。
你能想象吗?如果没有一个好的数据结构,处理数据就像是你在找个放杂物的地方找个特定的袜子,根本找不到!好了,说到实验报告,可能大家会想,实验报告嘛,就是写写写,写了半天就是总结总结,结论写个结尾啥的。
其实不然。
做这个实验报告,你得好好思考,得分析背后的每个数据结构为什么选择它,为什么这样设计。
就拿链表来说吧,这种结构可不是随便来的。
它就像是你手里那一串串的钥匙,每一把钥匙能开一个锁,但这些锁之间并不一定是顺序排列的,而是按需拼凑的。
链表的好处就是能根据需要灵活地增删节点,不需要像数组那样,一旦放进去就固定死了。
你说,谁不喜欢灵活性大一点的东西?然后再说说栈吧,这东西一听就让人联想到摞起来的盘子,或者你家的衣服堆成山,最上面的一件衣服总是最容易拿到。
栈的原则就是“先进后出”。
拿盘子来说,你最先放的盘子,是在最下面的,最后放的才是最上面的。
你每次取盘子,都是先拿最上面那一块,其他的都得等着。
这就有点类似我们的“先到先得”原则,但栈可不是那种随便排队的,谁在最上面就先来,其他的得排排队。
接下来聊聊队列。
说到队列,大家肯定就想起了超市的结账排队。
排队的人一个接一个,谁先来,谁就先走。
队列就是按照这个规则来操作的。
就像是排队买个冰淇淋,你不能插队,得等着自己的轮到。
这种“先进先出”的规则让队列变得非常简单有效。
当你需要按顺序处理数据时,队列是最靠谱的选择。
好啦,再讲讲哈希表。
哈希表有点像你家里放东西的那个抽屉柜,里面每个抽屉都有一个标签,可以快速找到你想要的东西。
数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。
具体目标包括: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. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容: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. 实验环境本实验使用C++语言进行编程,采用图的邻接矩阵表示法进行实现。
4. 实验内容4.1 图的创建在实验中,我们首先需要创建一个图。
通过读取输入文件中的数据,我们可以获得图的顶点数和边数,并根据这些信息创建一个空的图。
4.2 图的遍历图的遍历是指从图的某个顶点出发,按照一定的规则依次访问图中的其他顶点。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
我们可以通过实验来比较这两种遍历算法的效率和应用场景。
4.3 图的搜索图的搜索是指从图的某个顶点出发,找到与之相关的特定顶点或边。
常用的图的搜索算法有深度优先搜索和广度优先搜索。
在实验中,我们可以通过输入特定的顶点或边,来观察图的搜索算法的执行过程和结果。
4.4 图的最短路径算法图的最短路径算法是指在图中找到两个顶点之间的最短路径。
常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
通过实验,我们可以比较这两种算法的执行效率和应用场景。
5. 实验结果与分析通过实验,我们可以得到以下结论:- 图的邻接矩阵表示法在创建和操作图的过程中具有较高的效率。
- 深度优先搜索算法适用于查找图中的连通分量和回路等问题。
- 广度优先搜索算法适用于查找图中的最短路径和最小生成树等问题。
- 迪杰斯特拉算法适用于求解单源最短路径问题,而弗洛伊德算法适用于求解多源最短路径问题。
6. 实验总结通过本次实验,我们深入学习了数据结构图的基本概念和相关操作。
图作为一种重要的数据结构,具有广泛的应用价值。
在今后的学习和工作中,我们可以运用所学的知识,解决实际问题,提高工作效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
1.使学生熟悉最短路径算法实现。
2.掌握带权图的存储结构和处理方法。
二、实验环境
1.硬件:每个学生需配备计算机一台。
操作系统:DOS或Windows;
2.软件:DOS或Windows操作系统+Turbo c;
三、实验要求
1.能够独立完成带权图的存储和最短路径的生成。
四、实验内容
1.现在假设我国铁路交通图如下(权值表示距离),请用合适的存储结构将下图存储到计算机中方便进行处理。
2.现在我想以最小的代价从徐州出发到达其他目的地,请用Dijkstra算法实现我的要求的路径。
五、代码如下
#include <stdio.h>
#include <malloc.h>
typedef struct{
int *vexs;
int **arcs;
int vexnum;
}ylx_graph ;
typedef struct{
int adjvex;
int lowcost;
}ylx_markedg ;
ylx_graph *ylx_initgraph (){
int i,j;ylx_graph *g; g=(ylx_graph
*)malloc(sizeof(ylx_graph ));
g->vexnum=25;
g->vexs=(int*)malloc(g->vexnum*sizeof(int)) ;
g->arcs=(int**)malloc(g->vexnum*sizeof(int* ));
for(i=0;i<g->vexnum;i++)
g->arcs[i]=(int*)malloc(g->vexnum*sizeof(in t));
for(i=0;i<g->vexnum;i++)
for(j=0;j<g->vexnum;j++){
g->arcs[i][j]=0;}
return g;
}
void ylx_creategraph (ylx_graph *g){ int i,j;
for(i=0;i<g->vexnum;i++)g->vexs[i]=i;
g->arcs[0][9]=1892; g->arcs[1][3]=242; g->arcs[2][4]=668; g->arcs[2][9]=1145; g->arcs[3][5]=305; g->arcs[4][6]=137; g->arcs[4][11]=695; g->arcs[5][6]=704; g->arcs[5][7]=397; g->arcs[6][12]=674; g->arcs[8][9]=216; g->arcs[9][10]=676; g->arcs[10][11]=511;g->arcs[10][13]=842; g->arcs[11][12]=349;g->arcs[11][14]=534; g->arcs[12][15]=651;g->arcs[13][16]=110; g->arcs[13][17]=967;g->arcs[14][18]=409; g->arcs[15][19]=825;g->arcs[16][17]=639; g->arcs[17][18]=902;g->arcs[17][21]=607; g->arcs[18][19]=367;g->arcs[18][21]=672; g->arcs[18][23]=675;g->arcs[19][20]=622; g->arcs[21][22]=255;g->arcs[23][24]=140;
for(i=0;i<g->vexnum;i++)
for(j=i;j<g->vexnum;j++)
if(g->arcs[i][j])
g->arcs[j][i]=g->arcs[i][j];}
void ylx_printgraph (ylx_graph *g){
int x,y;
printf("\n城市间连通图为:\n");
for(x=0;x<g->vexnum;x++)
for(y=x;y<g->vexnum;y++)
if(g->arcs[x][y])printf("(%d,%d)距离:%d\t",x,y,g->arcs[x][y]);
}
int ylx_selectnearvex (ylx_markedg *mark,int *flag,int num){
int j;
int nearestv;
int lowcost=32767;
for(j=0;j<num;j++){
if(flag[j]!=1&&mark[j].lowcost<lowcost) {
nearestv=j;
lowcost=mark[j].lowcost;}}
flag[nearestv]=1;
return nearestv;
}
void ylx_markothervex (ylx_graph *g,ylx_markedg *mark,int nearestv,int num,int*flag){
int j;
for(j=0;j<num;j++){
if(g->arcs[nearestv][j]>0){
if(flag[j]!=1){
if(mark[j].lowcost>(mark[nearestv].lowc ost+g->arcs[nearestv][j])){
mark[j].lowcost= mark[nearestv].lowcost+g->arcs[nearestv][j] ;
mark[j].adjvex=nearestv;}}}}
}
void ylx_shortestpath (ylx_graph *g,ylx_markedg *mark,int start){
int i,num;
int *flag;
int nearestv;
num=g->vexnum;
flag=(int *)malloc((num)*sizeof(int));
flag[start]=1;
for(i=0;i<g->vexnum;i++){
mark[i].adjvex=start;
if( g->arcs[start][i]>0){
mark[i].lowcost=g->arcs[start][i];}
else{mark[i].lowcost=32767;}
}
for(i=1;i<g->vexnum;i++){
nearestv=ylx_selectnearvex
(mark,flag,num);
ylx_markothervex
(g,mark,nearestv,num,flag);}
}
void ylx_printshortpath (ylx_graph *g,ylx_markedg *mark,int start){
int i,j,k,path[25];
for(i=0;i<g->vexnum;i++){
if(i!=start){
printf("从%d到%d最短路径为:%d; ",start,i,mark[i].lowcost);
printf("途经:");
k=0;path[k]=i;
j=mark[i].adjvex;
while(j!=start){
path[++k]=j;
j=mark[j].adjvex;
}
printf("%d",start);
for(j=k;j>=0;j--)printf(",%d",path[j]);
printf(".\n");}}}
void main(){
int city;
ylx_graph *g;ylx_markedg *mark;
g=ylx_initgraph ();
ylx_creategraph (g);
printf("城市对应编号:\n");
printf("0-乌鲁木齐 1-哈尔滨 2-呼和浩特3-长春 4-北京 \n");
printf(" 5-沈阳6-天津7-大连
8-西宁 9-兰州 10-西安 11-郑州\n");
printf("12-徐州13-成都14-武汉15-上海 16-昆明 17-贵阳 18-株州\n");
printf("19-南昌20-福州21-柳州22-南宁 23-广州 24-深圳.\n");
ylx_printgraph (g);
mark=(ylx_markedg
*)malloc(g->vexnum*sizeof(ylx_markedg )); printf("\n输入起始城市:");scanf("%d",&city);
ylx_shortestpath (g,mark,city);
ylx_printshortpath (g,mark,city);
}
六、运行结果截图。