c语言实现 ,数据结构----图的邻接表的基本操作(图的建立、初始化、遍历等)和图的邻接矩阵的建立

以邻接表的方式建立图

图的结构

#define MVNum 100
typedef struct ArcNode {
	int adjvex;
	struct ArcNode *nextarc;
}ArcNode;//GraphNode
typedef struct VNode {
	char data;//邻接表的数据域和指针域
	ArcNode *fistarc;
}VNode,AdjList[MVNum];//Gra
typedef struct {
	AdjList *vertices;//邻接表
	int vexnum, arcnum;//顶点数和边的个数
}ALGraph;//Graph

图的创建

void CreateUDG(ALGraph *G) {
	printf("请输入顶点数和边数:\n");
	scanf("%d %d", &G->vexnum, &G->arcnum);
	for (int i = 0; i < G->vexnum; ++i)
	{
		printf("请输入第%d个顶点:", (i + 1));
		scanf(" %c", &G->vertices[i]->data);//初始化顶点
	
		G->vertices[i]->fistarc = NULL;
	}
	for (int i = 0; i < G->arcnum; ++i)
	{
		char v1, v2;
		printf("输入第%d个边:", (i + 1));
		scanf(" %c%c", &v1, &v2);
		
		int m = LocateVex(G, v1);
		int n = LocateVex(G, v2);//分别找到边的两个顶点的下标
		ArcNode *p1 = (ArcNode*)malloc(sizeof(ArcNode));//然后用头插法进行连接,如果是有向图连接一次就行了
		p1->adjvex = n;
		p1->nextarc = G->vertices[m]->fistarc;
		G->vertices[m]->fistarc = p1;
		ArcNode *p2 = (ArcNode*)malloc(sizeof(ArcNode));
		p2->adjvex = m;
		p2->nextarc = G->vertices[n]->fistarc;
		G->vertices[n]->fistarc = p2;
	}
}



int LocateVex(ALGraph *G, char v) {
	for (int i = 0; i < G->vexnum; i++)
	{
		if (G->vertices[i]->data == v) {
			return i;
		}
		
	}
	return -1;
}

图的深度优先遍历

/**
深度优先遍历
*/
void DFS(ALGraph *G, int i, int *visited) {
	ArcNode *an;
	visited[i] = 1;//表名第i个顶点已经被访问过,并打印它的值
	printf("%c ", G->vertices[i]->data);
	an = G->vertices[i]->fistarc;//找到该顶点与之相连的下个顶点的位置
	//通过递归算法挨个遍历该顶点的邻接点
	while (an)
	{
		if (!visited[an->adjvex]) {
			DFS(G, an->adjvex, visited);
		}
		an = an->nextarc;

	}
}
void TraDFS(ALGraph *G) {

	int visited[MVNum];//初始化一个标记数组
	for (int i = 0; i < MVNum; i++)
	{
		visited[i] = 0;

	}
	for (int i = 0; i < G->vexnum; i++)
	{
		if (!visited[i]) {
			DFS(G, i, visited);//挨个遍历没有访问过的顶点
		}

	}
}

图的广度优先遍历


/**
	图的广度优先遍历需要用到队列的出队、入队
*/
void TraBFS(ALGraph *G) {
	LinkQueue *q = (LinkQueue *)malloc(sizeof(LinkQueue));
	int visited[MVNum];//创建标记数组并进行初始化
	for (int i = 0; i < MVNum; i++)
	{
		visited[i] = 0;
	}
	InitQueue(q);//初始化队列
	for (int i = 0; i < G->vexnum; i++)
	{
		if (!visited[i])
		{
			printf("%c ", G->vertices[i]->data);
			visited[i] = 1;
			EnQueue(q, i);//当前顶点入队
			while (!QueueEmpty(q))
			{
				PopQueue(q, &i);
				ArcNode *an = G->vertices[i]->fistarc;//找到当前顶点的临接点
				while (an)
				{
					//并依次遍历,直到为空
					if (!visited[an->adjvex])
					{
						printf("%c ", G->vertices[an->adjvex]->data);
						visited[an->adjvex] = 1;
						EnQueue(q, an->adjvex);
					}
					an = an->nextarc;
				}
			}
		}
	}
}

以邻接矩阵的方式建立图

结构

#define MAXVEX 20
typedef struct Graph {
	char vex[MAXVEX];//顶点信息
	int arc[MAXVEX][MAXVEX];//存储矩阵
	int numvex, numarc;//定义顶点数和边的个数
}MGraph;

创建

void createGraph(MGraph *g) {
	printf("输入顶点数和边数:\n");
	scanf("%d %d", &g->numvex, &g->numarc);
	printf("输入顶点信息:\n");
	for (int i = 0; i < g->numvex; i++)
	{
		getchar();
		scanf("%c", &g->vex[i]);
		//printf("%c", g->vex[i]);
	}
	printf("输入邻接矩阵:\n");
	for (int  i = 0; i < g->numvex; i++)
	{
		for (int j= 0; j < g->numvex; j++)
		{
			scanf("%d", &g->arc[i][j]);
			if (g->arc[i][j] == 0)
			{
				g->arc[i][j] = 0;//可以定义为无穷大
			}

		}
	}
	printf("输出邻接矩阵:\n");
	for (int i = 0; i < g->numvex; i++)
	{
		for (int j = 0; j < g->numvex; j++) {
			printf("%3d", g->arc[i][j]);

		}
		printf("\n");

	}
}
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何一平?

你的收获就是我学习的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值