【问题标题】:Doubly Linked List Pointer Confusion双向链表指针混淆
【发布时间】:2013-12-20 18:17:49
【问题描述】:

下面是在双向链表中插入节点的代码。

struct dllist
{
    int data;
    struct dllist *prev, *next;
};


void DLLInsert(struct dllist **head, int position, int data)
{
    int k = 1;
    struct dllist *temp, *newNode;
    newNode = (struct dllist *)malloc(sizeof(struct dllist));
    if (!newNode)
    {
        printf("Memory Error\n");
    }
    newNode->data = data;
    if (position == 1)
    {
        newNode->next = *head;
        newNode->prev = NULL;
        *head = newNode;
        return;
    }
    else
    {
        temp = *head;
        while (temp->next != NULL && k < position - 1)
        {
            k++;
            temp = temp->next;
        }
        if (temp->next == NULL)
        {
            temp->next = newNode;
            newNode->prev = temp;
            newNode->next = NULL;
        }
        else
        {
            newNode->prev = temp;
            newNode->next = temp->next;
            temp->next = newNode;
            temp->next->prev = newNode;
        }
    }
}

作为新手,我对底层指针操作感到有些困惑。 **head 被传递给函数以对其进行修改。但是在 position>1 的情况下,与 position==1 的情况相比,使用 *head(temp) 的副本来修改列表。谁能解释一下为什么会这样?

谢谢

【问题讨论】:

  • 在一种情况下,您只需要修改*head 所指向的内容。另一方面,您需要修改指针本身。 (用方框和箭头在纸上画出这两个案例,你就会明白为什么了。)

标签: c pointers linked-list


【解决方案1】:

当 position > 1 时,temp 设置为*head,代码通过链表迭代temp 到索引position 处的节点。实际上,您正在修改索引 position 处的节点。

当position = 1时,你正在修改头节点,所以你不需要迭代。

【讨论】:

  • @irrelephant-感谢您的解释。所以实际上这意味着我可以通过将 *head 传递给函数来修改结构元素(即 data、next 和 prev),但是要修改 *head 本身,我需要传递 **head。我说的对吗?
  • 是的,但我不明白这与这个关于链表的问题有什么关系。要使用DLLInsert(),您始终将struct dlllist ** 作为head 传递。
【解决方案2】:

position==1 的情况下,您的新元素将成为新的头部。你已经知道它在哪里了。否则,你需要找到位置。

temp = *head;
        while (temp->next != NULL && k < position - 1)

这用于遍历列表,直到找到要插入的位置的元素。

    temp = temp->next;

您分配给temp 的第一个元素是head,但它在每次迭代中被替换为下一个元素。

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2016-06-27
    • 2013-07-07
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多