C ++全局vs局部变量作为链表中的标题

时间:2013-02-20 16:33:04

标签: c++ linked-list

我最近一直在努力学习C / C ++。我编写了一个简单的链表程序应该可以工作,它实际上只有当链表(node* mother)的标题是全局变量并且不用作函数的参数时才会起作用({{1} }) - 这个函数是一个构造函数(我使用的是C语法)。

以下此程序运行正常,但我无法创建多个链表:

void new_node(int number)

如果我使用#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的参数,它不起作用 - 它只打印节点的大小:

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

问题是,为什么这个程序表现得如此不同?

4 个答案:

答案 0 :(得分:0)

那是因为当您在此行中设置mother时:

mother = newNode;

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

您需要使用引用node * &mother或双指针node ** mother才能修改传入的原始mother

答案 1 :(得分: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中的{{1}}是一样的。

答案 2 :(得分:0)

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

void new_node(node*& mother, int number)

这是使您的第二个程序正常工作的唯一变化。

答案 3 :(得分:0)

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

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

void new_node(node* mother, int number)

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

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