码迷,mamicode.com
首页 > 其他好文 > 详细

基于邻接表的图建立(有向图+无向图)

时间:2015-06-06 12:06:27      阅读:496      评论:0      收藏:0      [点我收藏+]

标签:   数据结构   邻接表   

图的表示(建立)有两种方法:

①邻接矩阵:A(i,j)=1表示i,j存在一条边,空间复杂度O(n^2),稠密图

②邻接表:只记录存在的边,Vector+List的数据结构,稀疏图


邻接矩阵的图建立这里不做赘述,接下来我们看一下邻接表的图建立:


<1>有向图

注意理解头插入节点的过程

int  n,m;//n表示城镇个数,m表示道路条数</span>


struct LinkNode//列表节点
{
	int vex; //邻接的结点在数组中的编号
	LinkNode* next;
};
struct Node//邻接表
{
	int data;
	LinkNode* head;//列表头节点
} Adj[maxn];

//生成无向图(邻接表实现)Vector+List
void createLink(){
  LinkNode *ptr1,*ptr2;//首先声明两个空节点
  for(int i=1;i<=n;i++) Adj[i].head=NULL;
  for(int i=1;i<=m;i++){
     ptr1=new LinkNode;
     scanf("%d",&ptr1->vex);
    //头插入建表,非常关键,注意理解head的位置
     ptr2=new LinkNode;
     scanf("%d",&ptr2->vex);
     //有向图头插入建立列表过程,只需一次
     ptr2->next=Adj[ptr1->vex].head;
     Adj[ptr1->vex].head=ptr2;
  }
}
int main()
{
	//freopen("input.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){  //基于邻接表,速度快
     createLink();
    }
	return 0;
}



<2>无向图

基于有向图,插入两次即可

int  n,m;//n表示城镇个数,m表示道路条数

struct LinkNode//列表节点
{
	int vex; //邻接的结点在数组中的编号
	LinkNode* next;
};
struct Node//邻接表
{
	int data;
	LinkNode* head;//列表头节点
} Adj[maxn];

//生成无向图(邻接表实现)Vector+List
void createLink(){
  LinkNode *ptr1,*ptr2;//首先声明两个空节点
  for(int i=1;i<=n;i++) Adj[i].head=NULL;
  for(int i=1;i<=m;i++){
     ptr1=new LinkNode;
     scanf("%d",&ptr1->vex);
    //头插入建表,非常关键,注意理解head的位置
     ptr2=new LinkNode;
     scanf("%d",&ptr2->vex);
     ptr2->next=Adj[ptr1->vex].head;
     Adj[ptr1->vex].head=ptr2;
     //无向图邻接表建立
     ptr1->next=Adj[ptr2->vex].head;
     Adj[ptr2->vex].head=ptr1;
  }
}
int main()
{
    //freopen("input.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){  //基于邻接表,速度快
     createLink();
    }
	return 0;
}


基于邻接表的图建立(有向图+无向图)

标签:   数据结构   邻接表   

原文地址:http://blog.csdn.net/u012717411/article/details/46386503

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!