13 计专

逆邻接链表生成算法

1、已知图的领结链表,设计算法生成相应的逆领接链表,时间复杂度为O(N+E)

思路:

  • 遍历所有顶点的边,一边遍历,一边创建逆领接表,指向与顶点互换
  • 知识点补充
  • 邻接表:反映的是顶点出度的情况。
  • 逆邻接表:反映的是顶点的入度情况。

代码:

typedef struct ArcNode{		//领接边 
	int adjvex;
	struct ArcNode *next;
}ArcNode;

typedef struct VNode{		//领接顶点 
	int data;
	struct ArcNode *firstarc; 
}VNode;

typedef struct AGraph{		//领接表 
	VNode adjlist[maxsize];
	int vexnum, edgenum;
}AGraph; 

//思路:层次遍历每一条边,然后把每条边的指向的节点改为顶点节点,其起始节点为其指向节点 
void GetReserseAdjlist(AGraph *G, AGraph *R){		//G为领接链表,R为逆领接链表 

	R->edgenum = G->edgenum;						//初始化逆领接链表 
	R->vexnum = G->vexnum;
	for(int i = 0; i < G->vexnum; i++){
		R->adjlist[i].data  = G->adjlist[i].data;
		R->adjlist[i].firstarc = NULL;
	} 
	
	for(int i =0; i < G->vexnum; i++){			//遍历领接表 
		ArcNode *p = G->adjlist[i].firstarc;
		while(p!=NULL){
			struct ArcNode *temp = (struct ArcNode *)malloc(sizeof(struct ArcNode));
			temp->adjvex = i;									//指向换一下 
			temp->next = R->adjlist[p->adjvex].firstarc;		//不带头结点的头插法 
			R->adjlist[p->adjvex].firstarc = temp;
			p =  p->next;										//继续往下找 
		}
	} 
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值