图地深度广度遍历(算法与大数据结构课程设计)

合集下载

数据结构的课程设计目的

数据结构的课程设计目的

数据结构的课程设计目的一、课程目标知识目标:1. 掌握数据结构的基本概念,包括线性结构(如数组、链表、栈、队列)和非线性结构(如树、图等)的特点与应用。

2. 学会分析不同数据结构在存储和处理数据时的效率,理解时间复杂度和空间复杂度的概念。

3. 掌握常见数据结构的具体实现方法,并能够运用到实际编程中。

技能目标:1. 培养学生运用数据结构解决实际问题的能力,能够根据问题的特点选择合适的数据结构进行优化。

2. 提高学生的编程实践能力,使其能够熟练编写与数据结构相关的程序代码,并进行调试与优化。

3. 培养学生独立思考和团队协作的能力,通过项目实践和课堂讨论,提高问题分析、解决方案的设计与实现能力。

情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学生的学习热情和主动探究精神。

2. 培养学生严谨、细致、踏实的学术态度,使其认识到数据结构在计算机科学与软件开发领域的重要性。

3. 培养学生具备良好的团队合作精神,学会倾听、沟通、表达与协作,提高人际交往能力。

课程性质:本课程为计算机科学与技术及相关专业的基础课程,旨在培养学生的数据结构知识和编程技能,提高学生解决实际问题的能力。

学生特点:学生已具备一定的编程基础,具有一定的逻辑思维能力和问题解决能力,但可能对数据结构的应用和实现方法了解不足。

教学要求:结合学生特点,课程设计应注重理论与实践相结合,以案例驱动、项目导向的教学方法,引导学生掌握数据结构知识,提高编程实践能力。

同时,注重培养学生的情感态度价值观,使其在学习过程中形成积极的学习态度和良好的团队协作精神。

通过具体的学习成果评估,确保课程目标的达成。

二、教学内容1. 线性结构:- 数组:数组的概念、存储方式、应用场景。

- 链表:单链表、双向链表、循环链表的概念及实现。

- 栈与队列:栈的概念、应用场景、实现方法;队列的概念、应用场景、实现方法。

2. 非线性结构:- 树:树的概念、二叉树、二叉查找树、平衡树(如AVL树)、堆的概念及其应用。

浙江大学大数据结构与算法课程自我测试问题详解

浙江大学大数据结构与算法课程自我测试问题详解

窗体顶端1. 邻接表是图的一种____。

正确答案点评A 顺序存储结构B 链式存储结构C 索引存储结构D 散列存储结构正确答案:B答案讲解:无【试题出处】第6章第3节1窗体底端窗体顶端2. 一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准元素得到的一次划分结果为。

正确答案点评A 38,40,46,56,79,84B 40,38,46,79,56,84C 40,38,46,56,79,84D 40,38,46,84,56,79正确答案:C窗体底端窗体顶端3. 设深度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至多为_____(注意C和D中h是指数)。

正确答案点评A 2h-1B 2(h-1)C 2*h-1D 2*h正确答案:A窗体底端窗体顶端4. 一个栈的入栈序列是a,b,c,d, 则下列序列中不可能的输出序列是_______。

正确答案点评A acbdB dcbaC acdbD dbac正确答案:D窗体底端窗体顶端5. 计算机算法是指______。

正确答案点评A 计算方法B 排序方法C 调度方法D 解决问题的有限运算序列正确答案:D窗体底端窗体顶端6. 关于二叉树的三种遍历,下列说法正确的是____。

正确答案点评A 任意两种遍历序列都不可以唯一决定该二叉树B 任意两种遍历序列都可以唯一决定该二叉树C 先序遍历序列和后序遍历序列可以唯一决定该二叉树D 先序遍历序列和中序遍历序列可以唯一决定该二叉树正确答案:D窗体底端窗体顶端7. 顺序表的特点是______。

