题目:要求图用邻接表方式存储,输入一个图,进行图的深度优先遍历及广度优先遍历。
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
FILE *fp;
typedef struct Edgenode
{
int data;
struct Edgenode *next;
} Edgenode;
struct Linjienode
{
int visit;
Edgenode *tounode;
} LJbiaonode, LJbiao[MAX];
//递归的DFS 图的深度优先遍历
void DFSdigui(struct Linjienode *LJbiao, int x)
{
Edgenode *A;
fprintf(fp, "%d", LJbiao[x].tounode->data);
LJbiao[x].visit = 1;
A = LJbiao[x].tounode;
while (A != NULL)
{
if (LJbiao[A->data].visit != 1)
{
DFSdigui(LJbiao, A->data);
}
A = A->next;
}
}
//非递归的BFS 图的广度优先遍历
void BFS(struct Linjienode *LJbiao, int x)
{
Edgenode *A;
int i;
int front = 0, rear = 0;
int dui[MAX];
fprintf(fp, "%d", LJbiao[x].tounode->data);
LJbiao[x].visit = 1;
dui[++rear] = x;
while (front - rear != 0) //队列非空,出队
{
i = dui[++front];
A = LJbiao[i].tounode->next;
while (A != NULL)
{
if (LJbiao[A->data].visit != 1)
{
fprintf(fp, "%d", LJbiao[A->data].tounode->data);
LJbiao[A->data].visit = 1;
dui[++rear] = A->data;
}
A = A->next;
}
}
}
int main(void)
{
fp = fopen("tubianli.txt", "w");
int m, n, p, q;
Edgenode *s;
Edgenode *cur;
Edgenode *end;
printf("请输入图的结点数和边的条数:");
scanf("%d %d", &m, &n);
for (int i = 1; i < m + 1; i++)
{
LJbiao[i].tounode = (Edgenode *)malloc(sizeof(Edgenode));
LJbiao[i].tounode->data = i;
LJbiao[i].visit = 0;
}
int current = 1;
int flag = 0;
int bian = 0;
printf("请输入含有边的两个节点对如'1 3'(输入#表示输入完成):");
while (p != m || bian != m - 1)
{
scanf("%d%d", &p, &q);
if (getchar() == '#') //最后输入#代表结束
{
break;
}
while (p != current)
{
current++;
flag = 0;
bian = 0;
}
if (p == current && flag == 0) //把邻接表头连接上边结点
{
s = (Edgenode *)malloc(sizeof(Edgenode));
LJbiao[p].tounode->next = s;
s->data = q;
s->next=NULL;
flag = 1;
}
else if (p == current && flag == 1) //串联
{
cur = (Edgenode *)malloc(sizeof(Edgenode));
s->next = cur;
s = s->next;
s->data = q;
s->next=NULL;
}
}
fprintf(fp, "图的深度优先遍历(DFS)为:\n");
DFSdigui(LJbiao, 1);
for (int i = 1; i < m + 1; i++)//防止图断裂的情况
{
if (LJbiao[i].visit == 0)
{
DFSdigui(LJbiao, i);
}
}
fprintf(fp, "\nBFS图的广度优先遍历(BFS)为:\n");
for (int i = 1; i < m + 1; i++) //重置访问
LJbiao[i].visit = 0;
BFS(LJbiao, 1);
for (int i = 1; i < m + 1; i++)
{
if (LJbiao[i].visit == 0)
{
BFS(LJbiao, i);
}
}
fclose(fp);
return 0;
}
输出]