一步一步复习数据结构和算法基础-图的创建和基本操作(邻接矩阵)

原创 2012年07月21日 19:41:41

邻接矩阵写起来还是比较简单的。。。。。。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define number 20
typedef struct node
{
	int info;		//图的节点存放的信息,可随时变动
}GraphNode;
typedef struct
{
	GraphNode matrix[number+1][number+1];		//构造邻接矩阵
	int vexs[number+1];							//顶点向量
	int vertex,edge;							//顶点个数、弧个数
}Graph;

//创建图
void CreatGraph(Graph *G)
{
	int i,k;
	int x,y,data;
	int vertex,edge;
	printf("输入图的顶点个数和边的个数.\n");
	scanf("%d%d",&vertex,&edge);
	G->vertex = vertex;G->edge = edge;
	printf("输入图的每个顶点.\n");
	for(i=1;i<=vertex;i++)
		scanf("%d",&G->vexs[i]);
	for(i=1;i<=vertex;i++)
		for(k=1;k<=vertex;k++)
			G->matrix[i][k].info = 0;

	printf("请输入 %d 条边的横坐标、纵坐标、数值.\n",edge);
	for(i=1;i<=edge;i++)
	{
		scanf("%d%d%d",&x,&y,&data);
		G->matrix[x][y].info=data;
	}
}

//找出给定顶点的位置
int LocateVex(Graph *G,int V)
{
	int i;
	for(i=1;i<=G->vertex;i++)
		if(G->vexs[i] == V)
			return i;
	return -1;						//失败返回-1
}

//将指定顶点的数值改变
void PutVex(Graph *G,int V,int value)
{
	int temp;
	if((temp =LocateVex(G,V)) == -1)return;
	else G->vexs[temp] = value;
}

//找出指定顶点在图中的第一个邻接点
int FirstAdjVex(Graph *G,int V)
{
	int temp,i;
	if((temp = LocateVex(G,V))==-1) return -1;	//失败返回-1
	else
	{
		for(i=1;i<=G->vertex;i++)
			if(G->matrix[temp][i].info != 0)
				return G->matrix[temp][i].info;
	}
	return -1;
}

//向图中插入一个顶点
int InsertVex(Graph *G,int V)
{
	int i;
	G->vertex++;
	if(G->vertex > number)return 0;
	G->vexs[G->vertex] = V;
	for(i=1;i<=G->vertex;i++)
		G->matrix[G->vertex][i].info = 0;
	for(i=1;i<G->vertex;i++)
		G->matrix[i][G->vertex].info = 0;
	return 1;
}

//在图中删除一个顶点
int DeleteVex(Graph *G,int V)
{
	int i,temp,k;
	int count=0;
	if((temp=LocateVex(G,V)) == -1)return -1;

	//顶点数组变化
	for(i=temp;i<G->vertex;i++)
		G->vexs[i] = G->vexs[i+1];
	//顶点入度变化
	for(i=1;i<=G->vertex;i++)
	{
		if(G->matrix[i][temp].info)count++;
		for(k=temp;k<G->vertex;k++)
		{
			G->matrix[i][k].info=G->matrix[i][k+1].info;
		}
	}
	//顶点出度变化
	for(i=1;i<G->vertex;i++)
	{
		for(k=temp;k<G->vertex;k++)
			G->matrix[k][i].info = G->matrix[k+1][i].info;
	}
	G->vertex--;		//顶点减一
	G->edge -= count;	//弧减去对应的个数
	return 1;
}

//在图中插入一条弧
int InsertArc(Graph *G,int v,int w)
{
	int digit;
	if(v<0||v> G->vertex||w<0||w>G->vertex)return -1;
	printf("输入弧的权值.\n");
	scanf("%d",&digit);
	G->matrix[v][w].info = G->matrix[w][v].info  = digit;
	return 1;
}

//在图中删除一条弧
int DeleteArc(Graph *G,int v,int w)
{
	if(v<0||v> G->vertex||w<0||w>G->vertex)return -1;
	G->matrix[v][w].info = G->matrix[w][v].info  = 0;
	return 1;
}

