我想在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之外,我的功能正在发挥作用。我想保持实现和样式相同,只需修复错误。请帮忙。
答案 0 :(得分:1)
您没有解释错误是什么,但如果您使用空peekFront
实例访问LinkListQueue
,则tail
指针将为NULL
。取消引用NULL
指针(如peekFront
所示)将导致 未定义的行为 。
可能还有其他调用序列也涉及使用peekFront
NULL
指针调用tail
。
您也不应该将malloc
与delete
混合。如果您坚持,请将new
与delete
一起使用(或malloc
与free
一起使用。
答案 1 :(得分:1)
您无法解释错误是什么,但如果您使用空的LinkListQueue实例访问peekFront,则尾指针将为NULL。取消引用NULL指针(如peekFront所做的那样)将导致未定义的行为。
与LinkedListQueue::peekBack()
相同的情况。似乎head
在构造函数中设置为0
且从未修改过。
修改强>
将第一个元素添加到列表时,您可以检查是否head == tail == 0
。在这种情况下,如果第一个元素head
和tail
应该指向它,则新添加的元素。
修改强>
首先:添加第一个节点到列表必须以不同的方式处理下一个元素,它应该将head
和tail
都设置为新添加的元素。可以这样做:
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;
}
}