2014-02-13 2 views
0

Кажется, я не могу понять, почему цикл while не заканчивается.C++: В то время как цикл не заканчивается как NULL, я что-то упускаю?

Должно быть в то время как (null) в основном.

Я не могу понять это.

Вся помощь будет оценена: D

Я не знаю, что могло бы быть останавливая время цикла на всех? В нем говорится, что первая запись сохраняется, а запись для следующего - 0x0000000000 и ??? имя и ??? ??? так что это на самом деле NULL. Я попытался добавить в конструктор next = 0; вместо next = NULL, и это все еще не сработало.

Спасибо, ребята.

Энтони

EDIT: Value of nodePtr = 00000000 if next = 0 in the constructor 
     Value of nodePtr = 00899FE0 if next = NULL in the constructor 
if adding a cout << nodePtr->next; before the while. 

http://pastebin.com/7usYdfHB - Полная программа для справки.

EDIT2: http://i.imgur.com/fKCoSjV.png Является ли всплывающее окно, когда я иду, чтобы ввести вторую запись.

void LinkedList::appendNode(string name, double x, double y) 
{ 
     ListNode* newNode; // To point to new node 
     ListNode* nodePtr; // To traverse List 

     // allocate new node 
     newNode = new ListNode(name, x, y); 

     // If no head, head is the newNode 
     // else traverse the list to find the end and append newNode 
     if (!head) 
     { 
       head = newNode; 
       cout << "Record inserted successfully.\n" << endl; 
     } 
     else 
     { 
       nodePtr = head; 

       //traverse the list loop 
       while (nodePtr->next) //VS 2012 locks up here <----- 
       { 

         //Checks for duplicate entry by name 
         if (nodePtr->cityName == name) 
         { 
           cout << "No need to insert again, as this record exists in the existing data set.\n" << endl; 
           return; 
         } 
         //traverse the list 
         nodePtr = nodePtr->next; 
       } 
       // checks 2nd entry, as while loop wont run for a 2nd entry. 
       if (nodePtr->cityName == name)     { 
         { 
           cout << "No need to insert again, as this record exists in the existing data set.\n" << endl; 
           return; 
         } 
       } 
       // if next is NULL add newNode 
       else if (!nodePtr->next) 
       { 
         nodePtr->next = newNode; 
         cout << "Record inserted successfully.\n" << endl; 
       } 
     } 
+1

Вы инициализируетесь рядом с NULL в своем конструкторе для ListNode? – drescherjm

+0

Опубликовать конструктор. Собственно, отправьте два из них: один из «LinkedList» и еще один из «ListNode». – AnT

+0

http://pastebin.com/7usYdfHB – user2565679

ответ

1

Помимо очевидной утечки памяти при попытке вставить уже существующее имя, ваш код работает нормально. Он отлично работает, когда для инициализации указателей используется либо 0, либо NULL. Это не имеет значения.

(один дикий догадка я могу сделать то, что в Вашем коде вызова (который вы не показывают), вы каким-то образом удалось передать ваш LinkedList вокруг по значению. Так как ваш LinkedList не удовлетворяет правило трех, целостность списка была нарушается, что приводит к неопределенным последствиям вы наблюдаемые.)

BTW, используя дополнительный уровень косвенности вы можете упростить сильно разветвленный appendNode функции в значительно более компактны и почти внеофисный один

void LinkedList::appendNode(string name, double x, double y) 
{ 
     ListNode** pnodePtr; 

     for (pnodePtr = &head; *pnodePtr != NULL; pnodePtr = &(*pnodePtr)->next) 
       if ((*pnodePtr)->cityName == name) 
         break; 

     if (*pnodePtr == NULL) 
     { 
        *pnodePtr = new ListNode(name, x, y); 
        cout << "Record inserted successfully.\n" << endl; 
     } 
     else 
        cout << "No need to insert again, as this record exists in the existing data set.\n" << endl; 
} 

(Я также устранил утечку.) В частности, этот метод позволяет избежать написания выделенной ветви для обработки головного узла.

Также (со ссылкой на полную версию коды), в своих функциях из группы «удалить координату» вы по какой-то причине проверки обаx и y координаты головного узла, но только один координаты других узлов вниз по списку. Зачем? Это довольно странно и, похоже, не имеет большого смысла. Между тем функции из группы «поиск по координатам» не имеют этой проблемы - они обрабатывают все узлы последовательно.

Также, ваша displayList функция страдает от шальной return в самом начале, поэтому он никогда ничего не печатает. Вам необходимо добавить пару {}, чтобы правильно группировать ваши заявления.

+0

Я могу показать другой файл, используемый для начала завтра утром. Цените помощь. Он действительно проходит через первый набор данных, хотя это странно. Может быть, это просто компилятор для VS2012. – user2565679

+0

http://pastebin.com/1NDph751 - Вот код, который его вызывает. – user2565679

+0

@ user2565679: Я запустил ваш код и ввел ряд записей в список без каких-либо проблем. Ваш код печатает значение «head» в каждой вставке (за исключением первого), но в остальном он работает так, как ожидалось. И нет, это вряд ли будет проблемой с компилятором. – AnT

1

Я попытался воспроизвести вашу проблему, но не смог. Я переделал ваши классы ListNode и LinkedList. Приведенный ниже код, возможно, поможет вам разобраться в вашей проблеме. Я немного отредактировал его, чтобы упростить его (далее вам следует рассмотреть возможность отслеживания конца списка, так как это поможет другим операциям, которые вам понадобятся в вашем списке). Обязательно внедрите деструктор для вашего класса LinkedList для очистки узлов.

#include <string> 
#include <iostream> 

using namespace std; 

struct ListNode 
{ 
    string cityName; 
    double m_x, m_y; 
    ListNode* next; 

    ListNode(string name, double x, double y) : cityName(name), m_x(x), m_y(y), next(nullptr) 
    {} 
}; 

class LinkedList 
{ 
    ListNode* head; 
public: 
    LinkedList() : head(nullptr) 
    { 
    } 
    ~LinkedList() 
    { 
    } 
    void LinkedList::appendNode(string name, double x, double y) 
    { 
     ListNode* newNode; // To point to new node 

     // allocate new node 
     newNode = new ListNode(name, x, y); 

     // If no head, head is the newNode 
     // else traverse the list to find the end and append newNode 
     if (!head) 
     { 
      head = newNode; 
      cout << "Record inserted successfully.\n" << endl; 
     } 
     else 
     { 
      ListNode *nodePtr = head; 
      ListNode *prevNode = nullptr; 

      //traverse the list loop 
      while (nodePtr) 
      { 

       //Checks for duplicate entry by name 
       if (nodePtr->cityName == name) 
       { 
        cout << "No need to insert again, as this record exists in the existing data set.\n" << endl; 
        return; 
       } 
       //traverse the list 
       prevNode = nodePtr; 
       nodePtr = nodePtr->next; 
      } 
      // if next is NULL add newNode 
      if (prevNode) 
      { 
       prevNode->next = newNode; 
       cout << "Record inserted successfully.\n" << endl; 
      } 
     } 
    } 
}; 

int main() 
{ 
    LinkedList list; 

    list.appendNode("New York", 1.0, 2.0); 
    list.appendNode("Boston", 1.5, 2.5); 
    list.appendNode("Miami", 1.7, 2.7); 
    list.appendNode("Miami", 1.7, 2.7); 
} 
+0

Цените помощь, друг. Может быть, мой компилятор для VS2012 не нравится. Я обычно использую Netbeans с cygwin, но с тех пор переформатировал свой компьютер. – user2565679

+0

http://pastebin.com/1NDph751 вот код, который его вызывает, я предполагаю его компилятор. – user2565679

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