您的位置:首页 > 理论基础 > 数据结构算法

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

2015-06-06 11:35 323 查看
图的表示(建立)有两种方法:

①邻接矩阵: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 邻接表