#include<stdio.h> #include<malloc.h> #define MAX_VERTEX_NUM 10 typedef char VertexType; typedef struct ArcNode//边 { int adjvex; struct ArcNode *nextarc; int info; }ArcNode; //表结点类型 typedef struct VNode//顶点 { VertexType data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; //头结点 typedef struct { AdjList vertices; //邻接表 int vexnum,arcnum; }ALGraph; //设置一个全局的数组遍历 int visited[MAX_VERTEX_NUM]={0};//访问过设置为1,未访问完设置为0 //定义队列 typedef struct node //队列节点 { int vNode; struct node *Next; }Node; typedef struct Q { struct node *front; struct node *end; }Queue; ////获取边的位置 int Locate(ALGraph *G, char vex) { int i=0; for(;i<G->vexnum;i++) if(vex==G->vertices[i].data) break; return i; } //建立邻接表(无向图的邻接表) ALGraph *CreateALGraph(ALGraph *G) { G=(ALGraph*)malloc(sizeof(ALGraph)); printf("输入图的顶点数:\n"); scanf("%d",&G->vexnum); printf("输入图的边数:\n"); scanf("%d",&G->arcnum); printf("输入顶点的数据:\n"); int i; for(i=0;i<G->vexnum;i++) { printf("第%d次输入\n",i); printf("好奇葩\n"); fflush(stdin); scanf("%c",&G->vertices[i].data); G->vertices[i].firstarc=NULL; } printf("输入边:\n"); char vex1,vex2; ArcNode *p,*q; int in,out; for(i=0;i<G->arcnum;i++) { printf("输入弧%d(顶点1,顶点2)",i); fflush(stdin);//清空缓冲区,避免对后面数据的影响 scanf("%c%c",&vex1,&vex2);//输入一条弧的始点和终点 in =Locate(G,vex1); out =Locate(G,vex2); printf("%c,%c",vex1,vex2); p=(ArcNode *)malloc(sizeof(ArcNode)); p->adjvex=out; p->nextarc=NULL; //从头部插入节点 p->nextarc=G->vertices[in].firstarc; G->vertices[in].firstarc=p; //如果在这里也赋值的话,说明是无向图,此时需要重新设置值 q=(ArcNode *)malloc(sizeof(ArcNode)); q->adjvex=in; q->nextarc=NULL; q->nextarc=G->vertices[out].firstarc; G->vertices[out].firstarc=q; //给弧赋予权值 fflush(stdin);//清空缓冲区,避免对后面数据的影响 printf("给弧赋予权值!\n"); int index; scanf("%d",&index); p->info=index; q->info=index; } return G; } //测试一下 void Test(ALGraph *G) { int i=0; printf("输出顶点的参数值\n"); for(;i<G->vexnum;i++) { printf("%c\n",G->vertices[i].data); } } void DFS(ALGraph *G,int v) { printf("%c",G->vertices[v].data); visited[v]=1; ArcNode *p=G->vertices[v].firstarc; for(;p!=NULL;p=p->nextarc) if(visited[p->adjvex]==0) DFS(G,p->adjvex); } //深度遍历图 void DFSTraverse(ALGraph *G) { int i=0; for(;i<G->vexnum;i++) if(visited[i]==0) DFS(G,i); } //广度遍历图(借助于队列实现) Queue* InitQueue(Queue *q) { q=(Queue *)malloc(sizeof(Queue)); Node *front = (Node *)malloc(sizeof(Node)); q->front=q->end=front; q->front->Next=NULL; q->front->vNode=0;//用于存放节点的个数 return q; } void Traverse(Queue *q) { int i=0; Node *p=q->front->Next; for(;i<q->front->vNode;i++) { printf("%d\n",p->vNode); } } void EnQueue(Queue *q,int vNode) { // printf("进队列开始:\n"); Node *node=(Node*)malloc(sizeof(Node)); node->vNode=vNode; q->end->Next=node; node->Next=NULL; // printf("%d\n",q->end->Next->vNode); q->end=node; q->front->vNode++; // printf("%d\n",q->end->vNode); // printf("进队列结束:\n"); // printf("遍历一下队列:\n"); // Traverse(q); } int DeQueue(Queue *q) { int vNode=q->front->Next->vNode; // printf("%d出队列\n",q->front->Next->vNode); Node *p=q->front->Next; if(q->end==q->front->Next) { q->end=q->front; } q->front->Next=q->front->Next->Next; free(p); q->front->vNode--; // printf("%d出队列\n",vNode); return vNode; }/* bool QueueEmpty(Queue *q) { if(q->front->vNode==0) return false; else return true; }*/ void BFSTraverse(ALGraph *G) { Queue *q; ArcNode *p; int u; //初始化队列 q=InitQueue(q); int v=0; for(;v<G->vexnum;v++) { visited[v]=0; } for(v=0;v<G->vexnum;v++)//v尚未访问 { if(visited[v]==0) { printf("%c",G->vertices[v].data); visited[v]=1; EnQueue(q,v);//入队 while(q->front->vNode!=0)//不为空的话 { u=DeQueue(q); p=G->vertices[u].firstarc; for(;p!=NULL;p=p->nextarc) if(visited[p->adjvex]==0) { printf("%c",G->vertices[p->adjvex].data); visited[p->adjvex]=1; // printf("输出位置:%d\n",p->adjvex); EnQueue(q,p->adjvex); //Traverse(q); } } } } } int main() { //创建图,并将其保存到邻接表中 ALGraph *G; G=CreateALGraph(G); //测试一下是否有问题 Test(G); //广度优先遍历图 printf("深度优先遍历的结果如下:"); DFSTraverse(G); printf("\n"); printf("广度优先遍历的结果如下:"); BFSTraverse(G); system("pause"); }
开发环境:dev-c++,保存为:.c