插入链表 -

时间:2015-06-10 19:38:40

标签: c pointers linked-list

我在读Skeina的书。我无法理解这段代码。基本上双指针的用途是什么。 *l = p有什么用?任何人都可以通过图解释。

void insert_list(list **l, item_type x) {
    list *p; /* temporary pointer */
    p = malloc(sizeof(list));
    p->item = x;
    p->next = *l;
    *l = p;
}

2 个答案:

答案 0 :(得分:0)

你不应该把它称为"双指针"因为那是指向Trip ('A', 'B', 1.0, 2.0) used: 1.0 Trip ('B', 'C', 2.0, 3.0) used: 1.0 Trip ('C', 'B', 3.5, 4.5) used: 1.0 Trip ('B', 'A', 4.5, 5.5) used: 0.0 Trip ('D', 'E', 1.0, 5.5) used: 0.0 的指针。它是指向指针的指针,它用于允许函数改变恰好是指针的参数的值。如果您熟悉C#,它就像/个参数。在这种情况下,Options -MultiViews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^categories/([0-9]+)/?$ /categories.php?id=$1 [L,NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.php [L,NC] 参数用于获取IN和OUT行为,但您可能经常看到这仅用于输出。

由于此函数返回类型double,因此可以在不使用指向这样的指针的情况下编写它:

out

此更改需要调用该函数的代码更新它自己的列表句柄,因为列表的头部正在被更改。

答案 1 :(得分:0)

此函数执行一项非常简单的任务:它在{@ 1}}处插入一个节点 它接收指针的位置。空无一物 特别关于双指针,它们只是指针的指针。它们保存指针的地址,该指针包含对象的地址。 list包含void **l指针的地址。 list *检索 这个地址和*l存储它。

*l = p用于分配a malloc结构,list接收已分配结构的地址。 代码有些草率,因为p之前未检查过p 解除引用它。如果NULL由于缺乏记忆而失败,那么 程序将调用未定义的行为,希望停止使用 分段错误或可能更糟糕的事情。

节点已初始化,其malloc指针设置为指向的节点 通过next参数,最后存储新节点的地址 在作为l参数传递的地址处。效果很简单:节点插入l

这种方法很聪明,它允许相同的功能在列表中的任何地方插入新节点。例如:

*l

上面唯一棘手的问题是指针本身的概念,这里有一个简单的概述:

  • 内存可以概念化为(大)字节数组,地址是此数组中的偏移量。
  • 根据定义,
  • list *head = NULL; ... /* Insert a LIST_A node at the beginning of the list */ insert_list(&head, LIST_A); ... /* insert a LIST_B element as the second node in the list */ insert_list(&head->next, LIST_B); ... /* find the end of the list */ list *node; for (node = head; node->next; node = node->next) continue; /* insert a LIST_Z node at the end of the list */ insert_list(&node->next, LIST_Z); 变量是单个字节,
  • char变量占用系统体系结构特定的字节数,通常为当前硬件中的4或8个字节。
  • 将指针视为将地址保存在另一个变量的内存中的变量。它们需要足够大以容纳系统中的任何有效地址,在具有超过4 GB物理和可寻址内存的当前系统中,它们是64位长并占用8个字节。
  • 有一个特殊的地址值int,它不代表任何对象,用于指定给定指针不指向任何真实对象。地址NULL用于此目的。 0将返回malloc如果无法分配请求的内存,则应测试返回值,因为在此地址存储值是被禁止的,并且通常被捕获为无效访问(分段错误)。

这个摘要是故意简化的。我使用术语变量而不是 object 来避免与OOP概念混淆。