ALGraph.h #pragma once #include "Queue.h" /************************************************************************/ /* 图的邻接表存储结构 */ /************************************************************************/ #define MaxVertexNum 100 #define QueueSize 30 bool visited[MaxVertexNum]; typedef char VertexType; typedef int EdgeType; typedef struct node //边表结点 { int adjvex; //邻接点域 struct node* next; //域链 //若是要表示边上的权,则应增加一个数据域 }EdgeNode; typedef struct vnode //顶点边结点 { VertexType vertex; //顶点域 EdgeNode* firstedge;//边表头指针 }VertexNode; typedef VertexNode AdjList[MaxVertexNum]; //AdjList是邻接表类型 typedef struct { AdjList adjlist; //邻接表 int n; //图中当前顶点数 int e; //图中当前边数 }ALGraph; //对于简单的应用,无须定义此类型,可直接使用AdjList类型 ALGraph* initALGraph(); bool DFS(ALGraph* a, int i); bool DFSTraverseM(ALGraph* a); bool BFSTraverseM(ALGraph* a); bool BFS(ALGraph* a, int i); ALGraph.c #include "ALGraph.h" #include <stdio.h> #include <stdlib.h> ALGraph* initALGraph() { ALGraph* a = NULL; EdgeNode* e = NULL; int i, j, k; char v1, v2; printf("请输入顶点数和边数(输入格式为:顶点数,边数): "); scanf("%d,%d", &i, &j); if(i<0 || j<0) return NULL; a = (ALGraph*)malloc(sizeof(ALGraph)); if(a == NULL) return NULL; a->n = i; a->e = j; for(i=0; i<a->n; i++) { printf("请输入顶点信息 每个顶点以回车作为结束: "); fflush(stdin); scanf("%c",&(a->adjlist[i].vertex)); // 读入顶点信息 a->adjlist[i].firstedge=NULL; // 点的边表头指针设为空 } for(k=0; k<a->e; k++) { printf("请输入边的信息(输入格式为:i,j): "); fflush(stdin); scanf("%c,%c", &v1, &v2); for(i=0; v1!=a->adjlist[i].vertex; i++); //找到顶点对应的存储序号 for(j=0; v2!=a->adjlist[j].vertex; j++);//找到顶点对应的存储序号 e = (EdgeNode*)malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = a->adjlist[j].firstedge; a->adjlist[j].firstedge = e; e = (EdgeNode*)malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = a->adjlist[i].firstedge; a->adjlist[i].firstedge = e; } return a; } /************************************************************************/ /* 深度优先遍历 */ /************************************************************************/ bool DFS(ALGraph* a, int i) { if(a == NULL) return FALSE; printf("DFS: node %c:/n", a->adjlist[i].vertex); visited[i] = TRUE; i = a->adjlist[i].firstedge->adjvex; if(!visited[i]) DFS(a, i); return TRUE; } bool DFSTraverseM(ALGraph* a) { int i; if(a == NULL) return FALSE; for(i=0; i<a->n; i++) visited[i] = FALSE; for(i=0; i<a->n; i++) if(!visited[i]) DFS(a, i); return TRUE; } /************************************************************************/ /* 广度优先遍历(递归实现) */ /************************************************************************/ bool BFS(ALGraph* a, int i) { int j, k; Queue *q = NULL; EdgeNode *e = NULL; if(a == NULL) return FALSE; q = initQueue(); if(!visited[i]) { printf("BFS: node %c/n", a->adjlist[i].vertex); visited[i] = TRUE; } j = a->adjlist[i].firstedge->adjvex; e = a->adjlist[i].firstedge->next; if(!visited[j]) { enQueue(q, j); while(e) { k = e->adjvex; if(!visited[k]) { enQueue(q, e->adjvex); printf("BFS: node %c/n", a->adjlist[k].vertex); visited[k] = TRUE; } e = e->next; } } while(q->size != 0) { j = deQueue(q); BFS(a, j); } } bool BFSTraverseM(ALGraph* a) { int i; if(a == NULL) return FALSE; for(i=0; i<a->n; i++) visited[i] = FALSE; for(i=0; i<a->n; i++) BFS(a, i); return TRUE; } Queue.h #pragma once typedef enum{FALSE, TRUE}bool; #define CAPACITY 10 typedef int ElemType; typedef struct { int front; int rear; int size; ElemType data[CAPACITY]; }Queue; Queue* initQueue(); ElemType deQueue(Queue* q); bool enQueue(Queue* q, ElemType data); Queue.c #include "Queue.h" #include <stdlib.h> #include <string.h> /************************************************************************/ /* 初始化队列 */ /************************************************************************/ Queue* initQueue() { Queue *q = NULL; q = (Queue*)malloc(sizeof(Queue)); if(q == NULL) return NULL; memset(q->data, 0, CAPACITY); q->front = q->rear = 0; q->size = 0; return q; } /************************************************************************/ /* 队尾入队 */ /************************************************************************/ bool enQueue(Queue* q, ElemType data) { if(q == NULL) return FALSE; if(q->size == CAPACITY) return FALSE; q->data[q->rear] = data; q->rear = (q->rear+1) % CAPACITY; q->size++; return TRUE; } /************************************************************************/ /* 队首出队 */ /************************************************************************/ ElemType deQueue(Queue* q) { ElemType res; if(q == NULL) exit(0); if(q->size == 0) return FALSE; res = q->data[q->front]; q->front = (q->front+1) % CAPACITY; q->size--; return res; } main.c #include "ALGraph.h" int main() { ALGraph* a = initALGraph(); BFSTraverseM(a); return 0; }