2017-05-25 9 views
1

他のポインタが残っている間に、リスト(HeadFirstCl、HeadNoSm、HeadSm)を接続して大きなリスト(HeadByPlace)を作成するリストがいくつかあります。私の質問は、ConnectListsの機能が機能しないのはなぜですか?3つのリストを1つのビッグリストにマージする

#include <iostream> 
#include <string> 
using namespace std; 

struct Item { 
    string naprav; 
    string chasizl; 
    string chaskac; 
    int termizl; 
    int termkac; 
    char fime[5]; 
    int mqsto; 
    Item *NextByPlace; 
}; 

typedef Item *Point; 
Point HeadByPlace, HeadFirstCl, HeadNoSm, HeadSm; 

void ConnectLists(Point &P, Point A) { 
    while (A) { 
     if (P->NextByPlace == NULL) 
      P->NextByPlace = A; 
     P = P->NextByPlace; 
    } 
} 

void PrintOut(Point P) { 
    while (P) { 
     cout << P->fime<<endl; 
     cout << P->chasizl << endl; 
     cout << P->chaskac << endl; 
     cout << P->mqsto << endl; 
     cout << P->naprav << endl; 
     cout << P->termizl << endl; 
     cout << P->termkac << endl; 
     P = P->NextByPlace; 
    } 
} 

void Create(Point &Head, int i) { 
    Point Last, P; 
    Last = NULL; 
    P = new Item; 
    P->mqsto = i; 
    cout << "Enter destination" << endl; 
    cin >> P->naprav; 
    cout << "Enter departure HOUR" << endl; 
    cin >> P->chasizl; 
    cout << "Enter arrival HOUR" << endl; 
    cin >> P->chaskac; 
    cout << "Enter # of leaving terminal" << endl; 
    cin >> P->termizl; 
    cout << "Enter # of entering terminal" << endl; 
    cin >> P->termkac; 
    cout << "Last name of traveler" << endl; 
    cin >> P->fime; 
    P->NextByPlace = NULL; 
    if (Head == NULL) { 
     Head = P; 
    } else { 
     Last->NextByPlace = P; 
    } 
    Last = P; 
} 

void Delete(char name[], Point &Head) { 
    Point Pprev, P; 
    P = new Item; 
    Pprev = new Item; 
    cin >> name; 
    while (Head) { 
     if (strcmp(Head->fime, name) == 1) { 
      Pprev = P->NextByPlace; 
      *P = *Pprev; 
      delete Pprev; 
     } 
    } 
} 

void main() { 
    char ch; 
    HeadByPlace = NULL; 
    HeadFirstCl = NULL; 
    HeadNoSm = NULL; 
    HeadSm = NULL; 
    int i; 
    cout << "New element? (Y/N)? : "; 
    cin >> ch; 
    while (ch == 'Y' || ch == 'y') { 
     cout << "Enter seat #: "; 
     cin >> i; 
     if (i < 7) Create(HeadFirstCl,i); 
     else if (i > 7 && i < 25) Create(HeadNoSm,i); 
     else if (i > 25) Create(HeadSm,i); 
     cout << " New element? (Y/N) ?: "; 
     cin >> ch; 
    } 

    ConnectLists(HeadByPlace, HeadFirstCl); 
    ConnectLists(HeadByPlace, HeadNoSm); 
    ConnectLists(HeadByPlace, HeadSm); 
    PrintOut(HeadByPlace); 

    system("pause"); 
} 
+0

Connectリストを呼び出す前後にPの値を調べます。私の推測は、それは同じになるだろうということです。 cでは、ポインターを関数に渡すことでポインタを変更することができますが、ポインター自体の変更は関数の外では持続しません(P:P = P-> NextByPlaceへの変更は失われます)。私はあなたがそれが欲しいと思うようにこれが動作するためには、あなたはポインタポインタを使用する必要があります。 (すなわち、Point ** P)、それをあなたの関数で逆参照してください。 –

答えて

0

私はいくつかの問題を発見したと思います。あなたの接続リスト機能には1つの大きな問題があり、whileループは決して終了しません。 C++では、ポインタからboolへの暗黙的な変換は、ポインタがNULLでない場合はtrueを返し、ポインタがnullの場合はfalseを返します。ループが無限にチェックされ、Aがnullかどうかが確認されます。明らかに、関数にヌルポインタを与えると何もしませんが、Aに対して有効なポインタを与えると、関数内でAが変更されていないので、ポインタは永遠にループします。ここでは、実際にこの問題なしであなたのリストを結合します簡単な関数があります:

void ConnectLists(Point P, Point A) { 
    while (P->NextByPlace != nullptr) { 
     P = P->NextByPlace;   
    } 
    P->NextByPlace = A; 
} 

この関数は、リストの最後までループし、そして最後に追加されます。 AまたはPがヌルの場合、エラー処理は行われないことに注意してください。あなたの関数をこの関数に置き換えると、それはあなたが求めたことを行います。

提供したコードにも非常に根本的な問題があります。同じタイプの複数の項目を作成すると、作成機能が失敗します。また、テストケースに欠陥があります。 connectLists関数を呼び出すたびにPのHeadByPlaceポインタを渡しています。 HeadByPlaceがnullのため、nextByPlaceなどの値にアクセスしようとすると、セグメンテーション違反が発生します。あなたは、私が作品を提供connectLists関数のコードを確認するには、リストの種類(HeadFirstCl、HeadNoSM、およびHeadSM)のそれぞれの1を初期化したもの、または単にHeadByPlaceにメモリを割り当てるを接続してみてください。

また、迷惑なアドバイスもあります。 C++ STLコンテナ(http://www.cplusplus.com/reference/stl/)を見てみるとよいでしょう。私は、これらのデータ構造の一部(ベクターやリストなど)がこのプロジェクトのために役立つと思います。

+0

適切なループ、子供を作成する方法を学びます。 ありがとうございました。私は気づいていなかった –

関連する問題