首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"temp=*q“和"temp->link=*q”的区别

"temp=*q“和"temp->link=*q”的区别
EN

Stack Overflow用户
提问于 2013-09-10 16:34:17
回答 2查看 893关注 0票数 1

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

因此,如果列表不是空的,i.e.the条件if(*q==NULL)将失败,那么下一部分将执行。现在,temp通过语句指向列表中的第一个节点。 temp=*q; 现在,使用temp,我们使用statememnts遍历了整个链接列表: while (temp->link!=NULL) temp=temp->link;

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

现在,我们需要使节点的link部分指向现有的第一个节点。这是通过声明实现的。 temp->link=*q;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-10 19:19:03

第一个例子

在开始使用temp遍历第一个示例中的列表之前,您有如下所示的内存布局:

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

然后将temp设置为*q

代码语言:javascript
复制
temp=*q;

这使您的内存布局看起来如下:

然后执行这个循环:

代码语言:javascript
复制
while (temp->link!=NULL) temp=temp->link;

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

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

循环在这里结束,因为现在temp->linkNULL

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

第二个例子

在第二个例子中,您要在列表前面添加一个新节点。因此,您将temp设置为指向一个新节点:

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

代码语言:javascript
复制
temp->link=*q;

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

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

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

代码语言:javascript
复制
*q = temp;

这将将内存布局更改为:

现在您不再需要temp了。您可能会从具有temp的函数返回,它将消失,您的内存如下所示:

票数 4
EN

Stack Overflow用户

发布于 2013-09-10 17:17:23

不,他们扮演的角色不一样。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18724392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档