图的DFS和BFS算法

来源:互联网 发布:数据恢复软件 编辑:程序博客网 时间:2024/04/29 04:07
# include<stdio.h>
# include<stdlib.h>


#define MAXVEX 20
#define INFINITY 32768




/*
队列的存储结构
*/


typedef struct Queue
{
int rear,front;
int data[MAXVEX];
}SeQueue,*PSeQueue;
/*
邻接表存储结构
*/
typedef struct ArcNode 
{
int adjvex;
struct ArcNode * pNext;
}NODE,*PNODE;//边的结构


typedef struct VertexNode
{
char vexdata;
PNODE head;
}VertexNode;//顶点的存储结构


typedef struct list
{
VertexNode vertex[MAXVEX];
int vexnum;
int arcnum;
}List,*PList;


/*
邻接矩阵存储结构
*/


typedef struct graph
{
int arcs[MAXVEX][MAXVEX];
char vex[MAXVEX];
int vexnum;
int arcnum;
}Graph,*PGraph;


Graph gh1;
PGraph G1 = &gh1;
List g;
PList G2 = &g;
SeQueue q;
PSeQueue sq = &q;
int visited[MAXVEX] = {0};


void creat1();
void creat2();
void trave(PNODE head);
void count1();
void count2();
void DFS1(int n);
void DFS2(int n);
int FirstAdjVex1(int n);
int NextAdjVex1(int n,int w);
int FirstAdjVex2(int n);
int NextAdjVex2(int n,int w);
void InitSeq();
void InSequeue(int x);
void OutSequeue(int * data);
void BFS1(int n);
void BFS2(int n);
int Empty();




int main(void)
{
int i,n,m;
while(1)
{
printf("1.邻接矩阵创建\n2.邻接表创建\n3.退出\n请选择:");
scanf("%d",&n);
if(n == 3)
exit(1);
if(n == 1)
{
creat1();
count1();
while(1)
{
printf("1.BFS\n2.DFS\n3.返回上一层\n请选择:");
scanf("%d",&m);
if(m == 3)
{
system("cls");
break;
}
if(m == 2) 
{
for(i = 1;i <= G1->vexnum;i++)
visited[i] = 0;
for(i = 1;i < G1->vexnum;i++) {
if(!visited[i])
{
printf("DFS:");
DFS1(i);
printf("\n");
}
}
}
if(m == 1)
{
for(i = 1;i <= G1->vexnum;i++)
visited[i] = 0;
for(i = 1;i < G1->vexnum;i++) {
if(!visited[i])
{
printf("BFS:");
BFS1(i);
printf("\n");
}
}
}


}
}
if(n == 2)
{
// system("cls");
creat2();
count2();
while(1)
{
printf("1.BFS\n2.DFS\n3.返回上一层\n请选择:");
scanf("%d",&m);
if(m == 3)
{
system("cls");
break;
}
if(m==2)
{
for(i = 1;i <= G2->vexnum;i++)
visited[i] = 0;
for(i = 1;i < G2->vexnum;i++) {
if(!visited[i])
{
printf("DFS:");
DFS2(i);
printf("\n");
}
}
}
if(m==1)
{
for(i = 1;i <= G2->vexnum;i++)
visited[i] = 0;
for(i = 1;i < G2->vexnum;i++) {
if(!visited[i])
{
printf("BFS:");
BFS2(i);
printf("\n");
}
}
}
}
}
}
return 0;
}




void creat1() {
int i,j,k,vex1,vex2;
printf("请输入图中的顶点和边数:");
scanf("%d%d",&G1->vexnum,&G1->arcnum);
fflush(stdin);
for(i = 1;i <= G1->vexnum;i++)//将邻接矩阵中的值都初始化为无穷大
for(j = 1;j < G1->arcnum;j++)
G1->arcs[i][j] = INFINITY;

for(i = 1;i <= G1->vexnum ;i++)//为顶点赋值 
{
fflush(stdin);
printf("请输入第%d个顶点的值:",i);
scanf("%c",&G1->vex[i]);
}


for(k = 0;k < G1->arcnum;k++) //为边赋值
{
fflush(stdin);
printf("请输入第%d条弧的弧尾顶点:",k+1);
scanf("%d",&vex1);
fflush(stdin);
printf("请输入第%d条弧的弧头顶点:",k+1);
scanf("%d",&vex2);
fflush(stdin);
G1->arcs[vex1][vex2] = 1;
}
}


