2017-05-25 31 views
1

合併3所列出所以我有,我想連接,使一個大名單(HeadByPlace),而其他的指針還停留幾個列表(HeadFirstCl,HeadNoSm,HeadSm)。我的問題是爲什麼我的ConnectLists函數不起作用?在一個大名單

#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

看P的前面召喚連接列表後的值。我的猜測是會一樣的。在c中,將一個指針傳遞給一個函數可以讓你改變指向的內容,但是指針本身的改變不會持久存在於函數之外(改變P:P = P-> NextByPlace;將會丟失)。爲了達到我想要的效果,您需要使用指針指針。 (即Point ** P)並在你的函數中取消引用。 –

回答

0

我想我發現了一些問題。你的連接列表函數有一個主要問題,你的while循環永遠不會終止。在C++中,如果指針不爲null,則從指針到bool的隱式轉換返回true;如果指針爲空,則返回false。你的循環會無限地檢查A是否爲空。顯然,如果你給這個函數一個空指針,它將不會做任何事情,但是如果你給它一個有效的A指針,它將永遠循環,因爲函數A中沒有被改變。這裏有一個簡單的函數,實際上將結合您的列表,而這個問題:

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

此功能一直循環到列表的末尾,然後添加一個到最後。請注意,對於A或P爲空的情況,它不會執行任何錯誤處理。如果你用這個替換你的功能,它會做你所問的。

也有與你提供的代碼非常基本的問題。如果您創建多個相同類型的條目,則創建函數會出現段錯誤。另外,你的測試案例有缺陷。每次調用時,您都會傳遞connectLists函數指針HeadByPlace for P。 HeadByPlace爲null,因此嘗試訪問它的任何值(如nextByPlace)會導致分段錯誤。如果你想確保代碼爲connectLists功能我提供的作品,初始化每個列表類型(HeadFirstCl,HeadNoSM和HeadSM)之一,並嘗試連接的,或只是爲了HeadByPlace分配內存。

另外,我有一件不請自來的建議。您可能需要查看C++ STL容器:http://www.cplusplus.com/reference/stl/。我認爲這些數據結構中的某些數據結構(例如向量或列表)可能對您的項目有用。

+0

瞭解如何創建適當的圈,孩子。 非常感謝您的支持。我沒有注意到 –