这是我之前写的代码,参考书是《大话数据结构》,使用邻接表表示图,同时集成了深度优先搜索和广度优先搜索,关键路径和拓扑排序,代码有点长,windows头文件貌似只是用来暂停的。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MAXVEX 100
#define ERROR 0
#define OK 1
//队列的DAT//
typedef int Elemtype; //BFS中队列存放的是图元素下标
typedef int Status;
typedef struct QNode {
Elemtype data;
struct QNode *next;
}*QuenePrt;
typedef struct {
QuenePrt front, rear; //指针形式的对头和队尾指针
}*LinkQuene;
//构建一个队列//
Status InitQuene(LinkQuene q) {
q->front = q->rear = (QNode *)malloc(sizeof(QNode)); //这个是头结点
if (!q->front) {
exit(ERROR);
}
q->front->next = NULL;
return OK;
}
//插入队列操作//
Status InsertQuene(LinkQuene q, Elemtype e) {
//将e插入到队列的队尾中
//首先定义一个队列结点
//然后将e复制给结点的数据域
//然后队尾next指向该结点
//最后队尾指针等于该节点
QuenePrt p;
p = (QNode *)malloc(sizeof(QNode));//申请链表的一个结点空间
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
return OK;
}
//出队操作//
Status DeleteQuene(LinkQuene q, Elemtype *e) {
//有三种情况
//第一种,有很多元素,直接删除
//第二种,只有一个元素,删除后front等于rear
//第三种,没有元素,返回ERROE
QuenePrt p;
if (q->front == q->rear)
return ERROR;
p = q->front->next;
*e = p->data;
q->front->next = p->next;
if (q->rear == p)
q->rear = q->front;//如果只有一个结点那么尾结点指回头结点
free(p);
return OK;
}
//探空操作//
Status QueneEmpty(LinkQuene Q) {
//如果是空队列返回1,否则返回0
if (Q->front == Q->rear)
return true;
else
return false;
}
typedef int Vertextype;
typedef int Edgetype;
//边表结构//
typedef struct EdgeNode {
int adjvex; //存储该结点对应下标
Edgetype weight; //存储权重值
struct EdgeNode *next;
}EdgeNode;
//顶点表结构//
typedef struct VertexNode {
int in;
Vertextype data; //存储顶点信息
EdgeNode *firstedge; //头指针
}VertexNode,AdjList[MAXVEX];
//邻接表结构//
typedef struct {
AdjList adjlist; //顶点表数组
int Vex_num, Edge_num;//顶点数和边数
}AdjGraph;
//构造顶点表,无向图//
void CreateGraph(AdjGraph *G) {
int i, j, k, weight,none;//none用来判断是否是有向图
EdgeNode *e;//用于动态内