数据结构-邻接链表的建立和使用

来源:互联网 发布:四旋翼飞控编程 编辑:程序博客网 时间:2024/05/26 02:53

邻接链表其实和前向星基本一致。

邻接表的目的:通过一个点u,进而找出由他出发通向的其他的点v1,v2,v3......

邻接表的建立方法:对于一个点u,将他指向的所有点{Vi},按照插入的先后顺序,建立单链表,当有新的点进入是,采用头插法增加链表,不采用尾插法的原因是,每一次的插入都要遍历一遍{Vi}非常浪费时间,然后为了满足建立,{Vi}的顺序是不被要求的,故,在建成的图中会发现u点指向的点的遍历顺序是最后加入的最先遍历出来。

以上方法实现了对一个点的操作,那么对于一个图来说是有很多的点和边构成的,那么就可以通过一系列的{Ui}来完成对图的表示。

U1:v11->v12->v13->...(一条单链表)

U2:v21->v22->v23->...

......

Ui:vi1->vi2->vi3->... 

邻接表的遍历,对一个点遍历时,通过Ui就一直next,直到结束为NULL。

至于双边,正向反向都建一此边就好了。

#include<iostream>#include<stdlib.h>using namespace std;typedef struct EdgeNode{int adjvex;//u为起点的边指向的点v(一条边的端点)int weight;//边权(此代码没有用到)struct EdgeNode *next;//指向下一个u到达的点}EdgeNode;typedef struct VexteNode{EdgeNode *firstedge;//每一个单链表的起始点}VexteNode,AdjList[100];//AdjList[i]:点i出发指向的单链表的表头储存在VexteNode结构体中AdjList adjlist;void Init(int n)//初始化{for(int i=1;i<=n;i++){adjlist[i].firstedge=NULL;}}void add(int u,int v)//插入边U->V{EdgeNode *pe;pe=(EdgeNode*)malloc(sizeof(EdgeNode));pe->adjvex=v;pe->next=adjlist[u].firstedge;//头插adjlist[u].firstedge=pe;}int main(){int T;cin>>T;while(T--){int n,m;//点数,边数cin>>n>>m;Init(n);for(int i=0;i<m;i++){int u,v;cin>>u>>v;add(u,v);}for(int i=1;i<=n;i++)//遍历所有U->V{EdgeNode *p;p=adjlist[i].firstedge;while(p){cout<<p->adjvex<<" ";p=p->next;}cout<<endl;}}return 0;} /*565 51 23 43 21 31 5*/



原创粉丝点击