#include <stdio.h>
#include <malloc.h>
#define MAXLEN 20
typedef struct node3
{ int adjvex;
struct node3 *next;
}ARCNODE;
typedef struct
{ char data;
ARCNODE *firstarc;
int id;
} VEXNODE;
typedef struct
{ VEXNODE vertices[MAXLEN];
int vexnum, arcnum;
int kind;
}ALGRAPH;
int visited[MAXLEN];
ALGRAPH creat_graph()
{
ARCNODE *p;
int i, s, d;
ALGRAPH g;
printf("\n\n输入顶点数和边数(用逗号隔开) : ");
scanf("%d,%d", &s, &d);fflush(stdin);
g.vexnum = s; /*存放顶点数在g.vexnum 中 */
g.arcnum = d; /*存放边点数在g.arcnum 中*/
printf("\n\n");
for(i = 0; i < g.vexnum; i++) /*输入顶点的值*/
{printf("输入顶点 %d 的值 : ", i + 1);
scanf("%c", &g.vertices[i].data);
fflush(stdin);
g.vertices[i].firstarc = NULL;}
printf("\n");
for(i = 0; i < g.arcnum; i++)
{printf("输入第 %d 条边的起始顶点和终止顶点下标(用逗号隔开): ", i+1);
scanf("%d,%d", &s, &d); /*输入边的起始顶点和终止顶点*/
fflush(stdin);
while(s < 0 || s >= g.vexnum || d < 0 || d >= g.vexnum)
{ printf("输入错,重新输入: ");
scanf("%d,%d", &s, &d); }
p = malloc(sizeof(ARCNODE)); /*建立一个和边相关的结点*/
p->adjvex = d;
p->next = g.vertices[s].firstarc; /*挂到对应的单链表上*/
g.vertices[s].firstarc = p;
p = malloc(sizeof(ARCNODE)); /*建立另一个和边相关的结点*/
p->adjvex = s;
p->next = g.vertices[d].firstarc; /*挂到对应的单链表上*/
g.vertices[d].firstarc = p;}
return g;
}
void dfs(ALGRAPH g, int v){
/*连通图的深度遍历算法:从v顶点出发*/
ARCNODE *p;
visited[v] = 1; /*从编号为v的顶点出发,visited 数组对应置1*/
printf(" %c", g.vertices[v].data); /*输出v顶点*/
p = g.vertices[v].firstarc; /*取单链表的第一个结点*/ while(p != NULL) /*对应单链表不空,进行遍历*/ { if(visited[p->adjvex] == 0) /*如果有未被访问过的结点*/ dfs(g, p->adjvex); /*递归调用深度遍历算法*/
p = p->next;} /*取单链表的下一个结点*/
}
main()
{
ALGRAPH g;
int i;
printf("\n连通图的深度遍历\n");
g = creat_graph(); /*建立连通图的邻接链表结构*/ for(i = 0; i < g.vexnum; i++) /*visited数组初始化,均置0*/ visited[i] = 0;
printf("\n\n输入深度遍历起始顶点下标(0 -- %d) : ",g.vexnum-1); scanf("%d",&i);
printf("\n\n深度遍结果序列 : ");
dfs(g,i); /*连通图的深度遍历算法*/ printf("\n\n");
}。