数据结构实验用邻接表实现图的遍历
数据结构章节练习题-答案第7章图

7.1 选择题1. 对于一个具有n个顶点和e条边的有向图,在用邻接表表示图时,拓扑排序算法时间复杂度为()A) O(n)B)O(n+e)C) O(n*n)D)O(n*n*n)【答案】B2. 设无向图的顶点个数为n,则该图最多有()条边。
A) n-1B)n(n-1)/2C)n(n+1)/2【答案】B3. 连通分量指的是()A) 无向图中的极小连通子图B) 无向图中的极大连通子图C) 有向图中的极小连通子图D) 有向图中的极大连通子图【答案】B4. n 个结点的完全有向图含有边的数目()A) n*n B) n(n+1) C) n/2【答案】D5. 关键路径是()A) AOE网中从源点到汇点的最长路径B) AOE网中从源点到汇点的最短路径C) AOV网中从源点到汇点的最长路径D) n2D) n* (n-1)D) AOV网中从源点到汇点的最短路径【答案】 A 6.有向图中一个顶点的度是该顶点的()A)入度B)出度C)入度与出度之和D)(入度+出度)12【答案】C7.有e 条边的无向图,若用邻接表存储,表中有()边结点。
A) e B) 2eC) e-1D) 2(e-1)【答案】B8.实现图的广度优先搜索算法需使用的辅助数据结构为()A)栈B)队列C)二叉树D)树【答案】B9.实现图的非递归深度优先搜索算法需使用的辅助数据结构为()A)栈B)队列C)二叉树D)树【答案】 A 10.存储无向图的邻接矩阵一定是一个()A)上三角矩阵B)稀疏矩阵C)对称矩阵D)对角矩阵【答案】C11.在一个有向图中所有顶点的入度之和等于出度之和的()倍A) B) 1C) 2D) 4答案】B12.在图采用邻接表存储时,求最小生成树的Prim 算法的时间复杂度为(A) O(n)B) O(n+e)C 0(n2)D) 0(n3))【答案】B13 .下列关于AOE网的叙述中,不正确的是()A) 关键活动不按期完成就会影响整个工程的完成时间B) 任何一个关键活动提前完成,那么整个工程将会提前完成C) 所有的关键活动提前完成,那么整个工程将会提前完成D) 某些关键活动提前完成,那么整个工程将会提前完成【答案】B14. 具有10 个顶点的无向图至少有多少条边才能保证连通()A ) 9B) 10C) 11D) 12【答案】A15. 在含n 个顶点和e 条边的无向图的邻接矩阵中,零元素的个数为()A)e B)2eC)n2-e D)n2-2e【答案】D7.2 填空题1 .无向图中所有顶点的度数之和等于所有边数的________________ 倍。
数据结构章节练习题 - 答案第7章 图

7.1选择题1.对于一个具有n个顶点和e条边的有向图,在用邻接表表示图时,拓扑排序算法时间复杂度为()A)O(n)B)O(n+e)C)O(n*n)D)O(n*n*n)【答案】B2.设无向图的顶点个数为n,则该图最多有()条边。
A)n-1B)n(n-1)/2C)n(n+1)/2【答案】B3.连通分量指的是()A)无向图中的极小连通子图B)无向图中的极大连通子图C)有向图中的极小连通子图D)有向图中的极大连通子图【答案】B4.n个结点的完全有向图含有边的数目()A)n*n B)n(n+1)C)n/2【答案】D5.关键路径是()A)AOE网中从源点到汇点的最长路径B)AOE网中从源点到汇点的最短路径C)AOV网中从源点到汇点的最长路径D)n2D)n*(n-1)D)AOV网中从源点到汇点的最短路径【答案】A6.有向图中一个顶点的度是该顶点的()A)入度B)出度C)入度与出度之和D)(入度+出度)/2【答案】C7.有e条边的无向图,若用邻接表存储,表中有()边结点。
A)e B)2eC)e-1D)2(e-1)【答案】B8.实现图的广度优先搜索算法需使用的辅助数据结构为()A)栈B)队列C)二叉树D)树【答案】B9.实现图的非递归深度优先搜索算法需使用的辅助数据结构为()A)栈B)队列C)二叉树D)树【答案】A10.存储无向图的邻接矩阵一定是一个()A)上三角矩阵B)稀疏矩阵C)对称矩阵D)对角矩阵【答案】C11.在一个有向图中所有顶点的入度之和等于出度之和的()倍A)B)1C)2D)4【答案】B12.在图采用邻接表存储时,求最小生成树的Prim 算法的时间复杂度为(A)O(n)B)O(n+e)C)O(n2)D)O(n3))【答案】B13.下列关于AOE网的叙述中,不正确的是()A)关键活动不按期完成就会影响整个工程的完成时间B)任何一个关键活动提前完成,那么整个工程将会提前完成C)所有的关键活动提前完成,那么整个工程将会提前完成D)某些关键活动提前完成,那么整个工程将会提前完成【答案】B14.具有10个顶点的无向图至少有多少条边才能保证连通()A)9B)10C)11D)12【答案】A15.在含n个顶点和e条边的无向图的邻接矩阵中,零元素的个数为()A)e B)2eC)n2-e D)n2-2e【答案】D7.2填空题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 。
数据结构练习(二)答案