//打印图
void DisplayGraph(Graph *G)
{
	int i,k;
	for(i=1;i<=G->vertex;i++)
	{
		for(k=1;k<=G->vertex;k++)
			printf("%-4d ",G->matrix[i][k].info);
		printf("\n");
	}
	printf("\n");
}


void RecoverGraph(Graph *G)
{
	int i,k;
	for(i=1;i<=G->vertex;i++)
		for(k=1;k<=G->vertex;k++)
			G->matrix[i][k].info=0;
	memset(G->vexs,0,sizeof(G->vexs));
	G->vertex = G->edge = 0;
	
}
int main()
{
	Graph G;
	CreatGraph(&G);
	DisplayGraph(&G);
	printf("%d\n",LocateVex(&G,4));
	printf("%d\n",FirstAdjVex(&G,4));
	InsertVex(&G,34);
	DeleteVex(&G,4);
	DisplayGraph(&G);
	return 0;
}


一步一步复习数据结构和算法基础-二叉树基本操作

思考了一下午啊,看来自己太水了。 #include #include typedef int elemtype; //整形为树的数据类型 typedef struct node { ele...
  • love_clanguage
  • love_clanguage
  • 2012年07月16日 20:12
  • 366

一步一步复习数据结构和算法基础-稀疏矩阵基本操作

#include #include #include #define MAXSIZE 1024 typedef struct { int i,j; int e; }Triple; typed...
  • love_clanguage
  • love_clanguage
  • 2012年07月15日 22:10
  • 472

算法与数据结构基础9:C++实现有向图——邻接矩阵存储

邻接矩阵的存储比邻接表实现起来更加方便,也更加容易理解。 邻接矩阵就是用一个二维数组matrix来存储每两个点的关系。如果两个点m,n之间有边,将数组matrix[]m[m]设为1,否则设为0。 如果...
  • xufeng0991
  • xufeng0991
  • 2014年12月06日 14:58
  • 2064

无向图的邻接矩阵基本操作

无向图的邻接矩阵基本操作
  • phiall
  • phiall
  • 2016年07月20日 21:21
  • 1592

数据结构(C++)—— 图(邻接矩阵)

一、重要概念理解: 完全图(Complate  graph) 在由n个顶点组成的无向图中,若有n*(n-1) / 2条边,则称之为无向完全图。在由n个顶点组成的有向图中,若有n*(n-1) 条边,则...
  • weixin_35909255
  • weixin_35909255
  • 2017年02月19日 12:15
  • 619

一步一步复习数据结构和算法基础-dijkstra算法

#include #include #include #define number 20 #define MAX 999999 int d[number]; typedef struct node {...
  • love_clanguage
  • love_clanguage
  • 2012年07月25日 10:50
  • 661

一步一步复习数据结构和算法基础-Floyd算法

在基于邻接矩阵的图利用floyd算法可以求出每一个定点对之间的最短距离。 #include #include #include #define number 10 #define MAX 99999...
  • love_clanguage
  • love_clanguage
  • 2012年07月25日 09:31
  • 389

一步一步复习数据结构和算法基础--kruskal算法

MST--krukal  kruakal算法和prim算法相比理解起来比较容易,而且也容易编程实现。 kruskal算法的是选择最小权值的边来构造最小生成树,当然要防止在构造最小生成树的时候...
  • love_clanguage
  • love_clanguage
  • 2012年07月22日 21:42
  • 332

一步一步复习数据结构和算法基础-广度优先搜索

和深搜不同,广搜在访问一个节点之后会访问这个节点周围的所有节点 然后扩散出去: 这里要用到队列,所以把先前的队列代码直接拿来就用。。。 #include #include #include #d...
  • love_clanguage
  • love_clanguage
  • 2012年07月21日 21:54
  • 382

一步一步复习数据结构和算法基础-插入排序(2)

希尔排序: 将整个待排记录分割为若干子序列,最后用直接插入排序。 这样可以使关键字比较小的记录跳跃式向前移动。最后直接插入排序的时候数组以基本有序。 #include #include in...
  • love_clanguage
  • love_clanguage
  • 2012年07月24日 10:43
  • 306
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一步一步复习数据结构和算法基础-图的创建和基本操作(邻接矩阵)
举报原因:
原因补充:

(最多只允许输入30个字)