如题,以邻接表存储图,并对图进行深度优先遍历

编写一个程序以邻接表存储图,并对图进行深度优先遍历,并画出流程图

第1个回答  推荐于2016-10-12
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define MAXVEX 100
typedef char VertexType[3];/*定义VertexType为char数组类型*/
typedef struct vertex
{int adjvex; /*顶点编号*/VertexType data; /*顶点的信息*/ } VType;/*顶点类型*/
typedef struct graph
{int n,e;/*n为实际顶点数,e为实际边数*/
VType vexs[MAXVEX];/*顶点集合*/
int edges[MAXVEX][MAXVEX];/*边的集合*/
} AdjMatix;/*图的邻接矩阵类型*/
typedef struct edgenode
{int adjvex; /*邻接点序号*/ int value;/*边的权值*/struct edgenode *next;/*下一顶点*/
} ArcNode;/*每个顶点建立的单链表中结点的类型*/
typedef struct vexnode
{VertexType data; /*结点信息*/ArcNode *firstarc;/*指向第一条边结点*/
} VHeadNode;/*单链表的头结点类型*/
typedef struct
{int n,e;/*n为实际顶点数,e为实际边数*/
VHeadNode adjlist[MAXVEX];/*单链表头结点数组*/
} AdjList; /*图的邻接表类型*/
void DispAdjList(AdjList *G)
{int i;
ArcNode *p;
printf("图的邻接表表示如下:\n");
for (i=0;i<G->n;i++)
{printf(" [%d,%3s]=>",i,G->adjlist[i].data);
p=G->adjlist[i].firstarc;
while (p!=NULL)
{printf("(%d,%d)->",p->adjvex,p->value);p=p->next;}printf("∧\n");
}
}
void MatToList(AdjMatix g,AdjList *&G) /*将邻接矩阵g转换成邻接表G*/
{int i,j;ArcNode *p;
G=(AdjList *)malloc(sizeof(AdjList));
for (i=0;i<g.n;i++)/*给邻接表中所有头结点的指针域置初值*/
{G->adjlist[i].firstarc=NULL;strcpy(G->adjlist[i].data,g.vexs[i].data);}
for (i=0;i<g.n;i++)/*检查邻接矩阵中每个元素*/
for (j=g.n-1;j>=0;j--)
if (g.edges[i][j]!=0)/*邻接矩阵的当前元素不为0*/
{p=(ArcNode *)malloc(sizeof(ArcNode));/*创建一个结点*p*/
p->value=g.edges[i][j];p->adjvex=j;
p->next=G->adjlist[i].firstarc; G->adjlist[i].firstarc=p;}
G->n=g.n;G->e=g.e;
}
int visited[MAXVEX];
void DFS(AdjList *g,int vi)/*对邻接表G从顶点vi开始进行深度优先遍历*/
{ArcNode *p;printf("%d ",vi);/*访问vi顶点*/ visited[vi]=1;/*置已访问标识*/
p=g->adjlist[vi].firstarc;/*找vi的第一个邻接点*/
while (p!=NULL)/*找vi的所有邻接点*/
{if (visited[p->adjvex]==0)DFS(g,p->adjvex);p=p->next; }
}
void main()
{int i,j,k,a[9][9];AdjMatix g;AdjList *G;
char *vname[MAXVEX]={"a","b","c","d","e","f","g","h","i"};
printf("输入定点数(<10),边数");
scanf("%d,%d",&i,&k);
g.n=i;g.e=2*k;
for (i=0;i<g.n;i++)strcpy(g.vexs[i].data,vname[i]);
for (i=0;i<g.n;i++)
for (j=0;j<g.e;j++)g.edges[i][j]=0; /*a[i][j];*/
for(k=0;k<g.e/2;k++)
{printf("请输入第%d条边的起点和终点序号(逗点分隔)",k);scanf("%d,%d",&i,&j);
g.edges[i][j]=g.edges[j][i]=1;}
MatToList(g,G);/*生成邻接表*/ DispAdjList(G);/*输出邻接表*/
for (i=0;i<g.n;i++)visited[i]=0; /*顶点标识置初值*/
printf("从顶点0的深度优先遍历序列:\n");printf(" 递归算法:");DFS(G,0);printf("\n");
}本回答被提问者和网友采纳

