c - Flatten multi-level double linked list in C - 关于Append函数的疑惑

标签 c pointers linked-list

给定一个多层次的双向链表,如下所示:

enter image description here

我在一本书中阅读了一个解决方案,以便展平由以下代码组成的列表:

void FlattenList(node *head, node **tail)
{
    node *curNode = head;
    while (curNode) {
        if (curNode->child) {
           Append(cureNode->child, tail);
        }
    }
    curNode = curNode->next;
}

/* Apends child to the end of list and updates tail
void Append(node *child, node **tail)
{
   node *curNode;
   /* Append child child list to the end */
   (*tail)->next = child;
   child->prev = *tail;

   for(curNode = child; curNode->next; curNode = curNode->next) {
   }

   *tail = curNode;

}

typedef struct nodeT {
   struct nodeT *next;
   struct nodeT *prev;
   struct nodeT *child;
   int value;
} node;

我的问题是:为什么我们不在 APPend 函数中将 child 作为指针传递?我们在执行 child->prev = *tail; 时改变了它的值,我不明白如果我们在函数内部改变它的值,为什么我们不把一个点传递给 child。

最佳答案

child 没有被改变。其成员 prev 已更改。

child->prev = *tail;

将更改 childprev 并将影响原始对象,因为它具有指向原始对象(其地址)的指针。

这就是它起作用的原因。

关于c - Flatten multi-level double linked list in C - 关于Append函数的疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20344092/

相关文章:

c - 使用结构体对函数中的参数进行错误转换

c++ - 在许多不同的类中调用相同的函数

c - 对动态结构的动态数组进行 qsort

c - 泛型和按大小而不是按类型进行转换

c - memset(ary,0,length) 是一种在双数组中输入零的可移植方式

c - 汇编 - js 与 ja 指令

pointers - 获取没有指针的结构标签

c++ - 制作一个用指针排序的有效算法

c++ - 使用递归反转链表

c - 链表问题