当前位置: 首页 > 知识库问答 >
问题:

链表排队和出列

阎宝
2023-03-14

对于使用c实现的链表队列,我的入队列和出队列有点问题。我的老师说模板是禁止使用的,我不能改变他给我们的公共和私人功能。我总是遇到一个分割错误。我真的不明白我做错了什么。我还包括了header、enqueue和dequeue函数。

const int MAX_STRING = 6;

typedef char Element300[MAX_STRING + 1];

class Queue300
{

    public:
        Queue300();
        Queue300(Queue300&);
        ~Queue300();
        void enQueue300(const Element300);
        void deQueue300(Element300);
        void view300();

    private:
        struct Node300;
        typedef Node300 * NodePtr300;
        struct Node300
        {
            Element300 element;
            NodePtr300 next;
        };
        NodePtr300 front, rear;
};
void Queue300::enQueue300(const Element300 input)


{
    NodePtr300 temp = NULL;

    temp = new (std::nothrow) Node300;

    if (temp == NULL)
    {
        cerr << "The queue is full, could not add(enqueue) any more elements." << endl;
    }

    else if (front == NULL && rear == NULL)
    {
        strcpy(temp->element, input);
        rear = temp;
        rear->next = NULL;
        front = rear;
        temp = NULL;
    }

    else
    {
        strcpy(temp->element, input);
        temp = rear->next;
        rear = temp;
        rear->next = NULL;
        temp = NULL;
    }
}
void Queue300::deQueue300(Element300 input)



{
    NodePtr300 temp = NULL;

    if (rear == NULL && front == NULL)
    {
        cerr << "The queue is already empty, could not delete(dequeue) any more elements." << endl;
    }

    else if (front == rear)
    {
        strcpy(temp->element, input);
        temp = front;
        delete temp;
        temp = NULL;
        front = NULL;
        rear = NULL;
    }

    else
    {
        strcpy(temp->element, input);
        temp = front;
        front = front->next;
        temp->next = NULL;
        delete temp;
        temp = NULL;
    }
}

共有2个答案

姚煜
2023-03-14

让我们来看看Enqueue:

    if (temp == NULL)
    {
        ...
    }
    else if (front == NULL && rear == NULL)
    {
        ...
    }
    else
    {
        strcpy(temp->element, input); // copy input into temp->element

        // temp points to rear->next (it is always NULL, isn't it?)
        // we lost the Node300 previously pointed by temp.
        temp = rear->next; 

        // rear points to the same location as temp (NULL)
        rear = temp;

        // rear->next: dereferencing NULL /!\
        rear->next = NULL;

        temp = NULL;
    }

ASCII艺术时间。这是在加入之前:

  REAR -------------------
                         |
                         v
          [0]--> ... -->[N]-->NULL
           ^
  FRONT ---|

您分配一个节点[X],由temp引用:

temp --> [X]

REAR的下一个必须指向同一个节点:

REAR
 |   
 v
[N] --> [X]
         ^
         |
        temp

然后,后部必须更新为参考[X]。就指针操作而言,您甚至不需要temp指针,但让我们保留它,因为您正在检查之前是否正确分配了节点,这很好。

rear->next = temp;
rear = temp;       // or rear = rear->next;
temp->next = NULL; // or rear->next = NULL;

还要注意,您执行的是strcpy(temp-

杜茂
2023-03-14

在排队中,当您说“temp=rear”时-

将新节点添加到链接列表中时,通常最好先在新节点中设置指针:

temp->next = null;
rear->next = temp;
rear=temp;

还有:

>

出列的strcpy走错了路

为了防止缓冲区溢出,您应该真正使用strncpy而不是strcpy,然后确保目标以null结尾,因为元素应该是字符串

 类似资料:
  • 我使用的参考资料如下: 出于效率考虑,我们选择队列的前面位于列表的开头,队列的后面位于列表的末尾。这样,我们从头部移除,并在尾部插入。 我想知道为什么在头部插入并在尾巴上移除会不好?这是因为在单链表中,删除尾节点并不容易,因为您必须访问之前的节点,而在单链表中执行此操作的唯一方法是从头开始?

  • 我有一个简单的场景,有两个线程,第一个线程永久读取一些数据,并将这些数据排入队列。第二个线程首先从队列中查看单个对象,并进行一些条件检查。如果这些都是好的,单个对象将被出列并传递给一些处理。 我尝试过使用< code>ConcurrentQueue,这是一个简单队列的线程安全实现,但是这个队列的问题是所有调用都被阻塞了。这意味着,如果第一个线程正在将一个对象入队,第二个线程就不能查看对象或将其出队

  • 我很难理解linkedlist队列的enqueue方法的代码。我理解dequeue()、isEmpty()、First()和size()。首先,这里有一个LinearNode类来创建新的节点对象: 下面是Enqueue方法 在此编辑包含Enqueue方法的LinkQueue类:

  • 我得到了这些结构声明,以便实现使用循环链表的队列集合。 我试图创建一个函数,它将以指定的值排队(将其追加到队列的后面),我需要考虑队列为空和队列有一个或多个元素的两种情况。这是我到目前为止的代码: 这段代码给了我一个运行时错误,所以我不确定出了什么问题。在代码中,我假设队列-

  • 我有一个通用的链表,目前由int组成,我想在默认情况下按升序排序,然后切换一个布尔值,按降序排序。我该怎么做?

  • 说明 获取当前所有排队号码列表 请求地址 http://api.dc78.cn/Api/wwlist 请求方式 GET 请求参数 URL参数 描述 无 POST参数 描述 无 返回 { "status": 1, "name": "凤凰广场店", "list": [ { "id": "8", "time": "2014-11-26 11:42:12", "type": "C", "num": "C0