正确答案点评A 逻辑上相邻的结点其物理位置不相邻B 逻辑上相邻的结点其物理位置亦相邻C 顺序表不是随机存储结构D 在顺序表中插入和删除操作比在链表上方便正确答案:B窗体底端窗体顶端8. 设散列表长为14,散列函数是H(key)=key%11,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为49的结点加到表中,用二次探测法解决冲突,则放入的位置是____________。

数据结构实验指导书(新版)

数据结构实验指导书(新版)

《数据结构和算法》实验指导书实验及学时数分配序号实验名称学时数(小时)1 实验一线性表 42 实验二树和二叉树 23 实验三图 24 实验四查找 25 实验五内部排序 2合计12几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。

二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。

上机时签到;下机时验收签字。

三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。

实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。

【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。

(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。

若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。

若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。

【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。

1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。

《数据结构与算法》教学大纲

《数据结构与算法》教学大纲

《数据结构与算法》教学大纲
一、数据结构与算法教学大纲
数据结构与算法是计算机科学领域的基础,在计算机工程专业的学习和实践中有着重要的地位。

本课程旨在让学生掌握基本的数据结构、算法理论和实现技术,提高其计算机应用的能力。

1.数据结构
(1)线性结构
(a)线性表:顺序表、链表、栈、队列以及相关算法的实现分析
(b)稀疏矩阵的存储及算法
(c)串的基本操作及相关算法
(2)非线性结构
(a)树与二叉树:二叉树的存储、遍历及算法
(b)图:邻接表与邻接矩阵的存储方式,最短路径、最小生成树的求解
2.算法
(1)算法概念:算法的特征、分析及评价、设计的基本方法
(2)排序算法:冒泡排序、快速排序、折半插入排序、希尔排序及其它复杂度下的排序算法比较
(3)查找算法:二叉排序树、散列表及其它查找算法比较
(4)图算法:深度优先、广度优先等图算法
(5)贪心算法及其应用
(6)分治策略及应用
(7)动态规划及应用
3.数据结构和算法的应用
(1)图像处理和计算机视觉:图像缩放和滤波、边缘提取、轮廓绘制及相关算法。

数据结构实训实验报告

数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。

为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。

二、实验目的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)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。

数据结构课设——有向图的深度、广度优先遍历及拓扑排序

数据结构课设——有向图的深度、广度优先遍历及拓扑排序

数据结构课设——有向图的深度、⼴度优先遍历及拓扑排序任务:给定⼀个有向图,实现图的深度优先, ⼴度优先遍历算法,拓扑有序序列,并输出相关结果。

功能要求:输⼊图的基本信息,并建⽴图存储结构(有相应提⽰),输出遍历序列,然后进⾏拓扑排序,并测试该图是否为有向⽆环图,并输出拓扑序列。

