私は最近C/C++を学ぼうとしています。私は動作するはずの単純なリンクリストプログラムを作成しましたが、実際には動作しますが、リンクリストのヘッダー(node* mother
)がグローバル変数であり、関数(void new_node(int number)
)のパラメーターとして使用されていない場合に限ります-この関数はコンストラクターです(I 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
、関数の引数として使用すると、機能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
2番目のプログラムの出力:
size is 8
問題は、なぜこのプログラムの動作がそれほど異なるのかということです。