2

私は現在、2 つの名前、ID 番号を格納し、次の機能を持つノード クラスの次のコードを持っています。

class Node{
public:
  char LastName[20] ;
  char FirstName[20] ;
  int IDnumber ;
  Node *Next ;

 Node();
 void printNode();
};

これは、キーボードからノード変数を初期化するために使用しているコンストラクターです。

Node::Node(){

cout << "Enter ID number: " << endl;
cin >> IDnumber;
cout << "Enter last name: " << endl;
cin >> LastName;
cout << "Enter first name: " << endl;
cin >> FirstName;
Next=NULL;
}

void Node::printNode(){
cout << "ID number: " << IDnumber << endl;
cout << "Last name: "  << LastName <<endl;
cout << "First name: "  << FirstName << endl;
}

私が抱えている問題は、コードの後半で printNode() 関数を呼び出すたびに、コードが printNode() 関数の最初の行を実行できないことです。(未処理の例外) また、別のリンクリスト クラスで node->Next を呼び出そうとすると、このコードの実行に失敗します。これにより、ノードを正しく構築していないと信じるようになります。私のコードで何が間違っている可能性があるかについてのアイデアはありますか?

リンクされたリストは、上で投稿したノード クラスを使用する別のクラスです。

class LinkedList{

private:
Node* list;
Node* createNode();
Node* searchLocation(int);

public:

LinkedList();
~LinkedList();

void InsertNode();
void SearchNode();
void PrintList();
void DeleteNode(int);

};


LinkedList::LinkedList(){
Node* list = NULL;
}

Node* LinkedList::createNode(){
Node *NewNode = new Node();
return NewNode;
}

void LinkedList::InsertNode(){
Node* insert = createNode();
if (list == NULL){
    list = insert;}}

void LinkedList::PrintList(){
Node* temp = list;
while (temp != NULL){
temp->printNode();
temp = temp->Next;
}
}

私の LinkedList クラスの PrintList() 関数は、list->printNode() (cout << IDnumber 行にブレークがある) のときに失敗し、list = list->Next 行でも失敗します。

int main(){

int num = 0;
    LinkedList list;

  int menu=0;
  while(menu != 5){

  cout << endl << "Choose a menu option." <<endl
   << "1. Insert node " << endl << "2. Delete node " << endl
   << "3. Print list" << endl << "4. Search a node & print info" << endl
   << "5. Quit program  " << endl;


  cin >>  menu;
   menu = validate(menu);

 switch(menu){
 case 1: 
     list.InsertNode();

 break;

case 3: 
    list.PrintList();

 break;
 }}

return 0;

  }
4

1 に答える 1

1

コードにエラーがほとんどありません。最も重要なのは、静的変数などの一般的な変数を参照する必要がある場合に、常にローカルlistポインターを参照することです。NULLNode

ここで実際の解決策を見つけることができます。正しいリストの割り当て解除のために本文を追加してください

~LinkedList(){}

そしてあなたは大丈夫です:

リンクリスト:

class LinkedList{

private:
static Node* list;
Node* createNode();
Node* searchLocation(int);

public:
LinkedList();
~LinkedList(){}
void InsertNode();
void SearchNode();
void PrintList();
void DeleteNode(int);
};

Node* LinkedList::list = NULL;
                 ^
     don't foget to initialize pointer to static object

LinkedList::LinkedList(){
Node* list = NULL;
}

Node* LinkedList::createNode(){
Node *NewNode = new Node();
return NewNode;
}

void LinkedList::InsertNode(){
Node* insert = createNode();
if(list==NULL)list=insert;
else
    list->Next = insert;
}

void LinkedList::PrintList(){
Node* temp = list;
while (temp != NULL){
temp->printNode();
temp = temp->Next;
}
}

そしてメイン:

int main(){

int num = 0;
   LinkedList list;

   cout << endl << "Choose a menu option." <<endl
   << "1. Insert node " << endl << "2. Delete node " << endl
   << "3. Print list" << endl << "4. Search a node & print info" << endl
   << "5. Quit program  " << endl;

   list.InsertNode();
   list.InsertNode();

   list.PrintList();

return 0;

}

出力: メニュー オプションを選択します。1. ノードを挿入 2. ノードを削除 3. リストを印刷 4. ノードを検索して情報を印刷 5. プログラムを終了
ID 番号を入力: 8 姓を入力: i 名を入力: j ID 番号を入力: 9 姓を入力: k Enterお名前:l

識別番号: 8

姓: 私

お名前: じ

識別番号: 9

姓: k

お名前:l

RUN SUCCESSFUL (合計時間: 14 秒)

于 2013-09-26T04:09:03.773 に答える