C ++中的链接列表,输出长值

时间:2017-08-19 07:39:44

标签: c++ linked-list doubly-linked-list

这次我正在研究链接列表。我还没有掌握内存分配的概念等。我被赋予了执行此链接列表应用程序的任务,该应用程序将添加和删除节点。这两个函数都将节点放在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/

1 个答案:

答案 0 :(得分:0)

您删除了自己的节点,但是不要将它们从链中取消链接。

在您的删除方法中,如果删除某个节点,请将其上一个指向其上一个节点。将下一个上一个点指向下一个。并在头尾进行适当的调整。

由于您只进行了删除操作,系统会回收已删除节点的内存,并将其用于其他内容,从而为您提供随机的&#34;如果将其解释为节点,则为值。

顺便说一句,除非你真的只删除节点,否则不要删除你的方法。

程序中的其他节点可能还有其他引用。 事实上,节点位于列表中,并不会使列表成为节点的所有者,尽管通过编程方式使得节点无法位于多个列表中。但仍有一个不同的变量可能会保留其地址。你可能应该调用你的方法removeAndDelete或类似的东西。

[编辑] Harun是对的,你从下一个连锁店取消链接。只有你忘记的上一个。