2017-02-14 3 views
0
void CommunicationNetwork:: buildNetwork(){ 

    string citylist [] = {"Phoenix", "Denver", "Dallas", "St. Louis", "Chicago", "Atlanta", "Washington D.C.", "New York", "Boston"}; 

    head = ("Los Angeles", NULL, NULL); 
    City *temp2 = new City; 

    City *temp = new City; 

    temp=head; 

    for(int i=0;i<9;i++){ 

     temp2->cityName=citylist[i]; //=Pheonix 
     temp->next=temp2;   //segmentation fault here 
     temp=temp2; 
    } 
} 

City - это структура для связанных списков. next указывает на следующий узел. Я получаю ошибку сегментации, потому что я пытаюсь разыменовать значение NULL next для temp. Это единственный способ добавить значение к temp. Есть ли другой способ заменить NULL на temp2, кроме temp->next= temp2?Как добавить значения в связанный список без использования «->»?

+1

вы должны переместить «temp2 = новый город "внутри цикла и точку головы до temp1. – Mike

+0

Разве голова не указана на температуру с линией «temp = head»? – user7554736

+0

'a-> b' является ярлыком для' (* a) .b', поэтому вы можете механически переписать свой код без '->'. – dasblinkenlight

ответ

0

Неверный способ реализации связанного списка. Это должно выглядеть примерно так:

private: 
    City *head; 

CommunicationNetwork::CommunicationNetwork() 
    : head(NULL) 
{ 
} 

CommunicationNetwork::~CommunicationNetwork() 
{ 
    City *temp = head; 
    while (temp) 
    { 
     City *next = temp->next; 
     delete temp; 
     temp = next; 
    } 
} 

void CommunicationNetwork::buildNetwork() 
{ 
    std::string citylist [] = {"Los Angeles", "Phoenix", "Denver", "Dallas", "St. Louis", "Chicago", "Atlanta", "Washington D.C.", "New York", "Boston"}; 

    // find the last node in the list... 
    City *last = NULL; 
    if (head) 
    { 
     last = head; 
     while (last->next) 
      last = last->next;   
    } 

    // add the cities to the end of the list... 
    for(int i = 0; i < 10; ++i) 
    { 
     City *temp = new City; 
     temp->cityName = citylist[i]; 
     temp->next = NULL; 

     if (!head) head = temp; 
     if (last) last->next = temp; 
     last = temp; 
    } 
} 

Каких бы то выгода от поминания хвоста узла рядом с узлом головки, так что вам не придется охотиться за это каждый раз, когда:

private: 
    City *head, *tail; 

CommunicationNetwork::CommunicationNetwork() 
    : head(NULL), tail(NULL) 
{ 
} 

CommunicationNetwork::~CommunicationNetwork() 
{ 
    City *temp = head; 
    while (temp) 
    { 
     City *next = temp->next; 
     delete temp; 
     temp = next; 
    } 
} 

void CommunicationNetwork::addCity(const std::string &cityName) 
{ 
    City *temp = new City; 
    temp->cityName = citylist[i]; 
    temp->next = NULL; 

    if (!head) head = temp; 
    if (tail) tail->next = temp; 
    tail = temp; 
} 

void CommunicationNetwork::buildNetwork() 
{ 
    std::string citylist [] = {"Los Angeles", "Phoenix", "Denver", "Dallas", "St. Louis", "Chicago", "Atlanta", "Washington D.C.", "New York", "Boston"}; 

    for(int i = 0; i < 10; ++i) 
     addCity(citylist[i]); 
} 

А потом после того, как вы его работать, выбросить ручной список и использовать std::list (или std::forward_list в C++ 11 и позже), а, пусть это управление памятью для вас:

private: 
    std::list<std::string> cities; 

void CommunicationNetwork::addCity(const string &cityName) 
{ 
    cities.push_back(cityName); 
} 

void CommunicationNetwork::buildNetwork() 
{ 
    string citylist [] = {"Los Angeles", "Phoenix", "Denver", "Dallas", "St. Louis", "Chicago", "Atlanta", "Washington D.C.", "New York", "Boston"}; 

    for(int i = 0; i < 10; ++i) 
     addCity(citylist[i]); 
} 
+0

Чрезвычайно всеобъемлющий. Я должен вам один – user7554736

+0

Вид смешной. Это отлично сработало вчера. Я не изменил код, и теперь он не работает. – user7554736

Смежные вопросы