Что не так в нижеприведенном списке программ в cpp? - PullRequest
0 голосов
/ 01 мая 2018

Я столкнулся со странной проблемой, что печатается только 1-й элемент списка. После долгого времени я написал программу для связанного списка. Спасибо за помощь. Что-то не так с функцией printAll или добавить функцию в список класса. Я пробовал печатать предыдущие элементы при добавлении новых, и это работает. Итак, я не понимаю, почему только 1-й элемент .ie. head печатается, а head-> next кажется нулевым.

 #include<iostream>
using namespace std;

class Node{
public: int data;
public: Node *next;

public: Node(int data){
this->data = data;
this->next = NULL;
}
 };

class List{
 Node *head, *trav;
 public: List(){
this->head = NULL;
this->trav = NULL;
 };

 void add(int data){
 if(this->head==NULL && this->trav==NULL){

  cout<<"inside the if block"<<endl;
  this->head = new Node(data);
  this->trav = this->head->next;
}
else{
  cout <<"inside the else block"<<endl;
  this->trav = new Node(data);
  this->trav = this->trav->next;
}
  }

 void printAll(){
  this->trav = this->head;

while(this->trav!=NULL){
  cout<<this->trav->data<<endl;
  this->trav = this->trav->next;
  }
  }
    };

int main(){

 List list;

 list.add(2);
 list.add(3);
 list.add(4);
 list.add(5);
 list.printAll();

 cout<<sizeof(list);
  }

Ответы [ 4 ]

0 голосов
/ 01 мая 2018

Метод add() метод else не правильно связывает список, сделайте некоторую бумажную работу. Вот рабочий, который я пытался объяснить в комментариях.

void add(int data){
        if(this->head==NULL && this->trav==NULL){ /* for 1st node */

                cout<<"inside the if block"<<endl;
                this->head = new Node(data);
                this->trav = this->head->next;
        }
        else{

                this->new_node = new Node(data); /*new_node */
                cout <<"inside the else block"<<endl;

                this->trav = head;/*temp var to point to ast node */
                while(this->trav->next!=NULL)  {
                        this->trav = this->trav->next;
                }

                this->trav->next = this->new_node; /*adding at end */
                this->new_node->next = NULL; /*new_node next make it NULL */
        }
}
0 голосов
/ 01 мая 2018

Ваша функция добавления ничего не связывает. Всякий раз, когда вы попадаете в блок else, trav равен NULL, и вы устанавливаете его равным новому узлу. Но вы никогда не связываете этот новый узел с предыдущим последним узлом.

Обычно trav будет иметь имя tail и будет указывать на последний элемент, чтобы вы могли связать новый элемент с текущим последним элементом.

Что-то вроде:

if(this->head==NULL && this->trav==NULL){
  cout<<"inside the if block"<<endl;
  this->head = new Node(data);
  this->trav = this->head;
}
else{
  cout <<"inside the else block"<<endl;
  this->trav->next = new Node(data);
  this->trav = this->trav->next;
}

Редактировать

ОП отметил, что trav это не , рассматриваемый как хвостовой указатель, а просто указатель для обхода списка.

Таким образом, ответ будет другим, так как код должен найти текущий хвост, используя цикл.

Что-то вроде:

if(this->head==NULL){
  cout<<"inside the if block"<<endl;
  this->head = new Node(data);
}
else{
  cout <<"inside the else block"<<endl;
  this->trav = this->head;
  while(this->trav->next)
  {
      this->trav = this->trav->next;
  }
  this->trav->next = new Node(data);
}

Однако, обратите внимание:

Если trav является «просто» указателем для обхода списка, нет никакой реальной цели сделать его членом List. Просто используйте локальную переменную внутри функций, которые должны пройти по списку.

Поскольку ваш код добавляет новые элементы в конец списка, часто очень полезно иметь указатель tail в качестве члена в List. Особенно, если список может содержать много элементов, и вы часто добавляете новые элементы.

Ваш код используется this->some_member во многих местах, где он не нужен. Избегайте этого, чтобы ваш код было легче читать.

0 голосов
/ 01 мая 2018

Проблема в вашем add() методе.

Замените это на

void add(int data){
 if(this->head == NULL){  /*If head is null, init it and trav node*/
  cout<<"inside the if block"<<endl;
  this->head = new Node(data); /*init head*/
  this->trav = this->head; /*point to head of list*/
} else{
  cout <<"inside the else block"<<endl;
  this->trav->next = new Node(data); /* add new elem to next of trav*/
  this->trav = this->trav->next; /*move trav to next node i.e. reset */
}
}
0 голосов
/ 01 мая 2018

Вы никогда не установите указатель next в Node.

Ваш код также имеет не идеальный отступ, использует необработанные указатели в местах, где вы можете использовать unique_ptr, не инициализирует переменные в конструкторах способом C ++, использует NULL вместо nullptr и выполняет неопределенное поведение, выпадая из дно без возврата значения в функции, объявленной для возврата значения (в частности, main ()).

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