按照惯例,先上代码,注释超详细:#include<stdio.h>#include<stdlib.h>#include<malloc.h>#pragma warning(disable:4996)#define Max 20//定义数组元素最⼤个数(顶点最⼤个数)typedef struct node//边表结点{int adjvex;//该边所指向结点对应的下标struct node* next;//该边所指向下⼀个结点的指针}eNode;typedef struct headnode//顶点表结点{int in;//顶点⼊度char vertex;//顶点数据eNode* firstedge;//指向第⼀条边的指针,边表头指针}hNode;typedef struct//邻接表(图){hNode adjlist[Max];//以数组的形式存储int n, e;//顶点数,边数}linkG;//以邻接表的存储结构创建图linkG* creat(linkG* g){int i, k;eNode* s;//边表结点int n1, e1;char ch;g = (linkG*)malloc(sizeof(linkG));//申请结点空间printf("请输⼊顶点数和边数:");scanf("%d%d", &n1, &e1);g->n = n1;g->e = e1;printf("顶点数:%d 边数:%d\n", g->n, g->e);printf("请输⼊顶点信息(字母):");getchar();//因为接下来要输⼊字符串,所以getchar⽤于承接上⼀条命令的结束符for (i = 0; i < n1; i++){scanf("%c", &ch);g->adjlist[i].vertex = ch;//获得该顶点数据g->adjlist[i].firstedge = NULL;//第⼀条边设为空}printf("\n打印顶点下标及顶点数据:\n");for (i = 0; i < g->n; i++)//循环打印顶点下标及顶点数据{printf("顶点下标:%d 顶点数据:%c\n", i, g->adjlist[i].vertex);}getchar();int i1, j1;//相连接的两个顶点序号for (k = 0; k < e1; k++)//建⽴边表{printf("请输⼊对<i,j>(空格分隔):");scanf("%d%d", &i1, &j1);s = (eNode*)malloc(sizeof(eNode));//申请边结点空间s->adjvex = j1;//边所指向结点的位置,下标为j1s->next = g->adjlist[i1].firstedge;//将当前s的指针指向当前顶点上指向的结点g->adjlist[i1].firstedge = s;//将当前顶点的指针指向s}return g;//返回指针g}int visited[Max];//标记是否访问void DFS(linkG* g, int i)//深度优先遍历{eNode* p;printf("%c ", g->adjlist[i].vertex);visited[i] = 1;//将已访问过的顶点visited值改为1p = g->adjlist[i].firstedge;//p指向顶点i的第⼀条边while (p)//p不为NULL时(边存在){if (visited[p->adjvex] != 1)//如果没有被访问DFS(g, p->adjvex);//递归}p = p->next;//p指向下⼀个结点}}void DFSTravel(linkG* g)//遍历⾮连通图{int i;printf("深度优先遍历;\n");//printf("%d\n",g->n);for (i = 0; i < g->n; i++)//初始化为0{visited[i] = 0;}for (i = 0; i < g->n; i++)//对每个顶点做循环{if (!visited[i])//如果没有被访问{DFS(g, i);//调⽤DFS函数}}}void BFS(linkG* g, int i)//⼴度优先遍历{int j;eNode* p;int q[Max], front = 0, rear = 0;//建⽴顺序队列⽤来存储,并初始化printf("%c ", g->adjlist[i].vertex);visited[i] = 1;//将已经访问过的改成1rear = (rear + 1) % Max;//普通顺序队列的话,这⾥是rear++q[rear] = i;//当前顶点(下标)队尾进队while (front != rear)//队列⾮空{front = (front + 1) % Max;//循环队列,顶点出队j = q[front];p = g->adjlist[j].firstedge;//p指向出队顶点j的第⼀条边while (p != NULL){if (visited[p->adjvex] == 0)//如果未被访问{printf("%c ", g->adjlist[p->adjvex].vertex);visited[p->adjvex] = 1;//将该顶点标记数组值改为1rear = (rear + 1) % Max;//循环队列q[rear] = p->adjvex;//该顶点进队}p = p->next;//指向下⼀个结点}}}void BFSTravel(linkG* g)//遍历⾮连通图{int i;printf("⼴度优先遍历:\n");for (i = 0; i < g->n; i++)//初始化为0{visited[i] = 0;}for (i = 0; i < g->n; i++)//对每个顶点做循环{if (!visited[i])//如果没有被访问过{BFS(g, i);//调⽤BFS函数}}}//因为拓扑排序要求⼊度为0,所以需要先求出每个顶点的⼊度void inDegree(linkG* g)//求图顶点⼊度{eNode* p;int i;for (i = 0; i < g->n; i++)//循环将顶点⼊度初始化为0{g->adjlist[i].in = 0;}for (i = 0; i < g->n; i++)//循环每个顶点{p = g->adjlist[i].firstedge;//获取第i个链表第1个边结点指针while (p != NULL)///当p不为空(边存在){g->adjlist[p->adjvex].in++;//该边终点结点⼊度+1p = p->next;//p指向下⼀个边结点}printf("顶点%c的⼊度为:%d\n", g->adjlist[i].vertex, g->adjlist[i].in);}void topo_sort(linkG *g)//拓扑排序{eNode* p;int i, k, gettop;int top = 0;//⽤于栈指针的下标索引int count = 0;//⽤于统计输出顶点的个数int* stack=(int *)malloc(g->n*sizeof(int));//⽤于存储⼊度为0的顶点for (i=0;i<g->n;i++)//第⼀次搜索⼊度为0的顶点{if (g->adjlist[i].in==0){stack[++top] = i;//将⼊度为0的顶点进栈}}while (top!=0)//当栈不为空时{gettop = stack[top--];//出栈,并保存栈顶元素(下标)printf("%c ",g->adjlist[gettop].vertex);count++;//统计顶点//接下来是将邻接点的⼊度减⼀,并判断该点⼊度是否为0p = g->adjlist[gettop].firstedge;//p指向该顶点的第⼀条边的指针while (p)//当p不为空时{k = p->adjvex;//相连接的顶点(下标)g->adjlist[k].in--;//该顶点⼊度减⼀if (g->adjlist[k].in==0){stack[++top] = k;//如果⼊度为0,则进栈}p = p->next;//指向下⼀条边}}if (count<g->n)//如果输出的顶点数少于总顶点数,则表⽰有环{printf("\n有回路!\n");}free(stack);//释放空间}void menu()//菜单{system("cls");//清屏函数printf("************************************************\n");printf("* 1.建⽴图 *\n");printf("* 2.深度优先遍历 *\n");printf("* 3.⼴度优先遍历 *\n");printf("* 4.求出顶点⼊度 *\n");printf("* 5.拓扑排序 *\n");printf("* 6.退出 *\n");printf("************************************************\n");}int main(){linkG* g = NULL;int c;while (1){menu();printf("请选择:");scanf("%d", &c);switch (c){case1:g = creat(g); system("pause");break;case2:DFSTravel(g); system("pause");break;case3:BFSTravel(g); system("pause");break;case4:inDegree(g); system("pause");break;case5:topo_sort(g); system("pause");break;case6:exit(0);break;}}return0;}实验⽤图:运⾏结果:关于深度优先遍历 a.从图中某个顶点v 出发,访问v 。

