`
Touch_2011
  • 浏览: 290497 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

邻接矩阵存储的无向网的基本操作(C语言实现)

阅读更多
/*
 *无向网的基本操作(邻接矩阵存储)
 */
#include<stdio.h>
#define MAX_VERTEX_NUM 20

typedef char VertexType;
typedef struct 
{
	int vertexNum;//顶点个数
	VertexType vertex[MAX_VERTEX_NUM];//顶点信息
	int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 
}GraphMatrix,*PGraphMatrix;

//用数组vertex按序存放遍历的各个顶点,广度遍历时看成队列,深度遍历时看成栈
VertexType vertex[MAX_VERTEX_NUM];

//建立无向网
void createGraph(PGraphMatrix pGraph)
{
	int i,j,arcNum,from,to,weight;
	printf("please enter the numbers of vertex(顶点):\n");
	scanf("%d",&pGraph->vertexNum);
    for(i=0;i<pGraph->vertexNum;i++)
        pGraph->vertex[i]='a'+i;
	for(i=0;i<pGraph->vertexNum;i++)
		for(j=0;j<pGraph->vertexNum;j++)
            pGraph->arcs[i][j]=0;
	printf("please enter the numbers of arcs(弧):\n");
	scanf("%d",&arcNum);
	for(i=0;i<arcNum;i++){
    	printf("please enter the information of arcs(弧),(起始点  终点  权值):\n");
        scanf("%d%d%d",&from,&to,&weight);
		pGraph->arcs[from][to]=weight;
		pGraph->arcs[to][from]=weight;
	}
}
//求指定顶点
VertexType getVertexByIndex(PGraphMatrix pGraph,int index)
{
	return pGraph->vertexNum==0?'0':pGraph->vertex[index];
}

//求第一个顶点
VertexType getFirstVertex(PGraphMatrix pGraph)
{
	return pGraph->vertexNum==0?'0':pGraph->vertex[0];
}

//求图中顶点index的下一个顶点
VertexType getVertexAfterIndex(PGraphMatrix pGraph,int index)
{
    return (index>=0 && index+1 < pGraph->vertexNum) ? pGraph->vertex[index+1] : '0';
}

//求第一个与顶点index相邻的顶点
VertexType getVertexNextIndex(PGraphMatrix pGraph,int index)
{
	int j;
	if(index>=0&&index<pGraph->vertexNum){
        for(j=0;j<pGraph->vertexNum;j++)
            if(j!=index&&pGraph->arcs[index][j]!=0)
				return pGraph->vertex[j];
	}
	return '0';
}

//根据顶点信息寻返回顶点在图中的位置
int findVertex(PGraphMatrix pGraph,VertexType vertex)
{
	int i;
	for(i=0;i<pGraph->vertexNum;i++)
		if(pGraph->vertex[i]==vertex)
			return i;
	return -1;
}

//返回任一顶点的边的个数
int getArcsNum(PGraphMatrix pGraph,int index)
{
	int j,k=0;
	if(index>=0&&index<pGraph->vertexNum){
        for(j=0;j<pGraph->vertexNum;j++)
            if(pGraph->arcs[index][j]!=0)
				k++;
		return k;
	}
	return -1;
}

//广度优先遍历
void breadthTraverse(PGraphMatrix pGraph)
{
	int i,j,k;
	int flag[MAX_VERTEX_NUM];//记录顶点的下标
	int front,rear;
	front=rear=0;
	for(i=0;i<MAX_VERTEX_NUM;i++)
		flag[i]=-1;
	//从第一个顶点开始
	front=rear=0;
	vertex[rear++]=pGraph->vertex[0];
	flag[0]=0;

	while(front<rear){
		i=flag[front];
		for(j=0;j<pGraph->vertexNum;j++){//遍历i为下标的那一行
			for(k=0;k<rear;k++)//判断此顶点是否在队列中
				if(flag[k]==j)
					break;
            if(k==rear && i!=j && pGraph->arcs[i][j]!=0){
				vertex[rear]=pGraph->vertex[j];
				flag[rear++]=j;
			}
		} 
		front++;
	}
}

//深度优先遍历
void depthTraverse(PGraphMatrix pGraph)
{
	int i,j,top=0,k,m;
	int flag[MAX_VERTEX_NUM];//记录顶点的下标
	for(i=0;i<MAX_VERTEX_NUM;i++)
		flag[i]=-1;
	//从第一个顶点开始
	vertex[top++]=pGraph->vertex[0];
	flag[0]=0;

	while(top>0 && top<pGraph->vertexNum){
		if(j==pGraph->vertexNum)//退栈,从上一个顶点开始
			i=flag[--m];
		else
			m=i=flag[top-1];
		for(j=0;j<pGraph->vertexNum;j++){
			for(k=0;k<top;k++)
				if(flag[k]==j)
					break;
            if(k==top && i!=j && pGraph->arcs[i][j]!=0){
				vertex[top]=pGraph->vertex[j];
				flag[top++]=j;
				break;
			}
		} 
	}
}

//测试
void main()
{
	int i;
	GraphMatrix graph;
    createGraph(&graph);
	printf("指定顶点:%c\n",getVertexByIndex(&graph,1));
	printf("第一个顶点:%c\n",getFirstVertex(&graph));
	printf("index的下一个顶点:%c\n",getVertexAfterIndex(&graph,0));
	printf("第一个与顶点index相邻的顶点:%c\n",getVertexNextIndex(&graph,1));
	printf("根据顶点信息寻返回顶点在图中的位置:%d\n",findVertex(&graph,'b'));
	printf("返回任一顶点的边的个数:%d\n",getArcsNum(&graph,0));
    printf("-----------广度优先遍历-----------------\n\n");

	breadthTraverse(&graph);
	for(i=0;i<graph.vertexNum;i++)
    	printf("%-3c",vertex[i]);

    printf("\n\n-------深度优先遍历------------------\n\n");
	depthTraverse(&graph);
	for(i=0;i<graph.vertexNum;i++)
    	printf("%-3c",vertex[i]);
	printf("\n\n");
}

 

0
1
分享到:
评论

相关推荐

    无向网的邻接矩阵存储

    无向网的邻接矩阵存储 无向网的邻接矩阵存储是指使用邻接矩阵来存储无向网的结构信息。在计算机科学中,邻接矩阵是一种常用的...该程序的实现提供了一个基本的示例,展示了如何使用C语言来实现无向网的邻接矩阵存储。

    邻接矩阵的基本实现

    如果顶点i和j之间有边相连,那么在邻接矩阵中,位置[i][j](或[j][i],因为图可能是无向的)的值通常为1;若无边,则值为0。对于有向图,邻接矩阵通常是不对称的,而对于无向图,它是对称的。 1. **基本实现**: ...

    邻接矩阵法实现图C代码

    以上就是使用邻接矩阵法实现图的基本思路和操作。这种实现方式适合于处理稠密图,即节点间连接较多的情况。对于稀疏图(节点间连接少),更推荐使用邻接表法,因为邻接表可以节省大量的内存空间。在实际应用中,应...

    数据结构 用邻接矩阵表示图

    在本题中,我们需要通过邻接矩阵的方式实现对四种不同类型的图(无向图、有向图、无向网和有向网)的存储和操作。具体来说,任务包括以下几个方面: 1. **创建图**:根据用户输入的顶点数、边数以及每条边的具体...

    DFS_BFS.zip_邻接矩阵_邻接矩阵结构

    在提供的文件"DFS_BFS.c"中,我们可以预见到它包含了C语言实现的DFS和BFS算法,使用邻接矩阵作为图的表示。学习这个代码可以帮助我们更好地理解这两种搜索算法在实际编程中的应用,以及如何优化内存和时间效率。通过...

    Prim算法计算最小生成树(无向图&邻接矩阵)_算法_数据结构_

    在使用邻接矩阵表示图时,我们用一个二维数组来存储图中顶点之间的关系。数组的行和列对应图中的顶点,如果顶点i和j之间有一条边,那么矩阵中的元素`adj[i][j]`和`adj[j][i]`(对于无向图)存储这条边的权重。如果...

    C语言实现的最小生成树源代码

    在代码中,`prim`函数实现了这一过程,`adjg`函数用于构建无向图的邻接矩阵,而`prg`函数则用于输出邻接矩阵。 另一方面,克鲁斯卡尔算法则是另一种贪心策略,它按边的权重递增顺序选择边,但始终确保不形成环路。...

    C语言实现(第5部分)图算法(原书第3版).zip

    在C语言中实现图算法,首先要掌握基本的C编程语法,包括变量、函数、指针等概念。此外,由于C语言不支持内置的复杂数据结构,所以需要自定义数据结构来表示图,如邻接矩阵或邻接表。邻接矩阵是一个二维数组,其中的...

    图的存储.ppt(c语言描述)

    这个“图的存储.ppt”教程详细介绍了如何用C语言实现图的邻接矩阵存储。 首先,邻接矩阵是一个二维数组,用于表示图中每个顶点对之间是否存在边。数组的每个元素代表一个顶点对之间的关系。如果元素值为1或某个非零...

    数据结构四个实验(C语言一般实现,线性表的基本实现,树结构的基本实现,图结构的基本实现)

    在这里,你将学习如何用邻接矩阵或邻接表来表示图,以及如何实现这些算法。 通过这四个实验,你将对数据结构有深入的理解,并能够熟练地用C语言来实现它们。这不仅有助于提升你的编程技巧,还将为解决复杂问题打下...

    不相关随机无标度网络(UCM)的C语言实现

    1. **初始化**: 首先,你需要创建一个空的网络结构,如邻接矩阵或邻接表,来存储节点之间的连接。对于10000个节点的大规模网络,邻接表可能是更高效的选择,因为它节省空间且更适合处理稀疏网络。 2. **设定初始度...

    C语言实现数据结构(栈,双向链表,十字链表,平衡树,图,哈希表).zip

    常用的数据结构有邻接矩阵和邻接表,C语言中通常用数组或链表实现。图的常见算法有深度优先搜索(DFS)和广度优先搜索(BFS)。 6. **哈希表(Hash Table)**:通过哈希函数将键映射到数组的索引,实现快速查找、...

    图的基本遍历和一些代码.cpp

    ①输入无向图的顶点数、边数及各条边的顶点序号对和边上的权值,建立用邻接矩阵表示的无向网。 ②构造该无向网的最小生成树。 四、实验报告提交要求 将具体内容填写到实验报告模板中,实验报告模板附在后面,填写...

    实验六 图基本操作的编程实现

    6. **编程实现**:实验要求使用C语言,可以选择实现邻接矩阵或邻接表,以及DFS和BFS。实验代码中展示了邻接表的创建和遍历记录的实现,使用了动态内存分配创建新结点,并通过指针操作更新链表。 实验过程中,难点...

    最小生成树无向图程序(C语言)

    - **数据结构**:使用邻接矩阵或邻接表来存储图。邻接矩阵适用于稠密图,邻接表更适合稀疏图,因为它节省空间。 - **优先队列**:Prim算法需要一个优先队列来快速找到最小边。C语言标准库没有内置优先队列,可以使用...

    C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列

    ### C语言实现无向图的深度优先遍历 #### 一、无向图与深度优先遍历概述 在计算机科学中,无向图是一种数据结构,由一系列节点(顶点)以及连接这些节点的边组成。如果边没有方向性,则称这样的图为无向图。在图论...

    数据结构:C语言版

    2. 图的遍历:深度优先搜索(DFS)和广度优先搜索(BFS)是图的基本操作,C语言中通过栈或队列实现这些遍历算法。 四、查找与排序 1. 查找:顺序查找、二分查找和哈希查找是常见查找算法。C语言中,二分查找通常...

    数据结构实验报告。doc

    1. 图的存储结构:邻接矩阵和邻接表是常见的图的存储方式。邻接矩阵用二维数组表示图,其中元素表示顶点之间的连接关系;邻接表则用链表表示每个顶点的邻接节点,节省空间。 2. 深度优先搜索:DFS是一种递归的搜索...

Global site tag (gtag.js) - Google Analytics