以下是在双向链表中插入节点的代码。
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)的副本来修改列表。谁能解释我为什么会这样呢?
由于
答案 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
,但它会被每次迭代中的下一个元素替换。