-1

自分でキューを実装します。テストするときは、テール ポインターがヘッド ノードを指しているかどうかをテストすることで、キューが空のときにデキューが返されることを期待しています。ただし、ポイントが実際にヘッドを指している場合、ヘッドノードのアドレスと1つのポインターポイントは異なります。したがって、キューに何もない場合でも、キューは決してデキューを停止しません。これは私をとても混乱させます。これに関する提案はありますか?どうもありがとう。

//header
#ifndef QUEUE_H
#define QUEUE_H

struct node
{
int val;
struct node* next;

};

class queue
{
private:
    node head;
    node* tail;
public:
    queue();
    void enqueue(int val);
    void dequeue(int& holder, bool& v);
};





#endif
// queue.cpp
#include "queue.h"

using namespace std;
queue::queue()
{
    tail = &head;

}
void queue::enqueue(int val)
{
    node* tmp = new node;
    tmp->val = val;
    if(tail == &head)
    {
            tail = tmp;
            tmp->next = &head;
            head.next = tmp;
    }
    else
    {
            node* holder = head.next;
            head.next = tmp;
            tmp->next = &head;
            holder->next = tmp;
    }
}

void queue::dequeue(int& holder,bool& v)
{

    if(tail == &head)
   {
            v = false;
   }
    else
    {
            node* cur = tail;
            tail = tail->next;
            holder = cur->val;
            v = true;
            delete cur;

    }

}
//test.cpp
#include <iostream>
#include "queue.h"
using std::cout;
using std::endl;
int main()
{
int ary[] = {1,2,3,4,5};

queue myq;
for(int i = 0;i< sizeof(ary);i++)
{
    myq.enqueue(ary[i]);
}
int tmp;
bool flag;
for(int i = 0;i<=7;i++)
{
    myq.dequeue(tmp,flag);
    if(flag)
            cout<<"number is "<<tmp<<endl;
    else
            cout<<"queue empty"<<endl;
}
return 0 ;
}
4

2 に答える 2

0

正確な修正を提供することはできますが、それはまったく何も教えてくれません。それをコピーしてコードに貼り付け、別のことをするだけです。そこで、 &head の現在の値を表示するコード行を追加して、実際の問題を特定できるようにします...

次の行をエンキュー (関数の先頭) とデキューに追加します。

     std::cout << __FUNCTION__ << ": " << &head << std::endl;

関数の名前とアドレスをヘッドから出力します。(iostream も含める必要がある場合があります)

プリントアウト数に特に注意してください。

于 2013-01-26T21:50:11.427 に答える
0

以下の作業コード: (デバッガーの使い方を学ぶ)

#include <iostream>
using namespace std;
//header
#ifndef QUEUE_H
#define QUEUE_H

struct node {
    int val;
    struct node* next;

};

class queue {
private:
    struct node* head;
    struct node* tail;
public:
    queue();
    void enqueue(int val);
    void dequeue(int& holder, bool& v);
};

#endif

using namespace std;
queue::queue() {
    tail = NULL;
    head = NULL;

}
void queue::enqueue(int val) {
    node* tmp = new node;

    tmp->val = val;

    if (head == NULL && NULL == tail) {//No nodes Empty
        head = tail = tmp;
        tmp->next = NULL;

    }else if (tail == head) { //Single node
        tail = tmp;
        tmp->next = head;
        head->next = tmp;
    } else {
        tail->next = tmp;
        tmp->next = head;
        tail = tmp;
    }
}

void queue::dequeue(int& holder, bool& v) {
    if (NULL == tail || NULL == head) {
        v = false;
        return;
    } else if (tail == head) {// single node
        holder = head->val;
        delete head;
        head = NULL;
        tail = NULL;
        v = true;
    } else { //more than one node
        //Go to the last but one node and chop the tail
        node* cur = head;
        while (cur->next != tail)
            cur = cur->next;

        cur->next = head;
        holder = tail->val;
        delete tail;
        tail = cur;
        v = true;
    }
    return;
}

using std::cout;
using std::endl;
int main() {
    int ary[] = { 1, 2, 3, 4, 5 };

    queue myq;

    for (int i = 0; i < 5; i++) {
        myq.enqueue(ary[i]);
    }

    int tmp;
    bool flag;

    for (int i = 0; i <= 7; i++) {
        myq.dequeue(tmp, flag);
        if (flag) {
            cout << "number is " << tmp << endl;
        }
        else {
            cout << "queue empty" << endl;
        }
    }
    return 0;
}
于 2013-01-26T22:57:22.390 に答える