赞
踩
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
int visited[maxsize];//结点是否被访问的标志信息
typedef struct edgenode//建立边表结点
{
int adjvex;//存储相邻节点的下标
edgenode* next;//指向下一个结点的指针
}edgenode;
typedef struct vertexnode//建立顶点表
{
//顶点表可以用数组,也可以用链表
//但是孩子结点(也就是边表结点)必须用链表来实现
int data;//顶点域,存储顶点信息
edgenode* firstchild;//指向边表结点的第一个指针
}vertexnode;
//建立图
typedef struct praghlist//表示邻接表(因为它后面有一个list)
{
vertexnode vert[maxsize];
int numnode, numedge;//表示顶点结点和边数
}praghlist;
void init(praghlist G)
{
int i, j;
printf(“请输入顶点数和边数\n”);
scanf_s("%d%d", &G->numedge, &G->numedge);
//初始化顶点表
for (int i = 0; i < G->numedge; i++)
{
printf(“请输入第%d各顶点表结点的信息\n”, i + 1);
scanf_s("%d", &G->vert[i].data);
G->vert[i].firstchild = NULL;
}
//初始化边表
for (int k = 0; k < G->numedge; k++)
{
edgenode e = (edgenode*)malloc(sizeof(edgenode));
printf(“请输入边(i,j)的下标\n”);
scanf_s("%d%d", &i, &j);
e->adjvex = j;
e->next = G->vert[i].firstchild;
G->vert[i].firstchild = e;
e = (edgenode*)malloc(sizeof(edgenode));
e->adjvex = i;
e->next = G->vert[j].firstchild;
G->vert[j].firstchild = e;
}
printf(“图的初始化工作完毕\n”);
}
void DFS(praghlist G, int i)
{
visited[i] = 1;//注意要将刚刚访问过的结点置为1,表示已经访问过了
edgenode* p = G.vert[i].firstchild;
//从第一个结点开始寻找
while §
{
if(!visited[p->adjvex])
DFS(G, p->adjvex);//一直到该节点的邻接结点都被访问过之后才到下一个结点
//直到所有与之相连的结点都被访问过
//最后通过for循环遍历一次看是否还有结点没有访问过
//直到该for循环结束,然后所有的结点就都被访问过了
p = p->next;
}
}
//邻接表的深度遍历
void DFStraverse(praghlist G)
{
for (int i = 0; i < G.numedge; i++)
{
visited[i] = 0;//将图中的所有节点的visited值都置为0,表示
//图的所有结点都没有被访问过
}
for (int i = 0; i < G.numedge; i++)
{
if (!visited[i] )
{
DFS(G, i);
}
}
}
int main(void)
{
praghlist G;
init(&G);
DFStraverse(G);
system(“pause”);
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。