链表行为

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;
}

headmain() 范围内使用的指针 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 链表的节点编写一个函数。