数据结构练习(二)答案一、填空题:1.若一棵树的括号表示为A(B(E,F),C(G(H,I,J,K),L),D(M(N))),则该树的度为(1)4,树的深度为(2)4 ,树中叶子结点的个数为(3)8。
2.一棵满二叉树中有m个叶子,n个结点,深度为h,请写出m、n、h之间关系的表达式(4)n=2h-1,m=n+1-2h-1 n=2m-1 。
3.一棵二叉树中如果有n个叶子结点,则这棵树上最少有(5)2n-1 个结点。
一棵深度为k的完全二叉树中最少有2k-1(6)个结点,最多有(7)2k-1个结点。
4.具有n个结点的二叉树,当它是一棵(8)完全二叉树时具有最小高度(9) log2n」+1,当它为一棵单支树时具有高度(10) n 。
5.对具有n个结点的完全二叉树按照层次从上到下,每一层从左到右的次序对所有结点进行编号,编号为i的结点的双亲结点的编号为_(11)__[i/2]__,左孩子的编号为___2i____,右孩子的编号为__2i+1______。
6.若具有n个结点的二叉树采用二叉链表存储结构,则该链表中有__2n_个指针域,其中有_n-1_个指针域用于链接孩子结点,__n+1_个指针域空闲存放着NULL 。
7.二叉树的遍历方式通常有__先序__、___中序__、__后序__和___层序___四种。
8.已知二叉树的前序遍历序列为ABDCEFG,中序遍历序列为DBCAFEG,其后序遍历序列为___DCBFGEA__。
9.已知某完全二叉树采用顺序存储结构,结点的存放次序为A,B,C,D,E,F,G,H,I,J,该完全二叉树的后序序列为___HIDJEBFGCA____。
10.若具有n个结点的非空二叉树有n0个叶结点,则该二叉树有__n0-1_个度为2的结点,____n-2n0+1____个度为1的结点。
11.任何非空树中有且仅有一个结点没有前驱结点,该结点就是树的__根____。
度为k的树中第i层最多有___k i-1_______个结点(i>=1),深度为h的k叉树最多有___k0+k1+....+k h-1____个结点。
数据结构图

所以:对于点多边少的稀疏图来说,采用邻接表 结构使得算法在时间效 率上大大提高。
16
3/12
广度优先搜索(Breadth First Search,简称BFS ) BFS类似于树的层序遍历; 用一个数组用于标志已访问与否,还需要一个工作队列。
【例】一个无向图的BFS
8
6
CD
4
7
HG
BA
邻接多重表(Adjacency Multilist)
9
边表
• 在某些应用中,有时主要考察图中边的权值以及所依附的 两个顶点,即图的结构主要由边来表示,称为边表存储结 构。
• 边表结构采用顺序存储,用2个一维数组构成,一个存储 顶点信息,一个存储边的信息。边数组的每个元素由三部 分组成:
– 边的起点下标 – 边的终点下标 – 边的权值
1
A [i][
j]
0
如果 (vi , v j ) 或 vi , v j G的边 其它
无权图的邻接矩阵表示示例
V1
V2
V0
3
V3
4 12/15
带权图的邻接矩阵的定义
A [i][ j] wij
如果 (vi , vj ) 或 vi , v j G的边 其它
带图权的图邻的接邻矩接阵矩表阵示表示示例示[例例6.9]
1
第一部分 图的定义和术语
2
图的定义
“图” G可以表示为两个集合:G =(V, E)。每条 边是一个顶点对(v, w) E ,并且 v, w V。
通常:用 |V| 表示顶点的数量(|V| ≥ 1), 用 |E| 表示边的数量(|E| ≥ 0)。
(1) 无向图(完全有向图边数与顶点数之间的 关系) (2) 有向图(完全有向图弧数与顶点数之间的 关系) (3) 简单图:没有重边和自回路的图 (4) 邻接 (5) 路径,路径长度 (6) 无环(有向)图:没有任何回路的(有向)图 (7) 度,入度,出度 (8) 无向图的顶点连通、连通图、连通分量 (9) 有向图的顶点强连通,强连通图、连通分量
深度遍历和广度遍历例题

