【数据结构】图的邻接表表示,DFS,BFS,关键路径和拓扑排序

这是我之前写的代码,参考书是《大话数据结构》,使用邻接表表示图,同时集成了深度优先搜索和广度优先搜索,关键路径和拓扑排序,代码有点长,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;//用于动态内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值