数据结构与算法设计与分析考核试卷

数据结构与算法设计与分析考核试卷
答案:______
8.在冒泡排序中,每一趟排序都能确定一个元素的最终位置。()
答案:______
9. Prim算法和Kruskal算法都可以用来求解最小生成树问题,但Prim算法总是从某一顶点开始,而Kruskal算法总是从某一权值最小的边开始。()
答案:______
10.在一个递归算法中,如果递归调用不是算法的最后一个操作,那么这种递归称为尾递归。()
B.邻接表适合表示稀疏图
C.邻接多重表适合表示无向图
D.邻接表和邻接多重表适合表示有向图
14.以下哪些算法属于分治算法?()
A.快速排序
B.归并排序
C.二分查找
D.动态规划
15.以下哪些情况下,动态规划比贪心算法更适合解决问题?()
A.存在重叠子问题
B.问题具有最优子结构
C.需要考虑所有可能的选择
D.问题可以通过局部最优达到全局最优
C.插入一个节点
D.查找某个节点
5.以下哪些算法可以用于解决最小生成树问题?()
A. Kruskal算法
B. Prim算法
C. Dijkstra算法
D. Bellman-Ford算法
6.以下哪些数据结构可以用来实现堆?()
A.数组
B.链表
C.栈
D.队列
7.关于图的深度优先遍历和广度优先遍历,以下哪些说法是正确的?()
________________________________
2.动态规划算法通常用于解决最优化问题,请阐述动态规划算法的三个基本要素,并给出一个动态规划问题的实例。
________________________________
________________________________

广工数据结构课程设计

广工数据结构课程设计

广工数据结构课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常用的数据结构类型,如线性表、树、图等;2. 学会分析不同数据结构的特点和适用场景,能够选择合适的数据结构解决问题;3. 掌握各类数据结构的存储结构和操作方法,如顺序存储、链式存储、二叉树的遍历等;4. 了解常见算法的时间复杂度和空间复杂度分析,能够评估算法的效率。

