IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构图的基本功 -> 正文阅读

[数据结构与算法]数据结构图的基本功

图的存储结构

邻接矩阵

存储结构

/*邻接矩阵的结构*/
typedef char VertexType;
typedef int EdgeType;
#define MAXSIZE 100
#define INFINTY 65535

typedef struct
{
	VertexType vexs[MAXSIZE]; //顶点
	EdgeType arc[MAXSIZE][MAXSIZE]; //边表
	int numVertexes;          //顶点数
	int numEdges;             //边数
}MGraph;

邻接矩阵的建立

/*建立无向图的邻接矩阵表示*/
void CreateMGraph(MGraph * G)
{
	printf("请输入顶点数和边数: \n");
	scanf("%d %d", &G->numVertexes, &G->numEdges);


	//边的初始化
	for (int i = 0; i < G->numVertexes; i++)
	{
		for (int j = 0; j < G->numVertexes; j++)
		{
			G->arc[i][j] = INFINTY;
		}
	}


	for (int k = 0; k < G->numEdges; k++)
	{
		int i = 0;
		int j = 0;
		int w = 0;
		printf("输入(vi,vj)边上的下标i,j,权值w: \n");
		scanf("%d %d %d", &i, &j, &w);
		G->arc[i][j] = w;
		G->arc[j][i] = G->arc[i][j];
	}


	printf("读入顶点信息: \n");
	for (int i = 0; i < G->numVertexes; i++)
	{
		scanf("%c", &G->vexs[i]);
	}

}

邻接表

存储结构

typedef char VertexType;
typedef int EdgeType;
#define MAXSIZE 100
#define INFINTY 65535

typedef struct EdgeNode   //边表结点
{
	int adj;         //邻接点域
	EdgeType weight; //权值
	struct EdgeNode * next;
}EdgeNode;

typedef struct VertexNode //顶点表结点  
{
	VertexType data;  
	EdgeNode * firstEdge; //指向第一条边
}VertexNode, AdjList[MAXSIZE];

typedef struct
{
	AdjList adjList;
	int numVertexes;     //顶点数
	int numEdges;        //边数
}GraphAdjList;

邻接表的建立

/*建立图的邻接表*/
void CreateALGraph(GraphAdjList * G)
{
	printf("请输入顶点数和边数: \n");
	scanf("%d %d", &G->numVertexes, &G->numEdges);

	printf("请输入顶点信息: \n");
	for (int i = 0; i < G->numVertexes; i++)
	{
		scanf("%c", &G->adjList[i].data);
		G->adjList[i].firstEdge = NULL;
	}

	int i = 0, j = 0, w = 0;
	for (int k = 0; k < G->numEdges; k++)
	{
		printf("请输入边(vi,vj)上的编号i,j,w\n");
		scanf("%d %d %d", &i, &j, &w);

		EdgeNode *e = (EdgeNode *)malloc(sizeof(EdgeNode));
		e->adj = j;
		e->weight = w;

		//头插法
		e->next = G->adjList[i].firstEdge;
		G->adjList[i].firstEdge = e;

		//无向图 双向的
		e = (EdgeNode *)malloc(sizeof(EdgeNode));
		e->adj = i;
		e->weight = w;

		//头插法
		e->next = G->adjList[j].firstEdge;
		G->adjList[j].firstEdge = e;

	}
}

十字链表

存储结构

/*十字链表结构*/
typedef struct OEdgeNode   //边表结点
{
	EdgeType tailVex;
	EdgeType headVex;
	int weight;               //加权值构成了网
	struct OEdgeNode * tailLink;
	struct OEdgeNode * headLink;
}OEdgeNode;

typedef struct OVertexNode //顶点表结点  
{
	VertexType data;
	OEdgeNode * firstIn;
	OEdgeNode * firstOut;
}OVertexNode, OAdjList[MAXSIZE];

typedef struct
{
	OAdjList adjList;
	int numVertexes;     //顶点数
	int numEdges;        //边数
}OGraphAdjList;

十字链表的建立

