双链表指针混淆

时间:2013-12-20 18:17:49

标签: c pointers linked-list

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

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;
        }
    }
}

我在底层指针操作中变得有点困惑是新手。将**头传递给函数以对其进行修改。但是在位置&gt; 1的情况下,与位置== 1的情况相比,使用* head(temp)的副本来修改列表。谁能解释我为什么会这样呢?

由于

2 个答案:

答案 0 :(得分:1)

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

当position = 1时,您正在修改头节点,因此您不需要迭代。

答案 1 :(得分:1)

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

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

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

    temp = temp->next;

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