有人可以解释一下行为的区别吗?
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
// only for the 1st Node
void initNode(Node *head,int n){
head->data = n;
head->next =NULL;
}
void insertFront(Node *head, int n) {
Node *newNode = new Node;
newNode->data = n;
newNode->next = head;
head = newNode;
}
void display(Node *head) {
Node *list = head;
while(list) {
cout << list->data << " ";
list = list->next;
}
cout << endl;
cout << endl;
}
int main()
{
Node *l1 = new Node;
initNode(l1,10);
display(l1);
insertFront(l1,5);
display(l1);
insertFront(l1,6);
display(l1);
insertFront(l1,7);
display(l1);
return 0;
}
节点如何不链接。输出是: 10
10
10
10
如果程序是使用指针指向下面的指针编码,那么它工作正常。我缺少什么?
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
};
// only for the 1st Node
void initNode(Node *head,int n){
head->data = n;
head->next =NULL;
}
void insertFront(Node **head, int n) {
Node *newNode = new Node;
newNode->data = n;
newNode->next = *head;
*head = newNode;
}
void display(Node *head) {
Node *list = head;
while(list) {
cout << list->data << " ";
list = list->next;
}
cout << endl;
cout << endl;
}
int main()
{
Node *l1 = new Node;
initNode(l1,10);
display(l1);
insertFront(&l1,5);
display(l1);
insertFront(&l1,6);
display(l1);
insertFront(&l1,7);
display(l1);
return 0;
}
按预期输出正确:
10
5 10
6 5 10
7 6 5 10
答案 0 :(得分:1)
在第一种情况下,在函数中
void insertFront(Node *head, int n) {
Node *newNode = new Node;
newNode->data = n;
newNode->next = head;
head = newNode;
}
head
是l1
范围内使用的指针main()
的副本。修改head
后,l1
保持不变。这就是为什么在第二种情况l1
中将指向&l1
(void insertFront(Node **head, int n)
)的指针传递给函数的原因。然后*head
为l1
,而不仅仅是l1
的副本。
第一种情况是按值传递参数的示例,第二种情况是通过引用传递参数What's the difference between passing by reference vs. passing by value?
例如,以下功能基本上没用:
void useless(int a){
a=42;
}
如果调用int b=2;useless(b);cout<<b<<endl;
,则会打印2
,而不是42
。
以下功能是正确的方法:
void rightwaytogo(int*a){
*a=42;
}
不要忘记向delete
链接列表中的节点编写函数。