2020-08-27

#include<stdio.h>#include<stdlib.h>#define INFINTY 65535 //最大值#define MAX 20 //最大顶点个数#define OK 1#define ERROR 0#define FALSE 0#define TRUE 1typedef int status;typedef int EdgeType;//边typedef int QElemType;typedef char VertexType;//顶点类//typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网typedef struct{ VertexType vexs[MAX];//顶点 EdgeType arcs[MAX][MAX]; //邻接矩阵 int vexnum,arcnum; //图当前的顶点数和弧数// GraphKind kind; //图的种类}MGraph;/队列结构/typedef struct QNode{ QElemType data; struct QNode *next;}QNode,*QueuePtr;typedef struct{ QueuePtr front,rear; //队头队尾指针 }LinkQueue;int InitQueue(LinkQueue &Q){ Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front) exit(0); Q.front->next=NULL; return 1; } int EnQueue(LinkQueue &Q,int i){ QueuePtr s;printf(" i=%d",i); s=(QueuePtr)malloc(sizeof(QNode)); if(!s) exit(0); s->data=i; s->next=NULL; Q.rear->next=s; Q.rear=s;printf(" s->data=%d\n",s->data); return 1; }//出队列int DeQueue(LinkQueue *Q,int *i){ QueuePtr p; if(Q->frontQ->rear) return 0; p=Q->front->next; //相当于p储存第一个结点 *i=p->data; Q->front->next=p->next; if(pQ->rear) //若队头是队尾 ,删除后将rear指向头结点 Q->rear=Q->front; free§; return 1; } status LocateVex(MGraph *G,VertexType e){ int i; for(i=0;ivexnum;++i) { if(eG->vexs[i]) return i; } return -1;}status CreatDG(MGraph *G)//有向图{ scanf("%d %d",&G->vexnum,&G->arcnum);getchar(); int i,j,k; VertexType v1,v2; i=0; while(ivexnum) { scanf("%c",&G->vexs[i]); i++; } getchar(); for(i=0;ivexnum;i++)//初始化 for(j=0;jvexnum;j++) G->arcs[i][j]=INFINTY; for(k=0;karcnum;k++) { scanf("%c,%c",&v1,&v2);//输入一条边依附的顶点 getchar(); i=LocateVex(G,v1);//头 j=LocateVex(G,v2);//尾 G->arcs[i][j]=1; G->arcs[i][j]=G->arcs[j][i]; } return OK;}//输出邻接矩阵 void Output(MGraph *G) { int i,j,count=0; for(i=0;ivexnum;i++) printf("\t%c",G->vexs[i]); printf("\n"); for(i=0;ivexnum;i++) { printf("%4c",G->vexs[i]); for(j=0;jvexnum;j++) { printf("\t%d",G->arcs[i][j]); count++; if(count%G->vexnum0) printf("\n"); } } } int visited[MAX];void BFSTraverse(MGraph *G){ int i,j; LinkQueue Q; for(i=0;ivexnum;++i) visited[i]=FALSE; InitQueue(Q); for(i=0;ivexnum;++i) { if(!visited[i]) { visited[i]=TRUE; printf("%c “,G->vexs[i]); EnQueue(Q,i); while(Q.front->next!=NULL) { DeQueue(&Q,&i); //将队中元素出队列,赋值给i for(j=0;jvexnum;j++) { if(G->arcs[i][j]==1&&!visited[j]) //其他顶点与该顶点存在边 且未访问过 { visited[j]=TRUE; printf(”%c",G->vexs[j]); EnQueue(Q,j); //入队列 } } } } }}int main(){ MGraph *G=NULL; G=(MGraph *)malloc(sizeof(MGraph)); CreatDG(G); Output(G); BFSTraverse(G);}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值