/*建立图的十字链表*/
void CreateOALGraph(OGraphAdjList * OG)
{
	printf("请输入顶点数和边数: \n");
	scanf("%d %d", &OG->numVertexes, &OG->numEdges);

	printf("请输入顶点信息: \n");
	for (int i = 0; i < OG->numVertexes; i++)
	{
		scanf("%c", &OG->adjList[i].data);
		OG->adjList[i].firstIn = NULL;
		OG->adjList[i].firstOut = NULL;
	}

	int i = 0, j = 0, w = 0;
	for (int k = 0; k < OG->numEdges; k++)
	{
		printf("请输入边(vi,vj)上的编号i,j,w\n");
		scanf("%d %d %d", &i, &j, &w);

		OEdgeNode *e = (OEdgeNode *)malloc(sizeof(OEdgeNode));
		e->tailVex = i;
		e->headVex = j;
		e->weight = w;

		//头插法
		e->tailLink = OG->adjList[i].firstOut;
		OG->adjList[i].firstOut = e;

		//有向图
		e->headLink = OG->adjList[j].firstIn;
		OG->adjList[j].firstIn = e;
	}
}

图的遍历

深度优先遍历

邻接矩阵

//邻接矩阵
bool visited[MAXSIZE];

void dfs(MGraph G, int i)
{
	visited[i] = true;
	printf("%c ", G.vexs[i]);

	for (int j = 0; j < G.numVertexes; j++)
	{
		if (G.arc[i][j] == 1 && !visited[j])
		{
			dfs(G, j);
		}
	}
}


void dfsTraverse(MGraph G)
{
	for (int i = 0; i < G.numVertexes; i++)
	{
		visited[i] = false;  //初始所有顶点状态为未访问
	}
	for (int i = 0; i < G.numVertexes; i++)
	{
		if (!visited[i])
		{
			dfs(G, i);
		}
	}
}

邻接表

/*邻接表的深度优先递归*/

void dfsList(GraphAdjList G, int i)
{
	visited[i] = true;

	printf("%c ", G.adjList[i].data);

	EdgeNode * p = G.adjList[i].firstEdge;
	while (p)
	{
		if (!visited[p->adj])
		{
			dfsList(G, p->adj);
		}
		p = p->next;
	}
}

void dfsTraverseList(GraphAdjList G)
{
	for (int i = 0; i < G.numVertexes; i++)
	{
		if (!visited[i])
		{
			dfsList(G, i);
		}
	}
}

广度优先遍历

邻接矩阵

//邻接矩阵
void BfsTraverse(MGraph G)
{

	int k = 0;
	for (int i = 0; i < G.numVertexes; i++)
		visited[i] = false;     //全部初始化为未访问

	SqQueue q;
	InitQueue(&q);   //初始化队列
	
	for (int i = 0; i < G.numVertexes; i++)//遍历每一个顶点
	{
		if (!visited[i])
		{
			visited[i] = true;
			printf("%c ", G.vexs[i]);
			EnQueue(&q, i);
			while (!QueueEmpty(q))
			{
				DeQueue(&q, &k);

				for (int j = 0; j < G.numVertexes; i++) //判断每一个邻接点
				{
					if (G.arc[k][j] == 1 && !visited[j])
					{
						visited[j] = true;
						printf("%c ", G.vexs[j]);

						EnQueue(&q, j);
					}
				}
			}
		}
	}

}

邻接表


```c

//邻接表
void BfsAdfTraverse(GraphAdjList G)
{
	int k = 0;
	EdgeNode * p;

	for (int i = 0; i < G.numVertexes; i++)
		visited[i] = false;  //初始化未未访问

	SqQueue q;
	InitQueue(&q);

	for (int i = 0; i < G.numVertexes; i++)//遍历每个顶点
	{
		if (!visited[i])
		{
			visited[i] = true;
			printf("%c ", G.adjList[i].data);
			EnQueue(&q, i);

			while (!QueueEmpty(q))
			{

				DeQueue(&q, &k);
				p = G.adjList[k].firstEdge;
				while (p)
				{
					if (!visited[p->adj])
					{
						visited[p->adj] = true;
						printf("%c ", G.adjList[p->adj].data);
						EnQueue(&q, p->adj);
					}
					p = p->next;
				}
			}
		}
	}
}

未完,待结 ~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:53:24  更:2021-08-12 16:58:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 1:34:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码