技能目标:1. 能够运用所学数据结构解决实际问题,如排序、查找等;2. 培养良好的编程习惯,提高编程能力,能够熟练使用C/C++等编程语言实现数据结构和算法;3. 学会使用调试工具,如调试器、性能分析工具等,优化程序性能;4. 培养团队协作能力,能够与同学共同完成复杂的数据结构设计和实现。

情感态度价值观目标:1. 培养学生对数据结构和算法的兴趣,激发学生主动探索的精神;2. 培养学生的逻辑思维能力,提高解决问题的能力;3. 培养学生的耐心和毅力,让学生明白掌握数据结构需要长时间的积累和实践;4. 培养学生的创新意识,鼓励学生提出新的数据结构或算法优化方案。

本课程针对广东工业大学计算机科学与技术专业大三学生,课程性质为专业核心课。

在教学过程中,需注重理论与实践相结合,关注学生的个体差异,提高学生的实践能力。

通过本课程的学习,使学生能够掌握数据结构的基本原理和方法,为后续相关课程和实际工作打下坚实基础。

二、教学内容1. 数据结构基本概念:介绍数据结构的基本概念、作用和分类,重点讲解线性结构、非线性结构的特点及应用场景。

2. 线性表:讲解线性表的定义、顺序存储和链式存储结构,实现线性表的插入、删除、查找等基本操作。

3. 栈和队列:介绍栈和队列的基本概念,分析其应用场景,实现栈和队列的存储和操作。

4. 串:讲解串的定义、存储结构,掌握串的模式匹配算法,如KMP算法等。

5. 树和二叉树:阐述树和二叉树的基本概念,介绍二叉树的存储结构、遍历方法,讲解二叉排序树、平衡二叉树等特殊二叉树的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图的操作一、问题描述图是一种较线性表和树更为复杂的数据结构。

在图形结构中,节点间的关系可以是任意的,图中任意两个数据元素之间都可以相关。

由此,图的应用极为广泛。

现在邻接矩阵和邻接表的存储结构下,完成图的深度、广度遍历。

二、基本要求1、选择合适的存储结构完成图的建立;2、建立图的邻接矩阵,能按矩阵方式输出图,并在此基础上,完成图的深度和广度遍历,输出遍历序列;3、建立图的邻接表,并在此基础上,完成图的深度和广度遍历,输出遍历序列;三、测试数据四、算法思想1、邻接矩阵顶点向量的存储。

用两个数组分别存储数据(定点)的信息和数据元素之间的关系(边或弧)的信息。

2、邻接表邻接表是图的一种链式存储结构。

在邻接表中,对图中每个定点建立一个单链表,第i 个单链表中的节点表示依附于定点vi的边。

每个节点由3个域组成,其中邻接点域(adjvex)指示与定点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的节点;数据域(info)存储和边或弧相关的信息,如权值等。

每个链表上附设一个头节点。

在表头节点中,除了设有链域(firstarc)指向链表中第一个节点之外,还设有存储定点vi的名或其他有关信息的数据域(data)。

3、图的深度遍历深度优先搜索遍历类似于树的先根遍历,是树的先跟遍历的推广。

假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,甚至图中所有和v相通的顶点都被访问到;若此时图有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

4、图的广度遍历广度优先遍历类似于树的按层次遍历过程。

假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先与“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。

若此时图有顶点未被访问,则另选图中一个曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

