邻接表存储

邻接表用来存储有向图十分方便,邻接表的本质是一种链表。

邻接表有四种操作:初始化、将数字插入到头结点、将数字插入到第k个输入的数字后面的结点、删除第k个输入的数字后面的结点。

例题:

#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>

using namespace std;

const int maxn=1e5+10; 

int idx,ne[maxn],e[maxn],head;//idx指针表示当前指向哪个点,ne数组存储下一个点的下标,e是第i个结点的值,head为头结点的值 

void init()//初始化 
{
	head=-1;
	idx=0;//头结点的值先置为-1,idx指向0 
}
//将a插入头结点
void add_to_head(int a)
{
	e[idx]=a;
	ne[idx]=head;//之前头结点的值要到当前点的next 
	head=idx;
	idx++;
} 
//在第k个点后面插入数字a
void add(int k,int a)
{
	e[idx]=a;
	ne[idx]=ne[k];
	ne[k]=idx;
	idx++;
}//因为维系链表的只是next数组,因此不用太在乎e数组的值
//将第k个结点后面的点删除 
void remove(int k)
{
	ne[k]=ne[ne[k]];	
 } 

int main()
{
	init();
	int n;
	cin>>n;
	while(n--)
	{
		char c;
		int k,x;
		getchar();
		scanf("%c",&c);
		if(c=='H')
		{
			cin>>x;
			add_to_head(x);
		}
		else if(c=='D')
		{
			cin>>k;
			if(!k) head=ne[head];//将头结点指向原先头结点的下一个结点,这样头结点自然就删除了 
			else remove(k-1);
		}
		else
		{
			cin>>k>>x;
			add(k-1,x);
		}
	}
	for(int i=head;i!=-1;i=ne[i]) printf("%d ",e[i]);
	
	return 0;
}

1、当你用scanf输入字符的时候千万记得%c是能把空格和回车符输入的,这样就会造成程序未知的错误。对于这道题来说,可以利用getchar函数吸收回车符。但是其他的题用起来也要慎重,因为getchar不能吸收空格,这道题因为%c输入之后是%d,才不会造成错误。

2、由于idx是从0开始的,第0个数其实存的是第1个数,因此你在进行相关操作的时候,必须减一

邻接表存储画图比较容易理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值