梦熊2024-8-24

邻接表

        在一张拥有m条无向边的简单图中,将一共产生2m 对邻接点。若对于每个顶点可以直接遍历与它有关的邻接点,总的遍历时间复杂度将达到O(m)。一个简单完全无向图的边的数量为\frac{n(n - 1)}{2},所以最坏的情况下,时间复杂度也可以看成O(n^2)。也就是说,在简单图中 O(m)是比O(n^2)更加高效的存在。因此,我们希望使用的数据结构能够专注于保存每个顶点的邻接节点,而无需存储那些并无直接联系的顶点信息。数组还是可以满足我们的需求。对于顶点1,若有4个顶点与它相邻,可以创建一个大小为5的数组进行存储,将第工个相邻的顶点存入数组下为工的地方。对于顶点2,若有10个顶点与它相邻,可以创建一个大小为11的数组进行存储,以此类推。这样,我们可以构建一个二维数组 at[][]。其中,at[i][j]表示的是与顶点i邻接的顶点中的第j个顶点的编号。这样的qiqian存储方式,称之为邻接表。一个可能的存储程序如下:

int at[N][N],cnt[M];         //cnt数组用于记录每个顶点邻接点的个数int main(){
int m;
scanf("%d", &m) ;
for(int i - 1; i <= m; i++){ //一共有m条边
    int a,b;
    scanf("%d %d", &a ,&b);  //表示点a与点b之间有一条无向边at[a][++cnt[a]] = b;
    at[b][++cnt[b]] = a;
}
return 0;

前向星

        前向星兼顾了邻接矩阵存储图的直观和邻接表存储图的空间优势。它以存储边的方式来存储图,先将边读入并存储在连续的数组中(数组中需要记录边所有的信息,包括起点和终点),然后按照边的起点进行排序,这样数组中起点相等的边就能够在数组中进行连续访问,如图所示:

 指针

        指针是一个值为内存地址的变量。正如char类型的值是字符,int类型的值是整数。指针也是一个单独的类型。

        如何获取其他的内存地址?获取了内存地址的作用是什么?这是便是下面将要讨论的问题。

        &是取地址运算符,该运算符有一个操作数,位于符号后边,操作数必须是一个左值。使用方式:&

        操作数作用:该运算符输出值为该左值的地址。对于使用内存数超过一个字节的对象,取地址会返回该段内存的首地址(第一个字节)。

        仅仅获得变量的地址,往往不是很有用。对于一个地址来说,最有用的操作是获取它存放的值。

        解地址运算符(也叫间接访问运算符),其符号为*有一个操作数,位于符号右边,该操作数必须是一个地址使用方式:*操作数

        作用:运算符输出值是一个左值,代表该地址上的对象,也就是说它是可修改的。若作为右值来使用输出值是该地址存放的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值