头文件
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
定义结构体
typedef int Vextype;
typedef struct Vnode
{
Vextype data;
struct Vnode* next;
}Vnode;
typedef Vnode Lgraph[MAX];
typedef struct
{
int V[MAX];
int front;
int rear;
}Queue;
定义变量
Lgraph Ga;
int n, e, visited[MAX];
创建无向图
void creat_L(Lgraph G)
{
Vnode* p, * q;
int i, j, k;
printf("\n请输入图的顶点数和边数:");
scanf("%d %d", &n, &e);
for (i = 1;i <= n;i++)
{
G[i].data = i;
G[i].next = NULL;
}
for (k = 1;k <= e;k++)
{
printf("\n请输入每条边的两个顶点编号:");
scanf("%d %d", &i, &j);
p = (Vnode*)malloc(sizeof(Vnode));
p->data = i;
p->next = G[j].next;
G[j].next = p;
q = (Vnode*)malloc(sizeof(Vnode));
q->data = j;
q->next = G[i].next;
G[i].next = q;
}
}
输出无向图
void output_L(Lgraph G)
{
int i;
Vnode* p;
printf("\n无向图的邻接表为:\n");
for (i = 1;i <= n;i++)
{
printf("\n%d->", i);
p = G[i].next;
while (p != NULL)
{
printf("%d->", p->data);
p = p->next;
}
}
}
初始化队列
void initqueue(Queue* q)
{
q->front = -1;
q->rear = -1;
}
判断队列是否为空
int quempty(Queue* q)
{
if (q->front == q->rear)
{
return 1;
}
else
{
return 0;
}
}
入队
void enqueue(Queue* q, int e)
{
if ((q->rear + 1) % MAX == q->front)
printf("队列满!\n");
else
{
q->rear = (q->rear + 1) % MAX;
q->V[q->rear] = e;
}
}
出队
int dequeue(Queue* q)
{
int t;
if (q->front == q->rear)
{
printf("队列空!\n");
return 0;
}
else
{
q->front = (q->front + 1) % MAX;
t = q->V[q->front];
return t;
}
}
深度优先遍历
void dfsl(Lgraph G, int v)
{
Vnode* p;
printf("%d->", G[v].data);
visited[v] = 1;
p = G[v].next;
while (p != NULL)
{
v = p->data;
if (visited[v] == 0)
{
dfsl(G, v);
}
p = p->next;
}
}
广度优先遍历
void bfsl(Lgraph G, int v)
{
Vnode* p;
int x;
Queue* q = (Queue*)malloc(sizeof(Queue));
initqueue(q);
printf("%d->", G[v].data);
visited[v] = 1;
enqueue(q, v);
while (!quempty(q))
{
x = dequeue(q);
p = G[x].next;
while (p)
{
v = p->data;
if (visited[v] == 0)
{
printf("%d->", G[v].data);
visited[v] = 1;
enqueue(q, v);
}
p = p->next;
}
}
}
主函数
int main()
{
int v1, i;
for (i = 1;i < MAX;i++)
{
visited[i] = 0;
}
creat_L(Ga);
output_L(Ga);
printf("\n请输入深度优先遍历的出发点:");
scanf("%d", &v1);
printf("\n深度优先遍历的结果为:");
dfsl(Ga, v1);
for (i = 1;i < MAX;i++)
{
visited[i] = 0;
}
printf("\n\n请输入广度优先遍历的出发点:");
scanf("%d", &v1);
printf("\n广度优先遍历的结果为:");
bfsl(Ga, v1);
}
运行结果