数据结构与算法系列-图

转载自:http://blog.csdn.net/akof1314/article/details/4387701

@akof1314


图G由两个集合V和E组成,记为:
        G=(V,E)
  其中:
  V是顶点的有穷非空集合,
  E是V中顶点偶对(称为边)的有穷集。
     通常,也将图G的顶点集和边集分别记为V(G)和E(G)。E(G)可以是空集。若E(G)为空,则图G只有顶点而没有边。

图有两种存储结构:邻接矩阵和邻接表

 

邻接矩阵:   ① 用邻接矩阵表示顶点间的相邻关系
                ② 用一个顺序表来存储顶点信息
存储结构形式如下

#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct  
{
	VertexType vexs[MaxVertexNum];	//顶点表
	EdgeType edges[MaxVertexNum][MaxVertexNum];		//邻接矩阵,可看做边表
	int n,e;	//图中当前的顶点数和边数
}MGragh;

建立邻接矩阵及相关例子如下:
#define MAXLEN 10
typedef struct
{
 char vexs[MAXLEN];
 int edges[MAXLEN][MAXLEN];
 int n,e;
}MGraph;
//建立一个图的邻接矩阵存储的算法如下:
void CreateMGraph(MGraph *G)
{ 
 int i,j,k;
 char ch1,ch2;
 printf("请输入顶点数和边数(输入格式为:顶点数,边数):/n");
 scanf("%d,%d",&(G->n),&(G->e));
 printf("请输入顶点信息(顶点号<CR>)每个顶点以回车作为结束:/n");
 for(i=0;i<G->n;i++)
 {
  getchar();scanf("%c",&(G->vexs[i]));
 }
 for(i=0;i<G->n;i++)
 for(j=0;j<G->n;j++)
 G->edges[i][j]=0;
 printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):/n");
 for(k=0;k<G->e;k++)
 {
 getchar();
 printf("请输入第%d条边的顶点序号:",k+1);
 scanf("%c,%c",&ch1,&ch2);
 for(i=0;ch1!=G->vexs[i];i++);
 for(j=0;ch2!=G->vexs[j];j++);
 G->edges[i][j]=1;
 }
}

邻接表:类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。

结点结构包括:顶点表结点和边表结点

存储形式如下:


#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;

typedef struct node		//边表结点
{
	int adjvex;			//邻接点域
	struct node *next;	//域链
	//若是要表示边上的权,则应增加一个数据域
}EdgeNode;

typedef struct vnode	//顶点边结点
{
	VertexType vertex;	//顶点域
	EdgeNode *firstedge;//边表头指针
}VertexNode;

typedef VertexNode AdjList[MaxVertexNum];	//AdjList是邻接表类型

typedef struct 
{
	AdjList adjlist;	//邻接表
	int n,e;			//图中当前顶点数和边数
}ALGraph;				//对于简单的应用,无须定义此类型,可直接使用AdjList类型

建立邻接表及相关例子:

#define MAXLEN 10          // 最大顶点数为10
typedef struct node{                // 边表结点
	int adjvex;                    // 邻接点域
	struct node  * next;          // 指向下一个邻接点的指针域
	//若要表示边上信息,则应增加一个数据域info
}EdgeNode;        
typedef struct vnode{			   // 顶点表结点
	VertexType vertex;			   // 顶点域
	EdgeNode  * firstedge;	       // 边表头指针
}VertexNode;		
typedef VertexNode AdjList[MAXLEN]; // AdjList是邻接表类型
typedef struct{  
	AdjList adjlist;              // 接表
	int n,e;                      // 顶点数和边数
}ALGraph;					      // ALGraph是以邻接表方式存储的图类型
//建立一个有向图的邻接表存储的算法如下:
void CreateGraphAL (ALGraph *G)
{
	int i,j,k;
	EdgeNode * s;
	printf("请输入顶点数和边数(输入格式为:顶点数,边数):/n");
	scanf("%d,%d",&(G->n),&(G->e));		// 读入顶点数和边数
	printf("请输入顶点信息(输入格式为:顶点号<CR>)每个顶点以回车作为结束:/n");
	for (i=0;i<G->n;i++)				// 立有n个顶点的顶点表
	{ 
		scanf("/n%c",&(G->adjlist[i].vertex)); // 读入顶点信息
		G->adjlist[i].firstedge=NULL;			// 点的边表头指针设为空
	}
	printf("请输入边的信息(输入格式为:i,j):/n");
	for (k=0;k<G->e;k++)		// 建立边表
	{ 
		scanf("/n%d,%d",&i,&j); // 读入边<Vi,Vj>的顶点对应序号
		s=new EdgeNode;			// 生成新边表结点s
		s->adjvex=j;			// 邻接点序号为j
		s->next=G->adjlist[i].firstedge; // 将新边表结点s插入到顶点Vi的边表头部
		G->adjlist[i].firstedge=s;
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值