1

在学习链表编码时,我遇到了这两个东西,无法理解它们之间的区别,让我感到困惑。我一直在学习的这本书在我们在链表末尾添加一个新节点的部分解释了“temp=*q”。

因此,如果列表不为空,即条件if(*q==NULL)失败,则将执行下一部分。现在temp通过语句指向列表中的第一个节点

temp=*q;

现在使用temp我们已经使用 statememnts 遍历了整个链表:

while (temp->link!=NULL) temp=temp->link;

稍后在列表开头添加新节点的编码中,我看到:

现在我们需要使link节点的一部分指向现有的第一个节点。这是通过声明实现的

temp->link=*q;

现在的问题是我无法区分这两个代码。他们不是在这两种情况下都扮演着同样的角色吗?相关提一下,temp是用于列表上所有更新工作的临时节点,*q是起始节点。

4

2 回答 2

4

第一个例子

在你开始使用temp第一个例子中的遍历列表之前,你有一个这样的内存布局:

三节点列表

然后创建一个局部变量temp. 假设最初它是空指针:

temp 指向 NULL

然后你设置temp等于*q

temp=*q;

这使您的内存布局如下所示:

temp 指向第一个节点

然后你执行这个循环:

while (temp->link!=NULL) temp=temp->link;

temp将沿着列表的节点前进,直到它指向最后一个节点。所以在我的示例图中(有三个节点),temp将首先移动到列表中的第二个节点:

temp 指向第二个节点

然后它将移动到列表中的第三个节点:

temp 指向第三个节点

循环到此结束,因为 nowtemp->linkNULL.

应该清楚的是,第一个赋值(temp=*q)和循环中的赋值(temp=temp->link)都不会改变链表的结构。这些分配只是temp指向列表中的不同节点。

第二个例子

在您的第二个示例中,您将在列表的前面添加一个新节点。所以你设置temp指向一个新节点:

temp 指向新的未链接节点

然后你执行这条语句,你发现它令人困惑:

temp->link=*q;

这是执行该语句后的内存布局:

新节点指向之前的第一个节点

应该清楚,与第一个示例不同temp它在分配之后指向与分配之前相同的节点。

下一步(未在您的问题中显示)将*q使用以下语句更新以指向新节点:

*q = temp;

这会将内存布局更改为:

*q 指向新节点

现在你不再需要temp了。大概你会从有 的函数返回temp,它会消失,留下你的记忆是这样的:

最终的四节点列表

于 2013-09-10T19:19:03.173 回答
1

不,他们没有扮演同样的角色。

首先,您要在开头和结尾插入的函数都采用指向第一个节点的指针的指针,因此可以相应地更新表示链表的指针(您的头指针)。

在链表末尾插入时,首先temp = *qtemp指向链表中的第一个节点。这里没有设置链接,这只是一个普通的指针副本。然后,你遍历到最后,并在最后插入一个新节点。

在前面插入时,首先为一个新节点分配空间,maketemp指向它,并使temp的链接指向链表的头部。这是用temp->link = *q. 这里设置了一个链接。然后,头部本身发生了变化,所以*q = temp.

于 2013-09-10T17:17:23.280 回答