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

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

①邻接矩阵: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;
}


  • 11
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值