保存图的两种方式

    1.邻接矩阵保存图
        保存图的结构体:

typedef struct
{
	//图的信息
	char Vertex[VERTEX_MAX];
	int Edges[VERTEX_MAX][VERTEX_MAX];
	int isTrav[VERTEX_MAX];
	int VertexNum;
	int EdgeNum;
	int Graphtype;
}MatrixGraph;
    结合下图来逐个理解结构体中的数据函数:      
 
    如上图:Vertex表示保存图中每个顶点的字符型值
    Edges数组,其中两个下标表示一条边两边两个顶点序号,而该数组值表示该边的权值!
    IsTrav数组表示顶点是否遍历,将在广度优先遍历与深度优先遍历中用到,这里不讨论
    接下来的VertexNum与EdgeNum表示图中的顶点数和边的数量!
    GraphType表示图的类型有有向图和无向图之分........

 用邻接矩形创建图:
   
//实现创建图函数
void CreateGraph(MatrixGraph *G)
{
	int i,j,k,weight;
	char start,end;

	printf("请输入图的顶点数,边数以及图的类型(0--无向图,1--有向图)\n");
	scanf("%d%d%d",&G->VertexNum,&G->EdgeNum,&G->Graphtype);

    for(i=0 ; i<G->VertexNum ; i++)
		for(j=0 ; j<G->VertexNum ; j++)
			G->Edges[i][j]=MAXVALUE;

	printf("请输入各顶点\n");
	for(i=0 ; i<G->VertexNum; i++)
	{
		getchar();
		printf("第 %d 个顶点:\n",i+1);
		scanf("%c",&( G->Vertex[i]) );
	}
    
	printf("确定各边是否相连,每次请输入起点和终点以及权值\n");
    for(k=0;k<G->EdgeNum;k++)
	{
		getchar();
		printf("第 %d 条边\n",k+1);
        scanf("%c,%c,%d",&start,&end,&weight);
		for(i=0 ; start!=G->Vertex[i] ; i++);
		for(j=0 ; end  !=G->Vertex[j] ; j++);
		G->Edges[i][j]=weight;
		if(G->Graphtype==0)
            G->Edges[j][i]=weight;
	}
}
    图创建过程中赋值MAXVALUE表示当前数组中下标的两个点不相连,规定该边权值为一个在当前数值类型下计算机能表示的最大值,图中每一个顶点都是单个字符所以只有在输入边的首尾start , end时再找到该顶点对应的下标值i和j,再赋予相应的权值,最后还要判断图的类型如果是无向图则边i,j和j,i都要赋予相同的权值.
      2邻接表保存图的结构体:
//图的结构体定义
typedef struct edgeNode
{
	int Vertex;
	int weight;
	struct edgeNode *next;
}EdgeNodes;

typedef struct
{
	EdgeNodes* AdjList[VERTEX_MAX];
	int VertexNum,EdgeNum;
	int Graphtype;
}ListGraph;
     其中EdgeNodes表示一个顶点的链表,在图的结构中将要用到。
     ListGraph表示图的结构,其中EdgeNodes数组指针表示图中每一个顶点的相连顶点都存放在指针数组中。
其中每个顶点链表存放相连顶点的顺序是任意的。
//创建图
void CreateGraph(ListGraph *G)
{
	int start,end;
	int i,weight;
	EdgeNodes* s;

	for(i=1 ; i<=G->VertexNum ; i++)
	    G->AdjList[i]=NULL;

	for(i=1 ; i<=G->EdgeNum ;  i++)
	{
		getchar();
		printf("第 %d 条边\n",i);
		scanf("%d,%d,%d",&start,&end,&weight);
		s=(EdgeNodes*)malloc(sizeof(EdgeNodes));
		
		s->next=G->AdjList[start];
		s->Vertex=end;
		s->weight=weight;
		G->AdjList[start]=s;
		if(G->Graphtype==0)
		{
            s=(EdgeNodes*)malloc(sizeof(EdgeNodes));
			s->next=G->AdjList[end];
		    s->Vertex=start;
	    	s->weight=weight;
	    	G->AdjList[end]=s;
		}
	}
}
     

 

 
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值