Базовый вопрос программирования на C ++ - PullRequest
0 голосов
/ 29 мая 2011

Я нахожусь в процессе изучения c ++.Я работаю над созданием структуры данных связанных списков.Одна из функций, которая отображает значения узлов в структуре, не работает.По какой-то причине цикл while, проходящий через узлы, не работает в функции отображения, поэтому я не вижу значений в этих узлах.Кто-нибудь видит в чем проблема?Я долго смотрел на код и не уверен, что здесь не так.Заранее благодарны за Вашу помощь.Заголовок:

// linklist.h
// class definitions


#ifndef LINKLIST_H
#define LINKLIST_H

class linklist
 {
 private:
     // structure containing a data part and link part
     struct node
     {
         int data;
         node *link;
     }*p;

 public:

     linklist();
     void append(int num);
     void addatbeg(int num);
     void addafter(int loc, int num);
     void display();
     int count();
     void del(int num);
     ~linklist();
 };

#endif

.cpp file

// LinkedListLecture.cpp
// Class LinkedList implementation

    #include"linklist.h"
    #include<iostream>

using namespace std;


     // initializes data member
     linklist::linklist()
     {
         p =NULL;
     }

     // adds a node at the end of a linked list
     void linklist::append(int num)
     {
          node *temp, *r;
         // if the list is empty, create first node
         if(p==NULL)
         {
                 temp = new node;
             temp->data = num;
             temp->link = NULL;      
         }
         else
         {
             // go to last node
             temp = p;
             while(temp->link!=NULL)
                 temp =  temp->link;
             // add node at the end
             r = new node;
             r->data=num;
             r->link=NULL;
             temp->link=r;
         }
     }



 // displays the contents of the linked list
 void linklist::display()
 {
     node *temp = p;
     cout<< endl;
     // traverse the entire linked list
     while(temp!=NULL) // DEBUG: the loop doesn't work
     {
         cout<<temp->data<<" ";
         temp = temp->link;
     }

     void main() 
 {
     linklist l;

     l.append(14);
     l.append(30);
     l.append(25);
     l.append(42);
     l.append(17);
     cout<<"Elements in the linked list:";
     l.display(); // this function doesn't work
     system("PAUSE");
 }

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

Вы никогда не устанавливаете p в ненулевое значение.

    if(p==NULL)
     {
         p = new node;
         p->data = num;
         p->link = NULL;      
     }
1 голос
/ 29 мая 2011

Я думаю, что GWW выдвинул на первый план проблему, но часть обучения программированию, чтобы узнать, как идентифицировать ошибки.

Если вы что-то делаете и не получаете ожидаемого результата, вы можете:

  • Используйте отладчик Visual C ++ для просмотра и просмотра значений ваших переменных.
  • Вставьте строки журнала, чтобы сообщить информацию, которую вы считаете важной
  • проверьте код - если вы считаете, что что-то правильно, но это не работает, перейдите к более раннему шагу и убедитесь, что все правильно.
  • Добавить модульные тесты или следовать дизайну по контракту, добавив условия до / после и инварианты класса.

Обучение программированию на C ++ путем написания связанного списка похоже на изучение математики путем добавления 1 + 1. Это старомодное мышление, медленное и в основном скучное, без какого-либо контекста. Математика не вычисляет, как программирование на C ++ не манипулирование указателями. На каком-то этапе вам, возможно, потребуется знать об этом, но лучше изучать другие важные вещи, такие как stl и boost.

Если понималось, что append() может что-то создать, найдите конец списка, добавьте его. Затем вы можете увидеть, что в функции добавления у вас есть что-то смешанное с переходом в конец списка, но вы никогда не добавите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...