这是一段试图建立链表的代码。
struct node {
char name[20];
int age;
int height;
node* next; // Pointer to the next node
};
node* startPTR = NULL;
void addNode_AT_END() {
node *temp1;
node *temp2;
temp1 = new node;
cout << "Enter the name : ";
cin >> temp1->name;
cout << endl << "Enter the age : ";
cin >> temp1->age;
cout << endl << "Enter height : ";
cin >> temp1->height;
temp1->next = NULL;
if( startPTR == NULL) {
startPTR = temp1;
} else {
temp2 = startPTR;
while( temp2->next != NULL )
temp2 = temp2->next;
temp2->next = temp1;
}
}
以下是对上述功能进行2次背靠背调用后的图表。
start = addr1;
|
V
(addr1) ----> (addr2) ----> (NULL) at end
^
|
temp2
其中addr1和addr2分别是第一个和第二个节点的地址。
第三次通话后会发生什么?迭代将如何继续进行第三次调用?我无法理解第二次调用后list
如何链接。据我所知,所有已经建立起来直到知道将消失。然后如何将进一步列出?如何在第三次调用期间放置节点?
答案 0 :(得分:5)
这是所有魔法发生的地方:
1. temp2 = startPTR;
2. while( temp2->next != NULL )
3. temp2 = temp2->next;
4. temp2->next = temp1;
首先,temp2
将指向列表的开头。在第2行和第3行中,您将temp2
更改为下一个节点,直到您到达temp2->next
为NULL
的节点。无论列表的大小如何,此节点都是列表的最后一个节点。
最后,在第4行中,您将temp2->next
更改为temp1
,现在它指向新节点(即最后一个节点现在指向新节点)。 temp1->next
也是NULL
,因此temp1
现在代表了列表的结尾。
第1行后你有
start = addr1;
|
V
(addr1) ----> (addr2) ----> (NULL)
^
|
temp2
temp2->next
不是NULL
(它是addr2),所以你迭代并执行第3行,你得到:
start = addr1;
|
V
(addr1) ----> (addr2) ----> (NULL)
^
|
temp2
temp2->next
现在是NULL
。所以你停止循环并执行第4行,你得到:
start = addr1;
|
V
(addr1) ----> (addr2) ----> (addr3) ----> (NULL)
^ ^
| |
temp2 temp1
注意:你知道指针是如何工作的吗?想象一下:你有一个节点,它是内存中的一些数据。当你在内存中有变量时,这些变量都有地址。假设addr1是10,addr2是150,addr3(只是new
ed的节点)是60. start
的值是10.因此,“指向”列表的第一个节点(即正在使用此地址,您可以访问其数据)。其中一个数据是next
字段。第一个节点的next
字段的值为150,因此指向下一个节点。当您说temp2 = start
时,您将号码10放在temp2
中,此时temp2->next
的值为150.当您说temp2=temp2->next
时,您只需将值150放入temp2
,覆盖以前的值。这样您就可以有效地将指针从指向第一个节点移动到现在指向第二个节点。现在temp2->next
是NULL
(即0)。现在说temp2->next=temp1
时,您将值60放在next
的{{1}}字段中。所以现在temp2
是60. temp2->next
是temp2->next->next
。
答案 1 :(得分:1)
这很简单。 while循环将temp2移动到最后一个元素。然后,由temp1指向的您创建的节点将被指定为temp2的下一个节点
答案 2 :(得分:1)
我没有得到什么困扰你。在任何调用while()循环将遍历列表中的所有节点,直到它到达结尾,然后将最后一个节点中的指针设置为新分配的节点(temp1)。
temp1和temp2是指针。它们不存储节点的数据,它们将地址存储在存储数据的存储器中。所以在第一次迭代结束时,在startPTR = temp1
startPTR指向temp1指向的同一地址之后。如果temp1仍然存在则无关紧要,因为现在startPTR指向节点。在第二次调用结束时temp2->next=temp1
(此时temp2 == startPTR)使节点的next
字段指向新分配的temp1