2017-10-14 17 views
-2

シンプルなリンクリストを印刷したいコードを作成しました。リストの情報には、人の名前と電話番号が含まれています。残念ながら、私のリストを印刷するときには、私が最後に読んだ人の名前しか持っていませんが、電話番号は異なります。なぜ私のコードがうまくいかないのか分かりません。人物名でリンクリストを正しく印刷するにはどうすればいいですか?

だから、ここに私のコードは

#pragma once 

struct Nodd{ 
    int phone; 
    char *name; 
    Nodd *next; 
}; 

void InsertList(Nodd *&L,int nr,char *n); 
void PrintList(Nodd *&L); 


#include <iostream> 
#include "Header.h" 
using namespace std; 
void InsertList(Nodd *&L,int nr, char *n){ 
    Nodd *p = new Nodd; 
    p->name = n; 
    p->phone = nr; 
    p->next = L; 
    L = p; 
} 

void PrintList(Nodd *&L){ 
    Nodd *p = L; 
    while(p){ 
     cout << p->name << " " << p-> phone << endl; 
     p = p->next; 
    } 
} 

#include <iostream> 
#include "Header.h" 
using namespace std; 

int main(){ 

    Nodd *L = 0; //L = first element of the linked list 
    int nr, i, t; 
    char *n; 
    n = new char; 

    cout <<"Read number of people: "; 
    cin >> t; 

    for(i = 0; i < t; i++){ 
     cout << "Name: "; 
     cin.ignore(50, '\n'); 
     cin.getline(n, 50); 

     cout << "Phone number: "; 
     cin >> nr; 
     InsertList(L, nr, n); 
    } 

    PrintList(L); 

    return 0; 
} 

そして、何私がコンパイルされた次のとおりです。人々の

読む番号:2

Name: Elena 
Phone number: 99776244 

Name: Andreea 
Phone number: 98776489 

.......... ..................

Andreea 98776489 
Andreea 99776244 

コードを修正する方法を教えてください。それは未定義の動作であるので、あなたは、単一の文字変数に割り当てる50文字を見ることができるよう

cin.getline(n, 50); UB here 

char *n; 
n = new char; // A single dynamic character 

以降:

+0

実際に問題のあるセクションへのコードをデバッガを使用するか短縮してください。 – kim366

+0

'n = new char;'は何をしますか?あなたはこれがそうだと思いますか? char *の代わりにstd :: stringを使用してください! –

+0

'n = new char;'ヒープ上に1文字のみを割り当てます。 'n = new char; [size]'を使って、ここで必要なものを推測します。また、 'delete [] n'を使ってメモリを解放することを忘れないでください。 – Raindrop7

答えて

0

あなたは、あなたのコード内で多くのエラーを持っています。

char* n = new char[50]; 
  • をあなたは何を参照してくださいあなたの出力に深い表情を支払う場合:それを修正するには

    アンドレーア98776489 アンドレーア99776244

同じ名前が、整数値は正しいです!したがって、ノードの挿入機能は正しいですが、問題は名前に関するものです。どうして?あなたは、各ノードが同じものを共有していないためメンバーnameためのメモリを割り当てる必要が

p->name = new char[strlen(n) + 1]; 
    strcpy(p->name, n); 

:あなたが書いた挿入ノードで

p->name=n; // That is not the way you should do it. 

はそれを修正します。また

  • あなたがメモリリークを避けるために、あなたが解放しなければなりません動的メモリで行われ、きれいだ:

    delete[] n; 
    
  • は、メンバー名のすべてのノードのメモリを解放する機能を追加します:

    データがメモリを解放ノードを印刷した後
    void FreeupMemory(Nodd*& L){ 
        Nodd* pTmp = L; 
        while(pTmp){ 
         delete[] pTmp->name; 
         pTmp = pTmp->next; 
        } 
    } 
    

そしてメインで:

限り、C++を使う多くの強力なクラスやユーティリティはので、ここで動的配列を使用してあきらめていますようご class stringvectorを使用することができます。私はお勧めは何
 FreeupMemory(L); 
  • 。それは本当に良いですし、メモリリークについて気にしないでください。

  • あなたのメンバーデータnameがエラーが発生しやすい文字列クラスのオブジェクトであれば信じてください。メインで

    struct Nodd{ 
        int phone; 
        std::string name; 
        Nodd *next; 
    }; 
    
    void InsertList(Nodd *&L,int nr, std::string n){ 
        // your code 
        p->name = n; // ok 
        // ... 
    } 
    

std::string n; 
    for(int i(0); i < t; i++){ 
     std::getline(std::cin, n); 
    } 

**もあり悪いこと:

は、なぜあなたは自分自身でヘッダーを含めますか? 「再帰的包含」?

ヘッダーファイル "header.h"には、クラスインターフェイスと関数のプロトタイプのみが含まれ、別のソースファイル "MyLinkedList.cpp" にはヘッダーが含まれます。そして、main.cpp。

// header.h 
#pragma once 

struct Nodd{ 
    int phone; 
    char *name; 
    Nodd *next; 
}; 

void InsertList(Nodd *&L,int nr,char *n); 
void PrintList(Nodd *&L); 
void FreeupMemory(Nodd*&L); 


// MyLinkedList.cpp 

#include "header.h" 
#include <iostream> 
using namespace std; 


void InsertList(Nodd*& L, int nr, char* n){ 
    Nodd *p = new Nodd; 
    p->name = n; 
    p->phone = nr; 
    p->next = L; 
    L = p; 
} 

void PrintList(Nodd *&L){ 
    Nodd* p = L; 
    while(p){ 
     cout << p-> name << " " << p->phone << endl; 
     p = p->next; 
    } 
} 

void FreeupMemory(Nodd*& L){ 
    Nodd* pTmp = L; 
    while(pTmp){ 
     delete[] pTmp->name; 
      pTmp = pTmp->next; 
    } 
} 

// main.cpp 

#include <iostream> 
#include "Header.h" 
using namespace std; 

int main(){ 
    Nodd* L = 0; //L = first element of the linked list 
    int nr, i, t; 
    char* n = new char[50]; 

    cout << "Read number of people: "; 
    cin >> t; 

    for(int i = 0; i < t; i++){ 
     cout << "Name: "; 
     cin.ignore(1, '\n'); 
     cin.getline(n, 50); 

     cout << "Phone number: "; 
     cin >> nr; 

     InsertList(L, nr ,n); 
    } 

    PrintList(L); 
    FreeupMemory(L); 
    delete[] n; 

    return 0; 
} 
  • 最後に一つは、良いリンクリストは、メンバー・メソッドとしてのノードの追加と削除のための関数を定義し、メモリを解放するためにデストラクタがあるはずです。
関連する問題