图的深度与广度遍历
#define M 20
typedef char DataType;
typedef struct node {
int adjvex;
struct node* next;
}EdgeNode;
typedef struct vnode {
DataType vertex;
EdgeNode* FirstEdge;
}VertexNode;
typedef struct {
VertexNode adjlist[M];
int n, e;
}LinkedGraph;
void creatlinke(LinkedGraph* g, char* filename, int c)
{
int i, j, k;
EdgeNode* s;
FILE* fp;
fp = fopen(filename, "r");
if (fp)
{
fscanf(fp, "%d%d", &g->n, &g->e);
for (i = 0; i < g->n; i++)
{
fscanf(fp, "%ls", &g->adjlist[i].vertex);
g->adjlist[i].FirstEdge = NULL;
}
for (k = 0; k < g->e; k++)
{
fscanf(fp, "%d%d", &i, &j);
s = (EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex = j;
s->next = g->adjlist[i].FirstEdge;
g->adjlist[i].FirstEdge = s;
if (c == 0)
{
s = (EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex = i;
s->next = g->adjlist[j].FirstEdge;
g->adjlist[j].FirstEdge = s;
}
}
fclose(fp);
}
else
g->n = 0;
}
int visited[M];
void dfs(LinkedGraph g, int i)
{
EdgeNode* p;
cout << "vist vertex: " << g.adjlist[i].vertex << endl;
visited[i] = 1;
p = g.adjlist[i].FirstEdge;
while (p)
{
if (!visited[p->adjvex])
dfs(g, p->adjvex);
p = p->next;
}
}
void DfsTraverse(LinkedGraph g)
{
int i;
for (i = 0; i < g.n; i++)
visited[i] = 0;
for (i = 0; i < g.n; i++)
if (!visited[i])
dfs(g, i);
}
void bfs(LinkedGraph g, int i)
{
int j;
EdgeNode* p;
int queue[M], front, rear;
front = rear = 0;
cout << g.adjlist[i].vertex << endl;
visited[i] = 1;
queue[rear++] = i;
while (rear > front)
{
j = queue[front++];
p = g.adjlist[j].FirstEdge;
while (p)
{
if (visited[p->adjvex] == 0)
{
cout << g.adjlist[p->adjvex].vertex << endl;
queue[rear++] = p->adjvex;
visited[p->adjvex] = 1;
}
p = p->next;
}
}
}
int BfsTraverse(LinkedGraph g)
{
int i, count = 0;
for (i = 0; i < g.n; i++)
visited[i] = 0;
for (i = 0; i < g.n; i++)
{
if (!visited[i])
{
printf("\n");
count++;
bfs(g, i);
}
}
return count;
}