链表行为
Linked list Behaviour
有人可以解释一下行为上的差异吗?
#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
第一种情况,在函数中
void insertFront(Node *head, int n) {
Node *newNode = new Node;
newNode->data = n;
newNode->next = head;
head = newNode;
}
head
是 main()
范围内使用的指针 l1
的副本。当修改head
时,l1
保持不变。这就是为什么在第二种情况 void insertFront(Node **head, int n)
中将指向 l1
(&l1
) 的指针传递给函数的原因。那么 *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
链表的节点编写一个函数。
有人可以解释一下行为上的差异吗?
#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
第一种情况,在函数中
void insertFront(Node *head, int n) {
Node *newNode = new Node;
newNode->data = n;
newNode->next = head;
head = newNode;
}
head
是 main()
范围内使用的指针 l1
的副本。当修改head
时,l1
保持不变。这就是为什么在第二种情况 void insertFront(Node **head, int n)
中将指向 l1
(&l1
) 的指针传递给函数的原因。那么 *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
链表的节点编写一个函数。