void creat2() {
int i;
PNODE pNew,tail;
printf("请输入图中的顶点和边数:");
scanf("%d%d",&G2->vexnum,&G2->arcnum);
for(i = 1;i <= G2->vexnum;i++) {
fflush(stdin);
printf("请输入第%d个顶点的值:",i);
scanf("%c",&G2->vertex[i].vexdata);
G2->vertex[i].head = (PNODE)malloc(sizeof(NODE));
tail = G2->vertex[i].head;
while(1)
{
pNew = (PNODE)malloc(sizeof(NODE));
printf("请输入与该顶点邻接的顶点的下一个顶点(0退出):");
scanf("%d",&pNew->adjvex);
if(pNew->adjvex == 0)
break;
tail->pNext = pNew;
tail = pNew;
}
tail->pNext = NULL;
G2->vertex[i].head = G2->vertex[i].head->pNext;
trave(G2->vertex[i].head);
}


}


void trave(PNODE head) {
PNODE p;
p = head;
printf("Data:");
while(p != NULL)
{
printf("%d\t",p->adjvex);
p = p->pNext;
}
printf("\n");


}


void count1() {
int i,j,in,out;
for(i = 1;i <= G1->vexnum;i++) {
in = 0;
out = 0;
for(j = 1;j <= G1->vexnum;j++) 
{
if(G1->arcs[i][j] != INFINITY) {//第i行的可达点
out++;
}
if(G1->arcs[j][i] != INFINITY) {//第i列的可达点
in++;
}
}
printf("顶点:%c 的出度是:%d\t 入度是:%d\n",G1->vex[i],out,in);
}


}


void count2() {
int i;
PNODE p;
int * in,* out;
in = (int *)malloc(sizeof(int)*(G2->vexnum+1));
out = (int *)malloc(sizeof(int)*(G2->vexnum+1));
for(i = 1;i <= G2->vexnum;i++)
{
in[i] = 0;
out[i] = 0;
}
for(i = 1;i <= G2->vexnum;i++) {
p = G2->vertex[i].head;
while(p != NULL)
{
out[i]++;
in[p->adjvex]++;
p = p->pNext;
}
}
for(i = 1;i <= G2->vexnum;i++) {
printf("顶点:%c 的出度是:%d\t 入度是:%d\n",G2->vertex[i].vexdata,out[i],in[i]);
}


}
void DFS1(int n) {
int w;
printf("%c\t",G1->vex[n]);
visited[n] = 1;
w = FirstAdjVex1(n);
while(w != -1)
{
if(!visited[w])
DFS1(w);
w = NextAdjVex1(n,w);
}
}


void DFS2(int n) {
int w;
printf("%c\t",G2->vertex[n].vexdata);
visited[n] = 1;
w = FirstAdjVex2(n);
while(w != -1)
{
if(!visited[w])
DFS2(w);
w = NextAdjVex2(n,w);
}


}


int FirstAdjVex1(int n) {
int i;
for(i = 1;i <= G1->vexnum;i++) {
if(G1->arcs[n][i] != INFINITY) {
return i;
}
}
return -1;
}


int NextAdjVex1(int n,int w) {
int i;
for(i = w+1;i <= G1->vexnum;i++) {
if(G1->arcs[n][i] != INFINITY) {
return i;
}
}
return -1;


}


int FirstAdjVex2(int n) {
PNODE p;
p = G2->vertex[n].head;
if(p != NULL) {
return p->adjvex;
}
return -1;


}


int NextAdjVex2(int n,int w) {
PNODE p;
p = G2->vertex[n].head;
while(p != NULL)
{
if(p->adjvex == w&&p->pNext !=NULL)
return p->pNext->adjvex;
p = p->pNext;
}
return -1;
}


void InitSeq() {
sq->front = sq->rear = -1;


}
void InSequeue(int x) {
if((sq->rear+1)%MAXVEX == sq->front)
{
printf("队满");
return;
}
else
{
sq->rear = (sq->rear+1)%MAXVEX;
sq->data[sq->rear] = x;
}
}


void OutSequeue(int * data) {
if(sq->front == sq->rear) {
printf("队空");
return ;
}
else {
sq->front = (sq->front+1)%MAXVEX;
*data = sq->data[sq->front];
}
}


int Empty() {
if(sq->front == sq->rear)
return 1;
return 0;


}


void BFS1(int n) {
int k,w;
printf("%c\t",G1->vex[n]);
visited[n] = 1;
InitSeq();
InSequeue(n);
while(!Empty()) {
OutSequeue(&k);
w = FirstAdjVex1(k);
while(w != -1) {
if(!visited[w]) {
printf("%c\t",G1->vex[w]);
visited[w] = 1;
InSequeue(w);
}
w = NextAdjVex1(k,w);
}
}
}


void BFS2(int n) {
int k,w;
printf("%c\t",G2->vertex[n].vexdata);
visited[n] = 1;
InitSeq();
InSequeue(n);
while(!Empty()) {
OutSequeue(&k);
w = FirstAdjVex2(k);
while(w != -1) {
if(!visited[w]) {
printf("%c\t",G2->vertex[w].vexdata);
visited[w] = 1;
InSequeue(w);
}
w = NextAdjVex2(k,w);
}
}


}
0 0