深度遍历和广度遍历例题深度遍历(Depth-First Search,DFS)和广度遍历(Breadth-First Search,BFS)是图遍历算法中常用的两种方法。
下面我将为你提供一个例题,并从多个角度进行全面的回答。
例题,给定一个无向图,使用深度遍历和广度遍历两种方法遍历该图,并输出遍历的结果。
首先,我们需要明确一下图的表示方式。
常用的图表示方法有邻接矩阵和邻接表,这里我们选择使用邻接表表示图。
假设我们有如下无向图:A./ \。
B---C.\ /。
D.邻接表表示如下:A: B, C.B: A, C, D.C: A, B, D.D: B, C.接下来,我们来进行深度遍历。
深度遍历的基本思想是从起始节点开始,尽可能深地访问每个节点,直到无法继续深入为止,然后回溯到上一个节点,继续访问其他未访问的节点。
从节点A开始进行深度遍历,访问顺序为A-B-C-D。
具体步骤如下:1. 将节点A标记为已访问。
2. 访问与节点A相邻的未被访问的节点,即节点B和节点C。
3. 选择其中一个节点(这里选择节点B),将其标记为已访问,并继续深度遍历该节点。
4. 对节点B进行相同的操作,访问与节点B相邻的未被访问的节点,即节点A、节点C和节点D。
5. 选择其中一个节点(这里选择节点C),将其标记为已访问,并继续深度遍历该节点。
6. 对节点C进行相同的操作,访问与节点C相邻的未被访问的节点,即节点A、节点B和节点D。
7. 选择其中一个节点(这里选择节点D),将其标记为已访问,并继续深度遍历该节点。
8. 由于节点D没有未被访问的相邻节点,回溯到节点C。
9. 由于节点C也没有未被访问的相邻节点,回溯到节点B。
10. 由于节点B还有一个未被访问的相邻节点(节点A),将其标记为已访问,并继续深度遍历该节点。
11. 由于节点A没有未被访问的相邻节点,回溯到节点B。
12. 由于节点B没有未被访问的相邻节点,回溯到节点A。
13. 完成深度遍历。
2015实验报告模板

实验报告模板填写说明1、出现的红色部分请填写,并将红色文字删除2、算法描述是以老师建议的算法简要描述的,如果和你的实现方案或者细节不一致的,请自行修改描述。
3、在实验结果中粘贴真实测试结果截图,不必是100分,这个不作为最终实验评分依据,如:贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告课程名称:数据结构班级:计科132实验日期:4月6日姓名:姓名学号:XXX指导教师:程欣宇实验序号:二实验成绩:一、实验名称栈与其应用二、实验目的与要求1、熟悉栈的原理和实现方式;2、掌握利用栈解决列车调度问题三、实验环境任何一种C++编写调试工具 + 清华数据结构Online Judge四、实验内容完成PA02的列车调度这道题五、算法描述与实验步骤列车调度问题是求解一个已知的顺序序列A,是否能够通过一个容量最大为m的栈S,调度为希望的序列B,如图:算法框架如下:贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告3、从小顶堆中取出最小元素后,可以在log(n)的时间内恢复为小顶堆。
4、任意一个元素,可以在log(n)的时间内插入小顶堆。
最小堆物理结构最小堆逻辑结构在本题中,队列元素出队后,还会再入队,我们可以得出算法流程大致如下:初始化有些队列PQ,队列元素为字符串与其优先级读入参数n,m循环n次,读取每个元素,插入队列PQ,花费O(nlogn)建堆循环m次每次输出堆顶元素e将e乘以2以后再次入队实验步骤1、阅读PA04的任务调度这道题;2、采用小顶堆实现优先队列,建议实现为模板类;贵州大学计算机科学与技术学院计算机科学与技术系上机实验报告。
数据结构中相邻和邻接关系

