Связанный список в 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 или что-то в этом роде.
[РЕДАКТИРОВАТЬ] Харун прав, вы отключите от следующей цепи. Только пред вы забыли.