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

作者&投稿:褒眉 (若有异议请与网页底部的电邮联系)
求大神帮做数据结构作业:使用邻接矩阵或者邻接表创建一个图,并对这个图进行深度优先遍历和广度优先遍历~

http://blog.csdn.net/column/details/tengweitw.html 这里面有你上面说的代码实现,讲的很详细

typedef struct node{ /*边表结点*/
int adjvex; /*邻接点域*/
struct node * next; /*指向下一个邻接点的指针域*/
}EdgeNode;/*若要表示边上信息,则应增加一个数据域info*/

typedef struct vnode{ /*顶点表结点*/
char vertex [20]; /*顶点域*/
EdgeNode * firstedge; /*边表头指针*/
}VertexNode;

typedef VertexNode AdjList[MaxVerNum]; /*AdjList 是邻接表类型*/

typedef struct{
AdjList adjlist; /*邻接表*/
int n,e; /*顶点数和边数*/
}ALGraph; /*ALGraph 是以邻接表方式存储的图类型*/


//建立一个有向图的邻接表存储的算法如下:
void CreateALGraph(ALGraph *G){/*建立有向图的邻接表存储*/
int i,j,k;
EdgeNode * s;
printf("请输入顶点数和边数(输入格式为:顶点数,边数):
");
scanf("%d,%d",&(G->n),&(G->e)); /*读入顶点数和边数*/
printf("请输入顶点信息(输入格式为:V0):
");

for (i=0;in;i++) /*建立有n 个顶点的顶点表*/
{
scanf("
%s",&(G->adjlist[i].vertex)); /*读入顶点信息*/
G->adjlist[i].firstedge=NULL; /*顶点的边表头指针设为空*/
}

printf("请输入边的信息(输入格式为:i,j):
");
for (k=0;ke;k++) /*建立边表*/
{
scanf("
%d,%d",&i,&j); /*读入边的顶点对应序号*/
s=(EdgeNode*)malloc(sizeof(EdgeNode)); /*生成新边表结点s*/
s->adjvex=j; /*邻接点序号为j*/
s->next=G->adjlist[i].firstedge; /*将新边表结点s 插入到顶点Vi 的边表头部*/
G->adjlist[i].firstedge=s;
}
}/*CreateALGraph*/

#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");
}


用邻接表存储图所用的空间大小( )。【北京交通大学2004一、7(2分)】
【答案】:A 邻接表的顶点向量所占空间和顶点个数有关,边结点所占空间和边数有关。所以邻接表所占空间和顶点个数与边数相关。

用邻接表存储图所用的空间大小( )。
【答案】:A 选 A。设图具有 个顶点和 条边,则用邻接表存储图需要建立至少有 个顶点信息的顶点向量,此外为每一条边创建边链结点,有向图有 个边链结点,向图有 2 个边链结点(对称情形),所以所需的存储空间为 (+),就是说所用空间与图的顶点数和边数都有关。

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

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

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

求一个算法的代码:建立图的存储结构,能够输入图的顶点和边的信息,并...
py代码实现使用邻接表存储图的顶点和边的信息:class Node:def __init__(self, data):self.data = data self.next = None class Graph:def __init__(self, num_vertices):self.num_vertices = num_vertices self.graph = [None] * num_vertices def add_edge(self, src, dest):node = ...

如下图表示的是用邻接表存储的图,画出此图,并写出从A点开始按广度优先算...
广度优先遍历:ABDFEC 1、A的邻接点B和D 2、B的邻接点D和F,D已经遍历,只访问F 3、D的邻接点E 4、F的邻接点E,已经遍历 5、E无邻接点 6、最后扫描所有头结点C未访问,再从C开始遍历,C的邻接点DA都已遍历。

用邻接表法存储图所用的空间大小
用邻接表法存储图所用的空间大小与图的顶点数和边数都有关。用邻接表法存储图所用的空间大小与图的顶点数和边数都有关,邻接表?由顶点表和边表构成,顶点表由顶点域和指向第一条邻接边的指针构成。存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。

以邻接表作存储结构实现求源点到其余各顶点的最短路径的Dijkstra算法...
int kind;\/\/图的种类(kind=1为有向图)int dist[N];\/\/图的路径长度 int path[N];\/\/辅助数组 }AdjList;\/\/边 typedef struct{ int i;int j;int f;}Side;\/\/邻接表法创建图 int CreateDAG(AdjList *L){ int i,j;ArcNode *p=NULL;\/\/测试用例 Side S[N];S[0].i=1;S[0].j=3;...

图- 图的存储结构 - 邻接表表示法(一)
顶点v i 邻接表的头结点包含两个域 ① 顶点域vertex 存放顶点v i 的信息 ② 指针域firstedge v i 的邻接表的头指针 注意 ① 为了便于随机访问任一顶点的邻接表 将所有头结点顺序存储在一个向量中就构成了图的邻接表表示 ② 有时希望增加对图的顶点数及边数等属性的描述 可将邻接表和这些属性...

铁山区19268182270: 实验题目: 以邻接表储存图并对图进行遍历(写出流程图及程序) 大神们 帮帮忙吧!!! -
锁中丽思: #include "stdlib.h" #include "stdio.h" #define N 6 #define e 4 typedef int vextype; typedef struct node {int adjvex; /*邻接点域*/struct node *next; /*链域*/ }edgenode; /*边表结点*/typedef struct {vextype vertex; /*顶点信息*/edgenode *...

铁山区19268182270: 用邻接表实现图的存储,并实现图的深先遍历 -
锁中丽思: B 邻接表表示的图的广度优先搜索一般采用队列结构来实现算法: 首先选择一个起始节点,把它的临界表中节点加入到队列中,每次取出队首元素,然后把该元素的邻接表中的节点加入到队列末尾,标记已遍历过的节点,直到队列中没有节点为止 一般栈用于深度优先搜索,队列用于广度优先搜索

铁山区19268182270: 邻接表存储图,怎样画出此图,并写出深度优先遍历该图的结果.急 -
锁中丽思:[答案] cout lose++; } } replay(flag); } //--------------------------------------------------------------------- void main() { game deck; deck.rules();

铁山区19268182270: 下图是用邻接表存储的图,画出此图,并写出从C点开始按深度优先遍历该图的结果. -
锁中丽思: //从C点出发没有路径,貌似整个图都没有通路 #include <iostream> #include "conio.h" using namespace std; #define edgetype int #define vextype int #define MAX 6 typedef struct node { int vextex; //代号 struct node *next; }edgenode; typedef ...

铁山区19268182270: 以邻接多重表为存储结构,实现连通无向图的深度优先遍历和广度优先遍历. -
锁中丽思: 原创一个C++的#include #include #include #include #define MAXN 30using namespa...

铁山区19268182270: c语言图的遍历,邻接表存储,深度,广度优先遍历 -
锁中丽思: (1) 图的建立,按采用邻接表作为存储结构. (2) 从指定顶点出发进行深度优先搜索遍历. (3) 从指定顶点出发进行广度优先搜索遍历.#include"stdio.h" #include"string.h" #include"stdlib.h" #include"math.h"#define MAX_INT 1000 #...

铁山区19268182270: 用邻接表存储有向图、实现深度优先搜索 - 上学吧普法考试
锁中丽思: #include<stdio.h> #include<stdlib.h> #define MaxVerNum 100 /*最大顶点数为100*/ #define TRUE 1 #define FALSE 0 int visited[MaxVerNum]; typedef struct node{ /*边表结点*/ int adjvex; /*邻接点域*/ struct node * next; /*指向下一个邻接点的指...

铁山区19268182270: 怎么 建立一个有向图的邻接表存储,然后对该图进行深度优先搜索,按顺序输出所访问的顶点?
锁中丽思: 问问活动要你提问 你们会问什么问题上来 ===========================这个链表结构应该包含 以下3个 部分 1 深度 2 父节点 3 实际存储内容 等号上面的是我的误操作 请无视

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网