这次我正在研究链接列表。我还没有掌握内存分配的概念等。我被赋予了执行此链接列表应用程序的任务,该应用程序将添加和删除节点。这两个函数都将节点放在TAIL上。之后,我必须以前进和后退的顺序显示节点列表。我设法得到了前进和后退的命令。但是,在删除几个节点后,正向顺序显示新节点,但向后顺序似乎显示的不是必要的。知道为什么我倒退时获得的价值超过了所需的价值吗?我假设它与内存分配有关,因此我遇到了这个问题。
根据我们的教授的指示,我们只允许更改 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/
答案 0 :(得分:0)
您删除了自己的节点,但是不要将它们从链中取消链接。
在您的删除方法中,如果删除某个节点,请将其上一个指向其上一个节点。将下一个上一个点指向下一个。并在头尾进行适当的调整。
由于您只进行了删除操作,系统会回收已删除节点的内存,并将其用于其他内容,从而为您提供随机的&#34;如果将其解释为节点,则为值。
顺便说一句,除非你真的只删除节点,否则不要删除你的方法。
程序中的其他节点可能还有其他引用。 事实上,节点位于列表中,并不会使列表成为节点的所有者,尽管通过编程方式使得节点无法位于多个列表中。但仍有一个不同的变量可能会保留其地址。你可能应该调用你的方法removeAndDelete或类似的东西。
[编辑] Harun是对的,你从下一个连锁店取消链接。只有你忘记的上一个。