Связанный список в C++, Вывод длинных значений

На этот раз я работаю над связанным списком. Мне еще предстоит понять концепцию распределения памяти и т. Д. Мне было поручено выполнить это приложение со связанным списком, которое добавит и удалит узел. Обе эти функции разместят узел на хвосте. После этого я должен отобразить список узлов в прямом и обратном порядке. Мне удалось получить прямой и обратный порядок на месте. Однако после удаления нескольких узлов прямой порядок отображает новые узлы, но обратный порядок, кажется, отображает больше, чем необходимо. Любая идея, почему я получаю больше значений, чем необходимо при движении назад? Я предполагаю, что это имеет отношение к Распределению памяти, следовательно, почему у меня есть эта проблема.

По указанию нашего профессора нам разрешено изменять только list.cpp. ничего более. Вот вывод консоли:

 //Application crashes, when trying to remove the last node, WHY?

Печать в порядке возрастания (вперед):

3 10 1 7 9 12

Печать в порядке убывания (назад):

12 9 7 1 10 3

На этот раз он полностью вылетает из приложения, когда я включаю remove(12), который является последним узлом?

Вот код:

main.cpp

#include "list.cpp"

int main()
{
  LinkedList aList;

  aList.add(3);
  aList.add(10);
  aList.add(1);
  aList.add(7);
  aList.add(9);
  aList.add(12);
  aList.printAscending();
  aList.printDescending();
  aList.remove(3);
  aList.remove(1);
  aList.remove(7);
  aList.remove(12); //Application crashes here.
  aList.printAscending();
  aList.printDescending();

  return 0;
}

list.h

include <iostream>
using namespace std;

class LinkedList
{
private:
  struct Node
  {
    int data; //store actual data value
    Node * next; //contains the address of next node.
    Node * prev;
  };
  Node * head, * tail;
public:
  LinkedList();
  ~LinkedList();
  bool add(int val); // You may add nodes to the head or tail.
  bool remove(int val);
  void printAscending() const;  // print the list in forward order.
  void printDescending() const; // print the list in reverse order.
};

Основная проблема здесь: list.cpp

#include "list.h"

LinkedList::LinkedList(){
  head = NULL;  //Head should always point to the first node.
  tail = NULL;  
}

LinkedList::~LinkedList(){
  delete head;
  delete tail;
}

bool LinkedList::add(int val){
  Node * newNode = new Node; //Creating a temp node struct pointer
  newNode->data = val; //setting the val parameter = to the tempNode data
  newNode->next = NULL; 
  newNode->prev = NULL;

  if(head == NULL && tail == NULL){ 
    head = newNode;
    tail = newNode;
  }else{
    newNode->prev = tail;
    tail->next = newNode;
    tail = newNode;
    newNode = NULL;
  }
  return true;
}

bool LinkedList::remove(int val){
  Node * newNode = head;
  Node * newPrev = NULL;
  Node * newNext = NULL;

  if(newNode == NULL)
    std::cout << "There are no Nodes to remove. Try adding some!" << std::endl;

  if(newNode->data == val){
    if(newNode != NULL){
        head = head->next;
        head->prev = NULL;
        delete newNode;
    }
  }else{
    while(newNode != NULL && newNode->data != val){
        newNode = newNode->next;
    }
    if(newNode != NULL){
        newNext = newNode->next;
        newPrev = newNode->prev;
        newNext->prev = newPrev;
        newPrev->next = newNext;
        delete newNode;
    }else{          
        newPrev = newNode->prev;
        delete newNode; 
        newPrev->next = NULL;

    }
  }
  return true;
}

void LinkedList::printAscending() const{
  std::cout << "Printing in Ascending Order (forward):" << std::endl;
  Node * newNode = new Node;
  newNode = head;
  while(newNode != NULL){
    std::cout << newNode->data << " ";
    newNode = newNode->next;
  }
  std::cout << std::endl;
}
void LinkedList::printDescending() const{
  std::cout << "Printing in Descending Order (backward):" << std::endl;
  Node * newNode = new Node;
  newNode = tail;
  while(newNode != NULL){
    std::cout << newNode->data << " ";
    newNode = newNode->prev;
  }
  std::cout << std::endl;
}

Не уверен, что мне разрешено связывать другие сайты, но вот источники, на которые я смотрел, спасибо им: 1. https://www.youtube.com/watch?v=M7OoiXJCD_E 2. http://www.cprogramming.com/c++book/

1 ответ

Вы удаляете свои узлы, но не отсоединяете их от цепочки.

В вашем методе удаления, если вы удаляете узел, сделайте предысторию его следующей точкой после его предыстории. Сделайте следующий из его предыдущей точки к следующему. И сделать соответствующие приспособления на голове и хвосте.

Поскольку вы делаете только удаление, память вашего удаленного узла восстанавливается системой и полностью используется для чего-то другого, что дает вам "случайное" значение, если вы интерпретируете его как узел.

Кстати, не вызывайте свой метод remove, если только вы действительно не удаляете, а не удаляете, узел.

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

[РЕДАКТИРОВАТЬ] Харун прав, вы отключите от следующей цепи. Только пред вы забыли.

Другие вопросы по тегам