1

我只想创建双向链表并检查它是否为空。请说出错误。显示的错误是:在函数 empty() 中,头部和尾部超出范围。在类 Dict 中定义为结构时不起作用。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

class node
{   public:
    string data;
    node* next;
    node* prev;
    friend class Dict;
};

class Dict
{   public:
    bool empty();
    Dict();
    node* head;
    node* tail;

};

Dict::Dict()
{   head=new node;
    tail= new node;
    head->next=tail;
    tail->prev=head;

}

bool empty()
{
    return head->next==tail;
}

int main()
{
    Dict my_list;
    if(my_list.empty())
        {cout<<"empty list"<<endl;}
    else
        {cout<<"Not empty"<<endl;}
}
4

3 回答 3

2

我认为你只需要在你的类中包含空方法:

bool Dict::empty()
{
    return head->next==tail;
}
于 2013-08-26T13:51:20.343 回答
1

好吧,首先,您不会创建一个空列表,因为您的构造函数会创建新节点。

在您的“空”方法中,您试图引用在 Dict 类中定义的“头”变量

可能的修复:

Dict::Dict()
{
    head = tail = null;
}

bool Dict::empty()
{
    return head == null;
}
于 2013-08-26T13:39:15.970 回答
0
  • 您需要做几件事。首先你没有包含你的node.cpp,只有node.h,你的节点构造函数是做什么的?在 Dict() 构造函数上,您应该调用节点构造函数,即 node() 这会将节点类初始化为节点构造函数所做的任何事情,即将变量字符串数据设置为某个输入值。
  • empty() 输出是什么。根据你的定义。empty() 方法正在做同样的事情,检查 head->next 是否与 tail 位于同一内存位置。我t think that不是你想要的,因为如果你调用 dict() 构造函数,它总是会返回 true。如果你不调用 dict() 它将返回 false 或者你甚至可能得到一个句柄错误,“空引用”。
  • 要创建节点列表或链表,您需要定义 ADD 方法,该方法应该能够添加新节点或将当前节点链接到下一个节点。
  • 您还需要定义删除节点,即删除或删除任何给定节点。这可能是您迄今为止编写的最难的方法。
于 2013-08-26T14:45:19.527 回答