C++中的分隔符、指针和结构

Deque, Pointers, and Structs in C++

本文关键字:指针 结构 分隔符 C++      更新时间:2023-10-16

给定这些数据成员:

private:
    struct DequeNode {                 
        Object item;
        DequeNode *next;
        DequeNode *prev;
    };
    DequeNode *front;
    DequeNode *back;
};

我很困惑数据成员的正面或背面是什么。前面只是一个指向DequeNode对象的指针吗? 所以前面不会有项目、下一个或上一个?

这是用于双类的实现。 这让我感到困惑,因为在它的 getFront 方法中,它返回 front->next。 我的印象是前面只是一个没有下一个成员的指针。

这是完整的标题:

#ifndef DEQUE_H
#define DEQUE_H
#include <iostream>
using namespace std;
template <class Object>
class Deque {
public:
    Deque();                                   // the constructor
    Deque(const Deque &rhs);                  // the copy constructor
    ~Deque();                                  // the destructor
     bool isEmpty() const;                      // checks if a deque is empty.
     int size() const;                          // retrieves # deque nodes
     const Object &getFront() const;            // retrieve the front node
     const Object &getBack() const;             // retrieve the tail node
     void clear();                              // clean up all deque entries.
     void addFront(const Object &obj);         // add a new node to the front
     void addBack(const Object &obj);          // add a new node to the tail
     Object removeFront();                      // remove the front node
     Object removeBack();                       // remove the tail node
     const Deque &operator=(const Deque &rhs); // assignment
private:
    struct DequeNode {                          // a deque node
        Object item;
        DequeNode *next;
        DequeNode *prev;
    };
    DequeNode *front;
    DequeNode *back;
};
#include "deque.cpp.h"
#endif

然后这是 cpp:

template <class Object>
Deque<Object>::Deque() {                          // the constructor
    front = back = NULL;
}
template <class Object>
Deque<Object>::Deque(const Deque &rhs) {         // the copy constructor
    front = back = NULL;
    *this = rhs;
}
template <class Object>
Deque<Object>::~Deque() {                         // the destructor
    clear();
}
template <class Object>
bool Deque<Object>::isEmpty() const {             // check if a deque is empty
    return front == NULL;
}
template <class Object>
int Deque<Object>::size() const {                 // retrieves # deque nodes
    int i = 0;
    for (DequeNode *ptr = front; ptr != NULL; ptr = ptr->next) // traverse que
    {
        ++i;
    }
    return i;
}
template <class Object>
const Object &Deque<Object>::getFront() const {   // retrieve the front node
    if (isEmpty())
        throw "empty queue";
    return front->item;
}
template <class Object>
const Object &Deque<Object>::getBack() const {    // retrieve the tail node
    if (isEmpty())
        throw "empty queue";
    return back->item;
}
template <class Object>
void Deque<Object>::clear() {          // clean up all entries.
    while (!isEmpty())                 // dequeue till the queue gets empty.
        removeFront();
}
template <class Object>
void Deque<Object>::addFront(const Object &obj) {// add a new node to  front Implement the function body.
}
template <class Object>
void Deque<Object>::addBack(const Object &obj) { // add a new node to tail
                                             // Implement the function body.
}
template <class Object>
Object Deque<Object>::removeFront() {  // remove the front node
                                   // Implement the function body.
}
template <class Object>
Object Deque<Object>::removeBack() {   // remove the tail node
                                   // Implement the function body.
}
template <class Object>
const Deque<Object> &Deque<Object>::operator=(const Deque &rhs) { // assign
    if (this != &rhs) { // avoid self assignment
        clear();
        for (DequeNode *rptr = rhs.front; rptr != NULL; rptr = rptr->next)
            addBack(rptr->item);
    }
    return *this;
}

试图只插入一个对象以确保我正确使用箭头运算符,但这一直给我一个分段错误:

template <class Object>
void Deque<Object>::addFront(const Object &obj) {// add a new node to  front Implement the function body.
     if (isEmpty())  // If the deque is empty, just throw the item in there.
    {
         front->item = obj;
         front->next = NULL;    
         front->prev = back;
         back->next = front;    
         back->item = obj;
         back->prev = NULL;         
     }
     else
     {
         // Not inserting on an empty list.
     }
}

但是我一直遇到分段错误。 通过添加打印语句,它似乎在"front->item = obj;"行失败有人可能知道为什么这是不正确的吗?

正面和背面分别是你的deque的第一个指针和最后一个指针。

注释中提到的方法 getFront() 提供了一种访问其中数据(项目)的方法。

但它并不是真正的deque,它看起来更像是一个队列,因为没有定义迭代器(也许你为了提交的清晰度而删除了它们)。

是的,你是对的,因为"front"是"DequeNode"类型的指针,所以"front"只是指向"DequeNode"类型的对象。这就是为什么你可以访问由"front"指针指向的"DequeNode"类型的对象的任何成员。

在第二个问题上,您遇到分段错误,这只是因为您尝试访问"front",当 deque 为空时,它持有 NULL 值。要从"front"获取某些内容,当双端不为空时,它应该指向双端面中的第一个对象/节点(类型为"DequeNode")。

关于你对getFront()方法的第三个疑问。因此,getFront() 方法的目的是获取队列中前端节点的数据部分,在本例中为"item"。

template <class Object>
const Object &Deque<Object>::getFront() const {   // retrieve the front node
    if (isEmpty())
        throw "empty queue";
    return front->item;
}