在用邻接表表示图时,对图进行深度优先搜索遍历的算法的时间复杂度为...
邻接表:包含n个头结点和e个表结点,算法中对所有结点都要遍历一次,所以时间复杂度为O(n+e)顺便,对于广度优先算法的时间复杂度,也是这样。

采用邻接表存储的图的深度优先遍历算法类似于二叉树的先序遍历,为什么...
这是因为图的深度优先遍历算法先访问所在结点,再访问它的邻接点。与二叉树的先序遍历先访问子树的根结点,再访问它的孩子结点(邻接点)类似。图的广度优先遍历算法类似于二叉树的按层次遍历。先序遍历也叫做先根遍历、前序遍历,可记做根左右(二叉树父结点向下先左后右)。首先访问根结点然后遍历左...

用邻接表存储的图的深度优先遍历算法类似于树的( ),而其广度优先遍历算...
【答案】:B 图的深度优先搜索类似与树的先根遍历,是先访问结点,再递归向外层结点遍历,都采用回溯算法。图的广度优先搜索类似于树的层序遍历,是一层一层向外层扩展遍历,都需要采用队列来辅助算法的实现。

...并据该邻接表,给出从A开始进行深度优先、广度优先搜索得到
深度优先遍历 遍历算法:)从某一顶点出发开始访问,被访问的顶点作相应的标记,输出访问顶点号.)从被访问的顶点)从被访问的顶点出发,依次搜索与该顶点有边的关联的所有未被访问的邻接点,并作相应的标记。)再依次根据)

图的遍历:深度优先搜索(邻接矩阵存放)
while ( ptr->nextnode != NULL ) \/* 遍历至链表尾 *\/ ptr = ptr->nextnode; \/* 下一个顶点 *\/ ptr->nextnode = newnode; \/* 插入节点 *\/ } } \/* 图的深度优先搜寻法 *\/ void dfs(int current){ graph ptr;visited[current] = 1; \/* 记录已遍历过 *\/...

如何用邻接表表示一个图?
用邻接表表示图进行深度优先遍历时,通常采用栈来实现算法,广度遍历使用队列。扩展材料:深度优先遍历:类似与树的前序遍历。从图中的某个顶点v出发,访问此顶点,然后从v的未被访问到的邻接点进行遍历,直到图中所有和v有路径相通的顶点都被访问到 注:优先访问外层节点,访问到无新顶点时,会进行回退...

用邻接表表示图进行深度优先遍历时,通常借助()来实现算法。
用邻接表表示图进行深度优先遍历时,通常借助()来实现算法。A.栈 B.队列 C.树 D.图 正确答案:A

...图的邻接表,并分别给出从结点1开始进行深度优先和广度优先遍历的结果...
邻接表如下图所示:深度优先遍历过程是这样的:0->1->4->8->5(回溯8),8->6->2->7(回溯0),0->3 广度优先遍历过程是这样的:0->1->2->3,1->4->5,2->6->7,4->8 以上数字都是索引,加1对应的是你所给图中的节点号。

图的邻接表存储方式是怎样的?
用邻接表表示图进行深度优先遍历时,通常采用栈来实现算法。邻接表,存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头...

用邻接矩阵存储无向图,并用深度优先和广度优先遍历搜索输出序列,要能...
cout<<"1.建立无向图的邻接表"<<endl;cout<<"2.深度遍历图"<<endl;cout<<"3.广度遍历图"<<endl;cout<<"4.结束程序运行"<<endl;cout<<"———"<<endl;cout<<"请输入你的选择(1, 2, 3, 4:)"<<endl;cin>>cord;switch(cord){ case 1:creatgraph(adjlist);break;case 2:dfstrave...

相似回答