408计算机考研--数据结构--图的学习(C语言)

本文详细介绍了图的存储结构,包括邻接矩阵、邻接表、十字链表和邻接多重表,并提供了BFS和DFS算法的实现。针对无向图和有向图的特点,分析了各种存储方法的优缺点,以及在空间和时间复杂度上的考虑。通过实例代码展示了如何在C语言中实现这些数据结构和算法。

图的学习

一、图的存储及BFS、DFS算法

1.1、邻接矩阵法

特点:

  1. 无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。
  2. 对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是顶点i的度TD(vi)。
  3. 对于有向图,邻接矩阵的第i行非零元素(或非∞元素)的个数正好是顶点i的出度OD(vi);第i列非零元素(或非∞元素)正好是顶点i的入度ID(vi)。
  4. 用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。
  5. 稠密图适合使用邻接矩阵的存储表示
  6. 设图G的邻接矩阵为A,An的元素An[i][j]等于由顶点i到顶点j的长度为n的路径的数目。
  7. 邻接矩阵实现BFS和DFS算法的空间复杂度均为O(|V|),时间复杂度均为O(|V|2)
#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
#define MaxVertexNum 100 //顶点数目的最大值
#define Max 0x7FFFFFFF	//int最大数 




typedef char VertexType; //顶点的数据类型
typedef int EdgeType;    //带权图中边上权值的数据类型
typedef struct{
	VertexType Vex[MaxVertexNum]; //顶点表
	EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
	int vexnum,arcnum;//图的当前顶点数和弧数 
}MGragh; 
//链表 
typedef struct LinkNode{
	int val;//数据域
	struct LinkNode *next;//指针域 
}LinkNode,*LinkedList;
//链式存储队列 
typedef struct LinkedQueue{
	LinkedList front,rear;
}LinkedQueue;

//初始化队列 
void Init_LinkedQueue(LinkedQueue &q){
	q.front=q.rear=(LinkedList)malloc(sizeof(LinkNode));//建立队头和队尾
	q.front->next=NULL; 
}
//判队空
bool is_Empty(LinkedQueue &q){
	if(q.front==q.rear){
		return true; 
	} 
	return false;
} 
//入队
void EnQueue(LinkedQueue &q,int x){
	LinkedList newNode=(LinkedList)malloc(sizeof(LinkNode));//新结点
	newNode->val=x;
	newNode->next=NULL;
	//插入新结点 
	q.rear->next=newNode;
	q.rear=newNode;
	return;
} 
//出队
bool DeQueue(LinkedQueue &q,int &x){
	if(is_Empty(q)){
		return false;
	}
	//获取被删结点 
	LinkedList p=q.front->next;
	x=p->val;
	//删除结点 
	q.front->next=p->next;
	if(q.rear==p){
		q.rear=q.front; 
	}
	free(p);
	return true;
}

//找出图G的x顶点的第一个邻接点
//若有则返回顶点号。若没有返回-1 
int FirstNeighbor(MGragh G,int x){
	if(x<0||x>=G.vexnum){//判断图是否存在以及查找顶点是否在表其中,不在的话直接返回-1 
		return -1;
	}
	for(int i=0;i<G.vexnum;i++){
		if(G.Edge[x][i]==1){
			return i;//查找到第一个邻接点 
		}
	}
	return -1;
}
//找出图G的x顶点的y的下一个邻接点
//若有则返回顶点号。若没有返回-1 
int NextNeighbor(MGragh G,int x,int y){
	if(x<0||x>=G.vexnum||y<0||y>=G.vexnum){//判断图是否存在以及查找顶点是否在表其中,不在的话直接返回-1 
		return -1;
	}
	for(i
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值