我有这些类(为了便于阅读而剥离)
class node {
public:
int x;
node* next;
node(){}
~node(){}
};
class intLinkedList{
public:
intLinkedList();
~intLinkedList();
void Add (int newX);
private:
node* root;
};
这是Add
中的实现void intLinkedList::Add (int newX){
node* newNode = new node();
newNode->x = newX;
newNode->next = NULL;
std::cout << "\n\n" << root << "\n\n" << std::flush;
if (root == NULL){
root = newNode;
return;
}
node * current;
current = root;
while (current->next != NULL){
current = current->next;
}
current->next = newNode;
return;
}
当我在设置后立即打印出root指向的地址时,它会显示一个有效的地址。但是,下次调用Add时,root再次变为NULL。我无法想象造成这种情况的行为。这绝对不能用于其他任何地方。
我完全意识到我缺少一些简单的东西。如果你倾向于投票,因为问题很简单,那就把它带到其他地方。这个平台的目的是让编码人员在编写脑筋时能够相互帮助。
编辑:这是驱动程序。
#include <string>
#include <iostream>
#include "intLinkedList.h"
using namespace std;
void AddValue(intLinkedList MyList);
void GetValue(intLinkedList MyList);
void InsertValue(intLinkedList MyList);
void DeleteValue(intLinkedList MyList);
void PrintList(intLinkedList MyList);
int main(){
intLinkedList MyList;
int Option;
while (true){
cout << "\n\nMain Menu\n---------\n\n1) Add Value\n2) See Value\n3) Insert Value at Position\n4) Delete Value at Position\n5) Print List\n6) Exit\n\n";
cin >> Option;
switch (Option){
case 1: AddValue(MyList); break;
case 2: GetValue(MyList); break;
case 3: InsertValue(MyList); break;
case 4: DeleteValue(MyList); break;
case 5: PrintList(MyList); break;
case 6: exit(0);
}
}
}
void AddValue(intLinkedList MyList){
int NewValue;
cout << "What value should be added?\n";
cin >> NewValue;
MyList.Add(NewValue);
}
void GetValue(intLinkedList MyList){
int Position;
cout << "What position do you want the value of?\n";
cin >> Position;
MyList.Get(Position);
}
void InsertValue(intLinkedList MyList){
int Position;
int NewValue;
cout << "What position do you wnat to insert after?\n";
cin >> Position;
cout << "\nWhat value do you want to insert?\n";
cin >> NewValue;
MyList.Insert(NewValue, Position);
}
void DeleteValue(intLinkedList MyList){
int Position;
cout << "What position do you want to delete?\n";
cin >> Position;
MyList.Delete(Position);
}
void PrintList(intLinkedList MyList){
cout << MyList.Print();
}
答案 0 :(得分:6)
void AddValue(intLinkedList MyList);
这将生成一个完整的新MyList项。你应该使用引用!
void AddValue(intLinkedList& MyList);
编辑:
为什么使用
case 1: AddValue(MyList); break;
而不是:
MyList.Add(...);
任何一种间接性都会增加错误,复杂性和不可读性的风险。你的问题就是一个很好的例子!
这是我看到的第一个。也许还有更多。
希望这是一个切入点。