邻接表用来存储有向图十分方便,邻接表的本质是一种链表。
邻接表有四种操作:初始化、将数字插入到头结点、将数字插入到第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个数,因此你在进行相关操作的时候,必须减一
邻接表存储画图比较容易理解。