邻接表(数组模拟/链式向前星)详解

不是特别难的一个内容,可视化之后应该好理解一点,个人感觉手搓没有链表版来的快,代码行数差不多,哪个顺手用哪个。

定义结构体和数组

struct{
	int u;//起点 
	int v;//终点
	int w;//权值 
	int prev;//前一条边的下标 
}edges[100];//存储所有边 
int head[50];//存储最后一条边的下标 如:head[1]存储节点1的最后一条边的下标 利用边的prev来遍历所有与1节点相连的边 
int idx=0;//计数器 

初始化head数组(很重要,不要忘)

memset(head,-1,sizeof(head));

建图

邻接表(数组模拟/链式向前星)详解_第1张图片

void add(int u,int v,int w){
	edges[idx].u=u;
	edges[idx].v=v;
	edges[idx].w=w;
	edges[idx].prev=head[u];//head存储的是最后一条边 因此加入的边的前一条永远是head数组
	head[u]=idx++;
    //如果要建立无向图 交换u,v再进行加边操作 即add(v,u,w)调用自己
}

 prev指向前一条边的下标,head数组存储是最后一条边的下标,所以prev指向head就行

prev算是核心地方,没有prev,edge数组就不会串在一起

遍历

for(int i=head[1];i!=-1;i=edges[i].prev){//遍历1节点的边 
	u=1;                                 //遍历其他节点 u=1的1用别的变量替换即可 上面的i=head[1]也是
    v=edges[i].v;
    w=edges[i].w; 
	cout<"<

整体结构

#include 
#include 
using namespace std;

struct{
	int u,v,w,prev;
}edges[100];
int head[50],idx=0;

void add(int u,int v,int w){
	edges[idx].u=u;edges[idx].v=v;edges[idx].w=w;
	edges[idx].prev=head[u];
	head[u]=idx++; 
}

int main(){
	memset(head,-1,sizeof(head));
	int u,v,w;
	while(cin>>u>>v>>w){
		if(u==0&&v==0&&w==0)break;
		add(u,v,w);
	}
	for(int i=head[1];i!=-1;i=edges[i].prev){// 
		u=1;v=edges[i].v;w=edges[i].w;
		cout<"<

看了几天之后终于理解了,记录一下

你可能感兴趣的:(数据结构)