2014-01-07 2 views
0

Может ли кто-нибудь сказать мне, почему моя основная программа печатает 9460301 вместо 350? Я просто пытаюсь вставить структуру как отдельный элемент в связанный список. Структура имеет атрибуты x и y. Затем я хочу распечатать атрибут x структуры в моем связанном списке. У меня есть огромная программа, написанная, и я попытался раздеть ее на этом посту только для того, что необходимо для просмотра этой новой проблемы, которая возникла для меня.возвращение чего-то из связанного списка

Мой кусок структура и класс LinkedList следующим образом:

struct chunk{ 
    int x; 
    int y; 
}; 

template <class T> 
class linkedList 
{ 
public: 
    class node 
    { 
    public: 
     ///node class attributes 
     T mPayload; 
     node* mNext; 
     ///constructor 
     node(T toucan):mPayload(toucan),mNext(NULL) 
     {} 
     ///destructor 
     ~node() 
     { 
      ///cascading delete 
      if(mNext) 
       delete mNext; 
     } 
     ///node class methods 
    }; 

    ///linkedList class attributes 
    node* mStart; 
    ///constructor 
    linkedList():mStart(NULL) 
    {} 
    ///destructor 
    ~linkedList() 
    { 
     ///initializes the cascading delete. 
     if(mStart) 
      delete mStart; 
    } 
    ///linkedList class methods 
    T mReturnT(int indx) 
    { 
     if(!mStart) 
     { 
      T emptyList; 
      return emptyList; 
     } 
     else 
     { 
      node* cur; 
      for(int i = 0; i<indx+1; i++) 
      { 
       if(cur->mNext == NULL) 
       { 
        cout << "Indx out of range. Deleting last item." << endl; 
        break; 
       } 
       cur = cur->mNext; 
      } 
      return cur->mPayload; 
     } 
    } 

    void mInsertHelper(node* blah, T data) 
    { 
     if(blah->mNext != NULL) 
      mInsertHelper(blah->mNext, data); 
     else 
     { 
      blah->mNext = new node(data); 
      blah->mNext->mNext = NULL; 
     } 
    } 

    void mInsert(T data) 
    { 
     if(mStart == NULL) 
     { 
      mStart = new node(data); 
      //mStart->mPayload = data; 
     } 
     else 
      mInsertHelper(mStart, data); 
    } 

    T mPop() 
    { 
     ///Removes the last item in the list, 
     ///and returns it. 
     if(!mStart) 
      return NULL; 
     else 
     { 
      node* cur = mStart; 
      while(cur->mNext) 
      { 
       cur = cur->mNext; 
      } 
      T var = cur->mPayload; 
      delete cur; 
      return var; 
     } 
    } 

    int mSize() 
    { 
     if(!mStart) 
      return 0; 
     else 
     { 
      node* cur = mStart; 
      int counter = 1; 
      while(cur->mNext) 
      { 
       cur = cur->mNext; 
       counter++; 
      } 
      delete cur; 
      return counter; 
     } 
    } 

}; 

И мой main.cpp:

int main() 
{ 
    chunk head; 
    head.x = 350; 
    head.y = 600; 
    linkedList<chunk> p1Snake; 
    p1Snake.mInsert(head); 

    cout<<p1Snake.mReturnT(0).x<<endl; 
} 
+0

Это не соответствует правилу Трех. – chris

ответ

2

Вы никогда не инициализировать cur перед тем итерация через него.

node* cur;         // <-- UNINITIALISED! 
for(int i = 0; i<indx+1; i++) 
{ 
    if(cur->mNext == NULL) 
    { 
     cout << "Indx out of range. Deleting last item." << endl; 
     break; 
    } 
    cur = cur->mNext; 
} 
return cur->mPayload; 

Это первая линия должна быть:

node* cur = mStart; 

И я думаю, вы должны использовать indx вместо indx+1 в этом цикле ... Если вы не использовали манекен-головки схему, которая вам Нет.

Логика внутри цикла для обнаружения внеочередных значений тоже немного ошибочна. Как насчет реконструкции всего:

node* cur = mStart; 
while(cur && indx > 0) { 
    cur = cur->mNext; 
    indx--; 
} 

if(!cur) { 
    cout << "Indx out of range." << endl; 
    return T(); 
} 

return cur->mPayload; 
+0

Это было очень полезно! :) Раньше у меня был indx + 1, потому что я не знал, что случилось, и я просто экспериментировал. – DebrisHauler

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