五、模块划分一、基于邻接矩阵的深广度遍历1.Status InitQueue(LinkQueue *Q)根据已知Q初始化队列2.Status QueueEmpty (LinkQueue Q)判断队列是否为空3.Status EnQueue(LinkQueue *Q, QElemType e)将e压入队尾4.Status DeQueue(LinkQueue *Q, QElemType *e)取队头元素e5.int LocateVex(MGraph G,VertexType v)定位定点v6.void CreateGraph(MGraph *G)建立无向图的邻接矩阵7.void PrintGraph(MGraph G)输出邻接矩阵的无向图8.int FirstAdjVex(MGraph G,int v)第一个邻接点的定位9.int NextAdjVex(MGraph G,int v,int w)查找下一个邻接点10.void Dfs(MGraph G, int v)实现图的一次遍历11.void DfsTraverse(MGraph G)实现图的深度遍历12.void BfsTraverse(MGraph G)实现图的广度遍历13.Main主函数二、基于邻接表实现图的深广度遍历1.Status InitQueue(LinkQueue *Q)根据已知Q初始化队列2.Status QueueEmpty (LinkQueue Q)判断队列是否为空3.Status EnQueue(LinkQueue *Q, QElemType e)将e压入队尾4.Status DeQueue(LinkQueue *Q, QElemType *e) 取队头元素e5.void createALGraph(ALGraph *G)建立无向图的邻接矩阵6.void PrintGraph(MGraph G)输出邻接矩阵的无向图7.int FirstAdjVex(MGraph G,int v)第一个邻接点的定位8.int NextAdjVex(MGraph G,int v,int w)查找下一个邻接点9.void Dfs(MGraph G, int v)实现图的一次深度遍历10.void DfsTraverse(MGraph G)实现图的深度遍历11.void BFS(ALGraph G, int v)实现图的一次广度遍历12.void BfsTraverse(MGraph G)实现图的广度遍历13.Void …………………………………Main主函数六、数据结构//(ADT)1、基于邻接矩阵的图的类型定义typedef struct ArcCell{ VRType adj; /*图中有1/0表示是否有边,网中表示边上的权值*/ /* InfoType *info; 与边相关的信息*/} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; /*顶点向量*/AdjMatrix arcs; /*邻接矩阵*/int vexnum,arcnum; /*图中当前顶点数和边数*/ } MGraph;2、基于邻接表的图的类型定义typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;}ArcNode; /*表节点*/typedef struct{TElemType data;ArcNode *firstarc;}VNode,AdjList[MAXVER]; /*表节点*/typedef struct{AdjList vertices;int vexnum,arcnum; /*图中当前顶点数和边数*/} ALGraph;七、源程序一、基于邻接矩阵的图的深度、广度遍历#include "stdlib.h"#include "stdio.h"#include "string.h"#define TRUE 1#define FALSE 0#define OVERFLOW -2#define OK 1#define ERROR 0typedef int Status;#define INFINITY INT_MAX /*最大值“无穷”*/#define MAX_VERTEX_NUM 20 /*最大顶点个数*/typedef int Boolean;typedef char VertexType[20];typedef int VRType;/**************以下为队列的操作************//****队列的类型定义****/typedef int QElemType;typedef struct QNode{QElemType data;struct QNode *next;} QNode, *QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;} LinkQueue;/****初始化队列****/Status InitQueue(LinkQueue *Q){ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode)); if(!(*Q).front) exit(OVERFLOW);(*Q).front->next=NULL;return OK; }/****判断队列是否为空****/Status QueueEmpty (LinkQueue Q){ if (Q.front==Q.rear)return TRUE;elsereturn FALSE; }/****入队列****/Status EnQueue(LinkQueue *Q, QElemType e){ QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if (!p) exit(OVERFLOW);p->data=e; p->next=NULL;(*Q).rear->next=p;(*Q).rear=p;return OK; }/****出队列****/Status DeQueue(LinkQueue *Q, QElemType *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; }/**************以下为图的操作************//*图的类型定义*/typedef struct ArcCell{ VRType adj; /*图中有1/0表示是否有边,网中表示边上的权值*/ /* InfoType *info; 与边相关的信息*/} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; /*顶点向量*/AdjMatrix arcs; /*邻接矩阵*/int vexnum,arcnum; /*图中当前顶点数和边数*/} MGraph;/* 顶点在顶点向量中的定位*/int LocateVex(MGraph G,VertexType v){ int i;for(i=0;i<G.vexnum;i++)if (strcmp(v,G.vexs[i])==0) break;return i;}/*建立无向图的邻接矩阵*/void CreateGraph(MGraph *G){ int i,j,k; VertexType v1,v2;printf("\nInput MG vexnum,arcnum:");scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);printf("Input %d vexs:",(*G).vexnum);for(i=0;i<(*G).vexnum;i++) /*输入顶点向量*/ { scanf("%s",(*G).vexs[i]); }printf("vexs list\n");for(i=0;i<G->vexnum;i++) /*输出顶点向量*/puts(G->vexs[i]);for(i=0;i<(*G).vexnum;i++) /*邻接矩阵初始化*/ for(j=0;j<(*G).vexnum;j++)(*G).arcs[i][j].adj=0;printf("\nInput %d arcs(vi vj):\n",(*G).arcnum); for(k=0;k<(*G).arcnum;k++) /*输入无权图的边*/ { scanf("%s%s",v1,v2);i=LocateVex(*G,v1); j=LocateVex(*G,v2);(*G).arcs[i][j].adj=1;(*G).arcs[j][i]=(*G).arcs[i][j];}}/*按邻接矩阵方式输出无向图*/void PrintGraph(MGraph G){ int i,j;printf("\nMGraph:\n");for(i=0; i<G.vexnum; i++){ printf("%10s",G.vexs[i]);for(j=0; j<G.vexnum; j++)printf("%4d",G.arcs[i][j].adj);printf("\n");}}/* 查找第1个邻接点 */int FirstAdjVex(MGraph G,int v){ int j,p=-1;for(j=0;j<G.vexnum;j++)if (G.arcs[v][j].adj==1) {p=j; break;}return p;}/* 查找下一个邻接点 */int NextAdjVex(MGraph G,int v,int w){ int j,p=-1;for(j=w+1;j<G.vexnum;j++)if (G.arcs[v][j].adj==1) {p=j; break;}return p;}/*深度遍历*/Boolean visited[MAX_VERTEX_NUM]; /* 设置全局的访问标志数组 */void Dfs(MGraph G, int v){ int w;visited[v]=TRUE;printf("%s",G.vexs[v]);for(w=FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w))if(!visited[w]) Dfs(G,w);}void DfsTraverse(MGraph G){ int v;for (v=0; v<G.vexnum; v++)visited[v]=FALSE;for(v=0; v<G.vexnum; v++)if (!visited[v]) Dfs(G,v);}/* 广度遍历 */void BfsTraverse(MGraph G){ int v,u,w; LinkQueue Q;for(v=0; v<G.vexnum; v++) visited[v]=FALSE;InitQueue(&Q);for(v=0; v<G.vexnum; v++)if (!visited[v]){ visited[v]=TRUE;printf("%s",G.vexs[v]);EnQueue(&Q,v);while(!QueueEmpty(Q)){ DeQueue(&Q,&u);for(w=FirstAdjVex(G,u); w>=0; w=NextAdjVex(G,u,w)) if (!visited[w]){ visited[w]=TRUE;printf("%s",G.vexs[w]);EnQueue(&Q,w);}}}}/*主函数*/main(){ int w;MGraph G;CreateGraph(&G);PrintGraph(G);printf("\nDfs:"); DfsTraverse(G); /* 深度遍历 */ printf("\nBfs:"); BfsTraverse(G); /* 广度遍历 */ }二:基于邻接表的图的深度、广度遍历#include "stdlib.h"#include "stdio.h"#include "string.h"#define MAXVER 21#define N 100typedef char TElemType[10];/*循环队列的操作*//****队列的类型定义****/typedef int ElemType;typedef struct{ElemType *base;int front,rear;}SqQueue;/****初始化队列****/void InitQueue(SqQueue *Q){Q->base=(ElemType *)malloc(N*sizeof(ElemType)); Q->front=Q->rear=0; }/****判断队列是否为空****/int QueueEmpty(SqQueue Q){if(Q.front==Q.rear)return 1;elsereturn 0;}/****入队列****/int EnQueue(SqQueue *Q,ElemType e){if((Q->rear+1)%N==Q->front)return 0;Q->base[Q->rear]=e;Q->rear=(Q->rear+1)%N;return 1;}/****出队列****/int DeQueue(SqQueue *Q,ElemType *e){if(Q->rear==Q->front)return 0;*e=Q->base[Q->front];Q->front=(Q->front+1)%N;return 1;}/*图的操作*//*图的类型定义*/typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct{TElemType data;ArcNode *firstarc;}VNode,AdjList[MAXVER];typedef struct{AdjList vertices;int vexnum,arcnum;} ALGraph;/*建立无向图的邻接矩阵*/void createALGraph(ALGraph *G){int i, s, d;ArcNode *p,*q;printf("\nInput MG vexnum,arcnum:");scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);for(i=1;i<=G->vexnum;i++){printf("\n输入第%d个顶点信息:",i);scanf("%s",G->vertices[i].data);G->vertices[i].firstarc=NULL;} //输入第i个结点值并初始化第i个单链表为空for(i=1; i<=G->arcnum; i++){printf("\n输入第%d条边的始点和终点:",i);scanf("%d,%d",&s,&d);p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=d;p->nextarc=G->vertices[s].firstarc;G->vertices[s].firstarc=p;//将新建的以d为信息的表结点p插入s单链表的头结点后q=(ArcNode*)malloc(sizeof(ArcNode));q->adjvex=s;q->nextarc=G->vertices[d].firstarc;G->vertices[d].firstarc=q;//将新建的以s为信息的表结点q插入d单链表的头结点后}}/*深度遍历*/int visited[MAXVER];//定义全局数组遍历visitedvoid dfs(ALGraph G, int v)//被遍历的图G采用邻接表作为存储结构,v为出发顶点编号{ArcNode *p;printf("%s",G.vertices[v].data);visited[v]=1;p=G.vertices[v].firstarc;while(p!=NULL){if(visited[p->adjvex]==0) dfs(G,p->adjvex);//若p所指表结点对应的邻接顶点未访问则递归地从该顶点出发调用dfsp=p->nextarc;}}void dfsTraverse(ALGraph G){int v;//遍历图之前初始化各未访问的顶点for(v=1; v<=G.vexnum; v++)visited[v]=0;//从各个未被访问过的顶点开始进行深度遍历for(v=1;v<=G.vexnum;v++)if(visited[v]==0) dfs(G,v);}/*广度遍历*/void BFS(ALGraph G, int v)//从顶点编号v出发,广度遍历邻接表存储的图G {SqQueue Q; ArcNode *p;InitQueue(&Q);printf("%s",G. vertices[v].data);visited[v]=1;EnQueue(&Q,v);while(!QueueEmpty(Q)){v=DeQueue(&Q,&v);p=G.vertices[v].firstarc;while(p!=NULL){if(visited[p->adjvex]==0){v=p->adjvex;printf("%s",G.vertices[v].data);visited[v]=1;EnQueue(&Q,v);}p=p->nextarc;}}}void BFSTraverse(ALGraph G){int v;//遍历G以前,初始化visited数组为0for(v=1;v<=G.vexnum;v++)visited[v]=0;for(v=1;v<=G.vexnum;v++)if(visited[v]==0)BFS(G,v);}void main(){ALGraph G;createALGraph(&G);printf("深度遍历结果为:\n");dfsTraverse(G);printf("\n广度遍历结果为:\n");BFSTraverse(G);system("pause");}八、测试情况程序的测试结果如下:1、基于邻接矩阵的图的深度、广度遍历结果正确2、基于邻接表的图的深度、广度遍历结果正确九、参考文献1、严蔚敏,《数据结构 C语言》,清华大学。

相关文档
最新文档