指针 & 链表 & 链式向前星
指针 & 链表 & 链式向前星
指针
用于存放地址,全称“地址变量”
指针的定义与取地址如下
int *p; //创建指针
int a; //定义整型变量
p = &a; //用p存放a的地址
*p =123 //更改a的值
优点: 可以很方便的更改数据或进行地址管理
缺点: 地址是随机生成的
链表
一般来说,链表包含两部分:数值和下一项的地址
优点: 很方便的插入和删除元素
插入元素
思路:新增元素,把前一项指针指向新插入的项,把新项的指针指向下一项
void insertNode(int i, Node *p)
{
Node *node = new Node;
node->value = i;
node->next = p->next;
p->next = node;
}
删除元素
思路:将要删除的元素前一项指针指向下下项
void deleteNode(Node *p)
{
p->value = p->next->value;
Node *t = p->next;
p->next = p->next->next;
delete t;
}
链式前向星
一种用来以\(O(n)\)的时间复杂度来存储图的方法(个人觉得很玄学)
// head[u] 和 cnt 的初始值都为 -1
void add(int u, int v)
{
nxt[++cnt] = head[u]; // 当前边的后继
head[u] = cnt; // 起点 u 的第一条边
to[cnt] = v; // 当前边的终点
}
// 遍历 u 的出边
for (int i = head[u]; i != -1; i = nxt[i])//i != -1也可写成i~
{
int v = to[i];
}