版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/82999993
邻接表
// DFS
int visit[MAX_VERTEX_NUM];
void DFSUtil_AL(ALGraph G, int v) {
ArcNode *p;
visit[v]=1;
Visit(G.vers[v].data);
for (p=G.vers[v].firstarc; p; p=p->next)
if (!visit[p->adjV])
DFSUtil_AL(G, p->adjV);
}
void DFS_AL(ALGraph G) {
int i;
for (i=0; i<MAX_VERTEX_NUM; i++) {
visit[MAX_VERTEX_NUM] = 0;
}
for (i=0; i<G.vernum; ++i) {
if (!visit[i])
DFSUtil_AL(G, i);
}
}
// DFS非递归
void DFSTraverse_Nonrecurisve(ALGraph G) {
int visit[maxSize];
int i,j;
ArcNode *p;
int stack[maxSize],top=-1;
for (i=0; i<maxSize; i++) visit[i]=0;
for (i=0; i<G.vernum; i++) {
if (visit[i]==0) { //没有访问过
//从它开始
top=-1; //清空栈
stack[++top]=i; //入栈
visit[i]=1; Visit(G.vers[i].data); //访问
while (top!=-1) { //栈不空
j = stack[top]; //得出栈顶
//从j开始走
for (p=G.vers[j].firstarc; p; p=p->next) {
if (!visit[p->adjV]) { //这条边没有访问过
visit[p->adjV]=1;Visit(G.vers[p->adjV].data); //访问
stack[++top]=p->adjV; //从这个点继续
break;
} else //这条边走过了,找下条边
continue;
}
if (p==NULL) { //j的邻边走完了,返回上个结点,继续往下走
--top;
}
}
}
}
}
// BFS
void BFSUntil_AL(ALGraph G,int v) {
ArcNode *p;
int i;
int queue[maxSize],front,rear;
front=rear=0;
queue[rear]=v; rear=(rear+1)%maxSize; //入队列
while (front!=rear) { //队列未满
i=queue[front]; front=(front+1)%maxSize; //出队列
//访问i
visit[i]=1;
Visit(G.vers[i].data);
//访问i的邻边
for (p=G.vers[i].firstarc; p; p=p->next) {
if (visit[p->adjV]==0) {
queue[rear]=p->adjV;
rear=(front+1)%maxSize;
}
}
}
}
void BFS_AL(ALGraph G) { //BFS遍历
int i;
for (i=0; i<MAX_VERTEX_NUM; ++i) visit[i]=0; //初始化
for (i=0; i<G.vernum; i++) {
if (visit[i]==0) {//没有访问过
BFSUntil_AL(G, i);
}
}
}
完整代码
【邻接表】
#include<stdio.h>
#include<stdlib.h>
#ifndef BASE
#define BASE
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int bool;
#endif
#define VertexType char //点类型
#define VRType int //边类型
#define maxSize 20
void Visit(VertexType e) {
printf("%c", e);
}
#define MAX_VERTEX_NUM 20
typedef enum{DG, UDG} GraphKind;
typedef struct ArcNode{
int adjV; //边指向的顶点
VRType weight; //权重
struct ArcNode *next;
}ArcNode; //边
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode, AdjList[MAX_VERTEX_NUM]; //顶点
typedef struct{
GraphKind kind;
int vernum,arcnum;
AdjList vers;
}ALGraph;
/*------------------------
|7.14 创建有向图的邻接表|
------------------------*/
Status InitGraph_AL(ALGraph *pG) { //初始化
int i;
pG->arcnum = 0;
pG->vernum = 0;
for (i=0; i<MAX_VERTEX_NUM; ++i)
pG->vers[i].firstarc = NULL; //VC++6.0中指针初始化为0xcccccccc
return OK;
}
int LocateVex_AL(ALGraph G, VertexType e) { //定位值为e的元素下标
int i;
for (i=0; i<G.vernum; ++i) {
if (G.vers[i].data == e) {
return i;
}
}
return -1;
}
Status CreateDG_AL(ALGraph *pG) { //创建有向图的邻接表
//输入规则:顶点数目->弧的数目->各顶点的信息->各条弧的信息
int i,a,b;
char tmp[MAX_VERTEX_NUM];
char h,t;
ArcNode *p, *q;
InitGraph_AL(pG); //VC++6.0中指针初始化为0xcccccccc,如果不将指针初始化为NULL,会出错
//图的类型
pG->kind = DG;
//顶点数目
scanf("%d", &i); if (i<0) return ERROR;
pG->vernum = i;
//弧的数目
scanf("%d", &i); if (i<0) return ERROR;
pG->arcnum = i;
//各顶点信息
scanf("%s", tmp);
for (i=0; i<pG->vernum; ++i) pG->vers[i].data=tmp[i];
//弧的信息
for (i=0; i<pG->arcnum; ++i) {
scanf("%s", tmp);
h = tmp[0]; t = tmp[2];
a = LocateVex_AL(*pG, h);
b = LocateVex_AL(*pG, t);
if (a<0 || b<0) return ERROR;
p = (ArcNode *)malloc(sizeof(ArcNode)); if (!p) exit(OVERFLOW);
p->adjV=b;p->next=NULL;
if (pG->vers[a].firstarc) { //已经有边了
for (q = pG->vers[a].firstarc; q->next; q=q->next) ; //找到最后一条
q->next = p;
} else { //第一条边
pG->vers[a].firstarc = p;
}
}
return OK;
}
// DFS
int visit[MAX_VERTEX_NUM];
void DFSUtil_AL(ALGraph G, int v) {
ArcNode *p;
visit[v]=1;
Visit(G.vers[v].data);
for (p=G.vers[v].firstarc; p; p=p->next)
if (!visit[p->adjV])
DFSUtil_AL(G, p->adjV);
}
void DFS_AL(ALGraph G) {
int i;
for (i=0; i<MAX_VERTEX_NUM; i++) {
visit[MAX_VERTEX_NUM] = 0;
}
for (i=0; i<G.vernum; ++i) {
if (!visit[i])
DFSUtil_AL(G, i);
}
}
// DFS非递归
void DFSTraverse_Nonrecurisve(ALGraph G) {
int visit[maxSize];
int i,j;
ArcNode *p;
int stack[maxSize],top=-1;
for (i=0; i<maxSize; i++) visit[i]=0;
for (i=0; i<G.vernum; i++) {
if (visit[i]==0) { //没有访问过
//从它开始
top=-1; //清空栈
stack[++top]=i; //入栈
visit[i]=1; Visit(G.vers[i].data); //访问
while (top!=-1) { //栈不空
j = stack[top]; //得出栈顶
//从j开始走
for (p=G.vers[j].firstarc; p; p=p->next) {
if (!visit[p->adjV]) { //这条边没有访问过
visit[p->adjV]=1;Visit(G.vers[p->adjV].data); //访问
stack[++top]=p->adjV; //从这个点继续
break;
} else //这条边走过了,找下条边
continue;
}
if (p==NULL) { //j的邻边走完了,返回上个结点,继续往下走
--top;
}
}
}
}
}
// BFS
void BFSUntil_AL(ALGraph G,int v) {
ArcNode *p;
int i;
int queue[maxSize],front,rear;
front=rear=0;
queue[rear]=v; rear=(rear+1)%maxSize; //入队列
while (front!=rear) { //队列未满
i=queue[front]; front=(front+1)%maxSize; //出队列
//访问i
visit[i]=1;
Visit(G.vers[i].data);
//访问i的邻边
for (p=G.vers[i].firstarc; p; p=p->next) {
if (visit[p->adjV]==0) {
queue[rear]=p->adjV;
rear=(front+1)%maxSize;
}
}
}
}
void BFS_AL(ALGraph G) { //BFS遍历
int i;
for (i=0; i<MAX_VERTEX_NUM; ++i) visit[i]=0; //初始化
for (i=0; i<G.vernum; i++) {
if (visit[i]==0) {//没有访问过
BFSUntil_AL(G, i);
}
}
}
int main() {
/*
6
11
ABCDEF
B,A
B,D
C,B
C,F
D,C
D,E
D,F
E,A
F,A
F,B
F,E
*/
ALGraph G;
CreateDG_AL(&G);
DFS_AL(G);printf("\n");
DFSTraverse_Nonrecurisve(G);printf("\n");
BFS_AL(G);printf("\n");
return 0;
}