学习用C ++实现链表列表

时间:2015-04-10 05:29:33

标签: c++ list hyperlink queue

我想在C ++中使用队列实现链表。这是我的班级:

class LinkedListQueue
{
public:
    LinkedListQueue();
    void enQueue(int x);
    void deQueue();
    int peekFront();
    int peekBack();

private:
    struct Node
    {
        int data;
        Node *next;
    };
    Node *head;
    Node *tail;
};


LinkedListQueue::LinkedListQueue()
{
    tail = 0;
    head = tail;
}
void LinkedListQueue::enQueue(int x)
{
    struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->next = tail;
    tail = newNode;
    if(head != NULL)
    {
      head = tail->next;
    }
}
void LinkedListQueue::deQueue()
{
    struct Node* newTail = tail->next;
    delete m_tailPtr;
    tail = newTail;
}
int LinkedListQueue::peekFront()
{
    if(tail != NULL)
  {
    return tail->data;
  }
  else
  {
    return head->data;
  }
}
int LinkedListQueue::peekBack()
{
  if(head != NULL)
  {
    return head->data;
  }
  else
  {
    return tail->data;
  }
}

我认为除了peekFront之外,我的功能正在发挥作用。我想保持实现和样式相同,只需修复错误。请帮忙。

4 个答案:

答案 0 :(得分:1)

您没有解释错误是什么,但如果您使用空peekFront实例访问LinkListQueue,则tail指针将为NULL。取消引用NULL指针(如peekFront所示)将导致 未定义的行为

可能还有其他调用序列也涉及使用peekFront NULL指针调用tail

修改

您也不应该将mallocdelete混合。如果您坚持,请将newdelete一起使用(或mallocfree一起使用。

答案 1 :(得分:1)

  

您无法解释错误是什么,但如果您使用空的LinkListQueue实例访问peekFront,则尾指针将为NULL。取消引用NULL指针(如peekFront所做的那样)将导致未定义的行为。

LinkedListQueue::peekBack()相同的情况。似乎head在构造函数中设置为0且从未修改过。

修改

将第一个元素添加到列表时,您可以检查是否head == tail == 0。在这种情况下,如果第一个元素headtail应该指向它,则新添加的元素。

修改

首先:添加第一个节点到列表必须以不同的方式处理下一个元素,它应该将headtail都设置为新添加的元素。可以这样做:

void LinkedListQueue::enQueue(int x)
{
    struct Node* newNode = new Node;

    newNode->data = x;
    newNode->next = 0;

    //first element in list
    if( head == 0 )
    {
        head = newNode;
    }
    else
    {
        tail->next = newNode;
    }
    tail = newNode;
}

第二件事:列表是单向的(每个节点包含到next的链接,没有到前一节点的链接)。这意味着出列必须遍历从head开始的所有节点,以在next之前修改节点的tail链接:

void LinkedListQueue::deQueue()
{
    struct Node* node = head;

    // single element in list
    if ( node == tail && node != 0 )
    {
        delete node;
        tail = 0;
        head = 0;

        return;
    }

    while( node->next != tail )
    {
        node = node->next;
    }

    delete tail;
    node->next = 0;
    tail = node;
}

修改

假设peekFront从第一个节点获取节点数据:

int LinkedListQueue::peekFront()
{
    if( head == NULL ) 
    {
        throw out_of_range("trying to peek data from empty list");
    }

    return head->data;
}

peekBack从最后一个节点获取节点数据:

int LinkedListQueue::peekBack()
{
    if( tail == NULL ) 
    {
        throw out_of_range("trying to peek data from empty list");
    }

    return tail->data;
}

答案 2 :(得分:0)

在初始化为0后永远不会设置头。当head = tail,添加第一个项目或删除最后一个项目时,你也缺乏处理案例的逻辑。

答案 3 :(得分:0)

void LinkedListQueue::enQueue(int x)
{
    struct Node* newNode = (struct Node*) malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->next = tail;
    tail = newNode;  

    if( head == null )
    {
       head = newNode;
    }
}