2017-06-23 20 views
0

私は知りません。しかし、プログラムを実行すると、 "priorityQLinkedList :: dequeue()"メソッド内でブレークポイントがトリガーされます。誰かがなぜこれが当てはまるのかを伝えて、それを修正する方法を提案してもらえますか?私はブレークポイントを取得していますし、私はC++でリンクリストを使って、プライオリティキューを実装しようとしていますなぜ

コード:あなたのdequeue()方法で際立って

#include <iostream> 
#include <cstring> 
#include <iomanip> 

using namespace std; 

struct DAT 
{ 
    int id; 
    char fullname[50]; 
    double savings; 
}; 

struct NODE 
{ 
    DAT data; 
    NODE *N; 
    NODE *P; 
    NODE(const int i, const char *f, const double s) 
    { 
     data.id = i; 
     strcpy_s(data.fullname, f); 
     data.savings = s; 
     N = NULL; 
     P = NULL; 
    } 
}; 

class priorityQLinkedList 
{ 
private: 
    NODE *front; 
    NODE *back; 
public: 
    priorityQLinkedList() { front = NULL; back = NULL; } 
    ~priorityQLinkedList() { destroyList(); } 
    void enqueue(NODE *); 
    NODE* dequeue(); 
    void destroyList(); 
}; 

void priorityQLinkedList::enqueue(NODE *n) 
{ 
    if (front == NULL) { 
     front = n; 
     back = n; 
    } 

    else { 
     NODE *temp = front; 
     if (n->data.id > temp->data.id) 
     { 
      front->P = n; 
      n->N = front; 
      front = n; 
     } 
     else 
     { 
      //search for the posistion for the new node. 
      while (n->data.id < temp->data.id) 
      { 
       if (temp->N == NULL) { 
        break; 
       } 
       temp = temp->N; 
      } 

      //New node id's smallest then all others 
      if (temp->N == NULL && n->data.id < temp->data.id) 
      { 
       back->N = n; 
       n->P = back; 
       back = n; 
      } 

      //New node id's is in the medium range. 
      else { 
       temp->P->N = n; 
       n->P = temp->P; 
       n->N = temp; 
       temp->P = n; 
      } 
     } 
    } 
} 

NODE* priorityQLinkedList::dequeue() 
{ 
    NODE *temp; 

    //no nodes 
    if (back == NULL) { 
     return NULL; 
    } 

    //there is only one node 
    else if (back->P == NULL) { 
     NODE *temp2 = back; 
     temp = temp2; 
     front = NULL; 
     back = NULL; 
     delete temp2; 
     return temp; 
    } 

    //there are more than one node 
    else { 
     NODE *temp2 = back; 
     temp = temp2; 
     back = back->P; 
     back->N = NULL; 
     delete temp2; 
     return temp; 
    } 

} 

void priorityQLinkedList::destroyList() 
{ 
    while (front != NULL) { 
     NODE *temp = front; 
     front = front->N; 
     delete temp; 
    } 
} 

void disp(NODE *m) { 
    if (m == NULL) { 
     cout << "\nQueue is Empty!!!" << endl; 
    } 
    else { 
     cout << "\nID No. : " << m->data.id; 
     cout << "\nFull Name : " << m->data.fullname; 
     cout << "\nSalary : " << setprecision(15) << m->data.savings << endl; 
    } 
} 

int main() { 
    priorityQLinkedList *Queue = new priorityQLinkedList(); 

    NODE No1(101, "Qasim Imtiaz", 567000.0000); 
    NODE No2(102, "Hamad Ahmed", 360200.0000); 
    NODE No3(103, "Fahad Ahmed", 726000.0000); 
    NODE No4(104, "Usmaan Arif", 689000.0000); 

    Queue->enqueue(&No4); 
    Queue->enqueue(&No3); 
    Queue->enqueue(&No1); 
    Queue->enqueue(&No2); 

    disp(Queue->dequeue()); 
    disp(Queue->dequeue()); 
    disp(Queue->dequeue()); 
    disp(Queue->dequeue()); 
    disp(Queue->dequeue()); 

    delete Queue; 
    return 0; 
} 
+1

は、私を修正しますが、ノードDELETE' 'あなた場合は、キューから取り出され、その後、その後、「死んだ」を取り戻すことになるため、発信者と同じ、考えていない。この問題を引き起こす、へのポインタを返すことがポインタ? –

+0

@TimBiegeleisen何が起こっているのですか?答えは –

+0

@AndersKです。私は以下の答えを試みました。私はこれをうまく処理する方法は見ませんでしたが、確かに 'dequeue()'はターゲットノードを削除するべきだと思います。私の答えは、 'NODE'のコピーを作成して呼び出し元に戻すことでした。しかし、呼び出し側はある時点で 'delete'を呼び出さなければなりません。 –

答えて

1

一つの問題は、あなたがNODEポインタにdeleteを呼び出し、その後、呼び出し側に、この削除されたポインタを返すようにしようとしているということです。これにより、dequeue()自体、または実際のライブNODEオブジェクトへのポインタを戻していると考えている呼び出し側のエラーが発生する可能性があります。

一つの潜在的修正がデキューさNODEのコピーを作成することです。あなたはまだあなたのリストからターゲットを削除しますが、呼び出し側は有効なポインタを返します。これは後で解放することができます。

NODE* priorityQLinkedList::dequeue() 
{ 
    NODE *temp; 

    // no nodes 
    if (back == NULL) { 
     return NULL; 
    } 

    NODE *temp2 = back; 
    temp = new NODE(temp2->data.id, temp2->data.fullname, temp2->data.savings); 

    // there is only one node 
    else if (back->P == NULL) { 
     front = NULL; 
     back = NULL; 
     delete temp2; 
     return temp; 
    } 

    // there are more than one node 
    else { 
     back = back->P; 
     back->N = NULL; 
     delete temp2; 
     return temp; 
    } 
} 
+0

'priorityQLinkedList'がノードポインタを所有していると仮定しています。それはしません。それらは 'enqueue'に渡され、' enqueue'の呼び出し元が所有します。この解決策はOPの問題を解決しません。 – 1201ProgramAlarm

+0

@ 1201ProgramAlarm私の答えを編集して修正してください。私はC + +の達人ではないが、削除されたポインタを返すと私に匂いがする。私はC++についてもっと知りたいと思っています。 –

1

あなたはpriorityQLinkedListが所有していないことをdequeueにポインタを削除しているので、それらを削除しても安全であるかどうかは知りません。

この場合、enqueueに渡されるノードポインタはローカルのスタックベースの変数のアドレスであり、newによって割り当てられていないためではありません。

このコードの修正は、への呼び出しをdequeueに削除することです。しかし、enqueueに渡されたノードが動的に割り当てられるように変更された場合は、それを処理するために何かを追加する必要があります。

1

のstrcpyにstrcpy_sを変更1.Firstは、構造体NODEです。

削除の2.Instead(TEMP2)がtemp2--を使用します。

//no nodes 
if (back == NULL) { 
    return NULL; 
} 

//there is only one node 
else if (back->P == NULL) { 
    NODE *temp2 = back; 
    temp = temp2; 
    front = NULL; 
    back = NULL; 
    temp2--; 
    return temp; 
} 

//there are more than one node 
else { 
    NODE *temp2 = back; 
    temp = temp2; 
    back = back->P; 
    back->N = NULL; 
    temp2--; 
    return temp; 
} 

これが問題を解決することを望みます。私は誤解される場合

関連する問題