双端清单

时间:2011-10-09 13:00:07

标签: c++ linked-list

以下代码停止工作,显示空白屏幕,显示一个数字,然后输出代码停止工作的错误消息。

#include <iostream>
using namespace std;
class Link{
public:
  long ddata;
  Link *next;
  Link(long d){
    ddata=d;
  }
  void displaylin(){
    cout<<ddata<<"  "<<endl;
  }
};

class firstlast{
private :
  Link *first;
  Link * last;
public:
  firstlast(){
    first=NULL;
    last=NULL;
  }
  bool empthy(){
    return (first==NULL);
  }
  void insertfirst(long dd){
    Link *newlink=new Link(dd);
    if (empthy())
      last=newlink;
    newlink->next=first;
    first=newlink;
  }
  void insertlast(long dd){
    Link *newlink=new Link(dd);
    if ((empthy()))
      first=newlink;
    else
      last->next=newlink;
    newlink=last;
  }
  long deletefirst(){    //delete first link
    long temp=first->ddata;
    if (first->next==NULL)//only one item
      last=NULL;
    first=first->next;
    return temp;
  }
  void displayList(){
    cout<<"first -> last   "<<endl;
    Link *current=first;
    while(current!=NULL){
      current->displaylin();
      current=current->next;
    }
  }
};

int main(){
  firstlast *fl=new firstlast();
  fl->insertfirst(22);
  fl->insertfirst(44);
  fl->insertfirst(66);
  fl->insertlast(33);
  fl->insertlast(88);
  fl->insertlast(100);
  fl->deletefirst();
  fl->displayList();
  return 0;
}

我觉得某处是溢出,但我无法找到。 IDE One shows the output of my program.

2 个答案:

答案 0 :(得分:1)

问题在于insertlast(long)

中的这一行
newlink=last;

应该是:

last=newlink;

通过此更改,the output变为:

first -> last   
44  
22  
33  
88  
100  

编辑:正如@Jared指出的那样,您的代码会遭受内存泄漏。只要您使用newmalloc分配堆内存,但不使用相应的“免费”功能释放堆内存,就会发生这种情况。

new返回的每个指针都必须由delete完全释放一次。如果您未能调用delete,那么您的程序会泄漏内存。如果您多次调用delete以“双重释放”某个区域,那么您的程序将调用未定义的行为。

在此代码中:

  long deletefirst(){    //delete first link
    long temp=first->ddata;
    if (first->next==NULL)//only one item
      last=NULL;
    first=first->next;
    return temp;
  }

请注意first=first->next;会使您失去指向动态分配内存的指针。请记住,first已设置为new的结果,因此在使用指向动态分配内存的不同区域的指针覆盖delete first之前,需要first

此外,您需要添加到您的班级:

  1. 析构函数,用于释放未通过调用deletefirst()释放的所有内存。
  2. 复制构造函数,用于制作firstlast个实例的深层副本。
  3. 赋值运算符operator=(const firstlast& fl)的重载,它也会进行深层复制。

答案 1 :(得分:1)

首先,您的insertLast方法会导致内存泄漏,因为您实际上从未将新创建的链接的下一个指针连接到任何内容。你只需重新分配本地指针newlink,它会立即超出范围。后续的insertLast调用会将内存留在空间中。这也可能导致打印错误。

其次,你的deleteFirst方法实际上并没有删除任何东西,但留下了一个在内存中分配了new out的Link,而没有任何指向它的东西。另一个内存泄漏。