数据结构中相邻和邻接关系相邻和邻接关系在数据结构中扮演着重要的角色,它们描述了元素之间的连接和关联方式,对于数据的组织和操作起到了至关重要的作用。
本文将详细介绍相邻和邻接关系在数据结构中的应用和实现。
一、相邻关系相邻关系是指在数据结构中,元素之间的顺序关系。
在线性结构中,元素按照一定的顺序排列,相邻元素之间有且只有一个元素。
比如,在数组中,元素之间的相邻关系可以通过元素的下标来表示。
在链表中,每个节点都包含一个指向下一个节点的指针,通过这种指针关系来表示相邻关系。
相邻关系在数据操作中有着广泛的应用。
例如,在排序算法中,通过比较相邻元素的大小,可以实现元素的交换和排序。
在查找算法中,通过比较相邻元素和目标元素的大小关系,可以确定查找范围,提高查找效率。
相邻关系还可以用于实现滑动窗口、邻域搜索等算法,为问题求解提供了便利。
二、邻接关系邻接关系是指在数据结构中,元素之间的关联关系。
在非线性结构中,元素之间的邻接关系可以通过边来表示。
比如,在图结构中,每个顶点都可以与其他顶点相连,这种相连关系可以通过边来描述,称为邻接关系。
在树结构中,每个节点都可以有多个子节点,这种父子关系也可以看作邻接关系。
邻接关系在数据结构中的应用非常广泛。
例如,在图算法中,通过邻接关系可以描述图的拓扑结构,实现图的遍历、最短路径、最小生成树等算法。
在树算法中,通过邻接关系可以实现树的遍历、查找、删除、插入等操作。
邻接关系还可以用于实现关联矩阵、邻接表等数据结构,为复杂问题的求解提供了便利。
三、相邻和邻接关系的实现相邻关系的实现主要依靠指针或者下标来表示。
在数组中,相邻元素之间的关系可以通过元素的下标来确定。
在链表中,每个节点都包含一个指向下一个节点的指针,通过这种指针关系来表示相邻关系。
邻接关系的实现则需要借助边或者指针来描述。
在图结构中,可以使用邻接矩阵或者邻接表来表示邻接关系。
邻接矩阵是一个二维数组,矩阵的行和列分别代表图的顶点,矩阵中的元素表示对应顶点之间是否有边相连。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验
报
告
副标题:用邻接表实现图的遍历
班级:信安1002班
学号:0705100227
姓名:叶鑫
一、 实验题目
编写一个程序algo8-2.cpp,实现实现图的遍历运算,并在此基础上
设计一个主程序完成如下功能:
(1) 输出如图所示的有向图G从顶点0开始的深度优先遍历序列(递归算法);
(2) 输出如图所示的有向图G从顶点0开始的深度优先遍历序列(非递归算法);
(3) 输出如图所示的有向图G从顶点0开始的广度优先遍历序列;
二、 实验目的
通过实验巩固图的遍历算法。
三、 实验过程
#include
#include
#include
#include
#define NULL0
#define MAXV 100
typedefstructANode
{ intadjvex;
structANode *nextarc;
int info;
}ArcNode;
typedefstructVnode
{ int data;
ArcNode *firstarc;
}VNode;
typedefVNodeAdjList[MAXV];
typedefstruct
{ AdjListadjlist;
intn,e;
}ALGraph;
int visited[100]={0};
void Creat(ALGraph *&G,FILE *outFile,FILE *fp)//创建邻接表
{
inti;
char a ,b;
ArcNode *p,*r;
G=(ALGraph *)malloc(sizeof(ALGraph));
printf("顶点个数:");
fprintf(fp,"顶点个数:");
fscanf(outFile,"%d",&G->n);
printf("%d\n",G->n);
fprintf(fp,"%d\n",G->n);
for(i=0;i
G->adjlist[i].firstarc=NULL;
for(i=0;i
{
fscanf(outFile,"\n");
fscanf(outFile,"%c",&a);
fscanf(outFile,":");
printf("%c :",a);
fprintf(fp,"%c :",a);
fscanf(outFile,"%c",&b);
while(b!='\n')
{
if(b=='\0')
fscanf(outFile,"%c",&b);
else
{
if(G->adjlist[a-'0'].firstarc==NULL)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=b;
p->nextarc=G->adjlist[a-'0'].firstarc;
G->adjlist[a-'0'].firstarc=p;
r=G->adjlist[a-'0'].firstarc;
printf("%c", G->adjlist[a-'0'].firstarc->adjvex);
fprintf(fp,"%c", G->adjlist[a-'0'].firstarc->adjvex);
}
else
{
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=b;
r->nextarc=p;
printf("%c",r->nextarc->adjvex);
fprintf(fp,"%c",r->nextarc->adjvex);
r=p;
}
r->nextarc=NULL;
fscanf(outFile,"%c",&b);
}
}
printf("\n");
fprintf(fp,"\n");
}
}
void DFS(ALGraph *G,char v)//深度优先遍历递归处理
{
ArcNode *p;
visited[v-'0']=1;
printf("%c ",v);
p=G->adjlist[v-'0'].firstarc;
while(p!=NULL)
{
if(visited[p->adjvex-'0']==0)
DFS(G,p->adjvex);
p=p->nextarc;
}
}
void DFS1(ALGraph *G,char v)//深度优先遍历非递归处理
{
ArcNode *p;
ArcNode *s[MAXV];
int visited[MAXV]={0};
chari;
int top=0;
printf(" %c ",v);
s[top++]=G->adjlist[v-'0'].firstarc;
visited[v-'0']=1;
while(top!=0)
{
p=s[--top];
if(p!=NULL)
{
s[top++]=p->nextarc;
i=p->adjvex;
if(visited[i-'0']==0)
{
visited[i-'0']=1;
printf(" %c ",i);
s[top++]=G->adjlist[i-'0'].firstarc;
}
}
}
}
void BFS(ALGraph *G,char v)//广度优先遍历的非递归处理
{ ArcNode *p;
int queue[MAXV],front=0,rear=0;
int visited[MAXV];
intw,i;
for(i=0;i
printf("%c",v);
visited[v-'0']=1;
rear=(rear+1)%MAXV;
queue[rear]=v;
while(front!=rear)
{ front=(front+1)%MAXV;
w=queue[front];
p=G->adjlist[w-'0'].firstarc;
while(p!=NULL)
{ if(visited[p->adjvex-'0']==0)
{ printf(" %c",p->adjvex);
visited[p->adjvex-'0']=1;
rear=(rear+1)%MAXV;
queue[rear]=p->adjvex;
}
p=p->nextarc;
}
}
printf("\n");
}
void main()
{ ALGraph *G;
char v;
FILE *outFile;
FILE *fp;
outFile=fopen("E:\\有向图G所对应的邻接表.txt","r");
fp=fopen("E:\\有向图G所对应的邻接表的输出.txt","w");
printf("\n有向图G所对应的邻接表:");
fprintf(fp,"\n有向图G所对应的邻接表的输出:");
Creat(G,outFile,fp);//创建邻接表
printf("请输入你想从哪个顶点开始实现图的遍历运算:");
scanf("%c",&v);
fprintf(fp,"请输入你想从哪个顶点开始实现图的遍历运算:%c",v);
printf("从顶点%c开始的有向图G的深度优先递归算法遍历序列为:",v);
DFS(G,v);
fprintf(fp,"\n从顶点%c开始的有向图G的深度优先递归算法遍历序列为:",v);
printf("\n从顶点%c开始的有向图G的深度优先非递归算法遍历序列为:",v);
DFS1(G,v);
fprintf(fp,"\n从顶点%c开始的有向图G的深度优先递归算法遍历序列为:",v);
printf("\n从顶点%c开始的有向图G的广度优先非递归算法遍历序列为:",v);
BFS(G,v);
fprintf(fp,"\n从顶点%c开始的有向图G的广度优先非递归算法遍历序列为:",v);
}
四、画出代数表达式的过程。
开始
置已访问标记
起始结点的第
一条弧进栈
栈是否为空
栈顶元素出栈
该元素是否为
空
下一条弧进栈
该元素是否被
访问过
输出该元素
置已访问标记
该元素的第一
条弧进栈
结束
NO
NO
NO
YES
YES
YES
五、 结果。