Appearance
思路与分析
链表没法直接从下标返回存储数据,需要通过遍历的方式找到存储位置的数据。
如果要返回第 i 个位置的数据:
- 使用指针 p 指向第一个节点位置,通过计数器 j 来记录步数;
- 指针通过 p = p->next 向后移动,步数自增;
- 指针先空的话返回查找失败(如果头节点保存了长度,可以在遍历前检查)
- 步数达到目标位置读取当前节点数据
代码实现
c
int GetElement(linkedlist l, int i, datatype *e) {
if (l == NULL || l->len == 0 || i >= l->len || i < 0)
return -1;
linkedlist p = l->next;
for (int j = 0; j < i; j++)
{
p = p->next;
}
*e = p->data;
return 0;
}- 在代码最前面我们判断了链表是否空,下标是否越界,这样我们在后面不用担心遍历到的节点是否是空;
- 遍历的起点选在了第一个链表节点,而不是头节点,这和后面循环对应,你也可以设计 j <= i 让游标多走一步(如果对范围很困惑,不妨用 0 和 1 试着带入看看,如果合理,那么可推理后面也是合理的);
- 我们通过 datatype 的指针来读取数据,因为函数本身返回的是运行状态(0成功,-1失败),另一种方法是传入回调函数,直接通过回调处理数据