我最近一直在努力学习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
问题是,为什么这个程序表现得如此不同?
答案 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
变量,而不是它的副本。