0

我最近一直在尝试学习 C/C++。我已经编写了一个简单的链表程序,它应该可以工作并且它实际上可以工作,但只有当链表的标题(node* mother)是一个全局变量并且不用作函数(void new_node(int number))的参数时 - 这个函数是一个构造函数(我我使用 C 语法)。

下面的这个程序工作正常,但我不能创建多个链表:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;


struct node {
    node * next;
    int number;
};


node * mother = NULL;

void new_node(int number)
{
    node * newNode = (node*) malloc(sizeof(node));

    newNode -> next = NULL;
    newNode -> number = number;

    if (mother == NULL){
        mother = newNode;
    }
    else{
        node* temp = mother;
        while(temp->next != NULL){
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

void destroy(){
    node* ntemp = mother;
    mother = NULL;
    node* t;

    while(ntemp != NULL){
        t = ntemp->next;
        free(ntemp);
        ntemp = t;
    }
}

void printAll(){
    node *tmp;
    tmp = mother;
    while (tmp != NULL){
        cout <<"value is : " << tmp->number <<endl;
        tmp = tmp->next;
    }

}

int main()
{
    cout <<"size is " << sizeof(node*) <<endl;

    new_node(5);
    new_node(17);
    new_node(-54);
    new_node(3);
    new_node(4);
    new_node(-24);
    new_node(10);
    printAll();
    return 0;
}

但是,如果我将node* mother其用作 function 的参数new_node,则它不起作用-它仅打印节点的大小:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;


struct node {
    node * next;
    int number;
};

void new_node(node* mother, int number){
    node * newNode = (node*) malloc(sizeof(node));

    newNode -> next = NULL;
    newNode -> number = number;

    if (mother == NULL){
        mother = newNode;
    }
    else{
        node* temp = mother;
        while(temp->next != NULL){
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

void destroy(node * mother){
    node* ntemp = mother;
    mother = NULL;
    node* t;

    while(ntemp != NULL){
        t = ntemp->next;
        free(ntemp);
        ntemp = t;
    }
}

void printAll(node * mother){
    node *tmp;
    tmp = mother;
    while (tmp != NULL){
        cout <<"value is : " << tmp->number <<endl;
        tmp = tmp->next;
    }

}

int main()
{
node * mother = NULL;

    cout <<"size is " << sizeof(node*) <<endl;

    new_node(mother, 5);
    new_node(mother, 17);
    new_node(mother, -54);
    new_node(mother, 3);
    new_node(mother, 4);
    new_node(mother, -24);
    new_node(mother, 10);
    printAll(mother);
    return 0;
}

第一个程序的输出:

size is 8
value is : 5
value is : 17
value is : -54
value is : 3
value is : 4
value is : -24
value is : 10

第二个程序的输出:

size is 8

问题是,为什么这个程序的行为如此不同?

4

4 回答 4

0

那是因为当你mother在这一行中设置时:

mother = newNode;

在您的new_node函数中,它设置 的本地副本mother,而不是您传入的变量。

您将需要使用引用node * &mother或双指针node ** mother才能在mother传入原始文件时对其进行修改。

于 2013-02-20T16:40:37.380 回答
0

尝试将 new_node 更改为此:

void new_node(node** mother, int number){
    node * newNode = (node*) malloc(sizeof(node));

    newNode -> next = NULL;
    newNode -> number = number;

    if (*mother == NULL){
        *mother = newNode;
    }
    else{
        node* temp = *mother;
        while(temp->next != NULL){
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

主要是:

int main()
{
node * mother = NULL;

    cout <<"size is " << sizeof(node*) <<endl;

    new_node(&mother, 5);
    new_node(&mother, 17);
    new_node(&mother, -54);
    new_node(&mother, 3);
    new_node(&mother, 4);
    new_node(&mother, -24);
    new_node(&mother, 10);
    printAll(mother);
    return 0;
}

您应该在new_node函数中将指针传递给指向节点的指针,否则只有mother指针的副本会在new_node函数中更改,而mother在 main 中将是相同的。

于 2013-02-20T16:47:07.990 回答
0

问题是在名为“new_node”的函数内部,您只使用指针的副本。因此函数退出后不会保存更改。要允许在函数内部修改指针而不是其副本,您应该使用以下函数声明:

void new_node(node*& mother, int number)

这是使您的第二个程序工作的唯一更改。

于 2013-02-20T16:55:28.710 回答
0

每次调用new_node()时都会创建一个本地副本mother,并且在函数退出时对其所做的任何更改都会丢失。这就是为什么您的列表永远不会被创建的原因。

最简单的解决方法是简单地更改

void new_node(node* mother, int number)

void new_node(node* &mother, int number) // pass-by-reference - Google it!

你会得到你想要的结果。为什么?&in告诉编译器node* &mother您希望函数使用mother您传入的实际变量,而不是它的副本。

于 2013-02-20T17:01:35.113 回答