链接列表行为

时间:2015-02-15 15:54:57

标签: c++ data-structures linked-list

有人可以解释一下行为的区别吗?

#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

1 个答案:

答案 0 :(得分:1)

在第一种情况下,在函数中

void insertFront(Node *head, int n) {
  Node *newNode = new Node;
  newNode->data = n;
  newNode->next = head;
  head = newNode;
}

headl1范围内使用的指针main()的副本。修改head后,l1保持不变。这就是为什么在第二种情况l1中将指向&l1void insertFront(Node **head, int n))的指针传递给函数的原因。然后*headl1,而不仅仅是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链接列表中的节点编写函数。