0

優先度キュー挿入 dev c++ IDE を実装しようとしています)、つまり優先度 > 新しいノードの優先度を持つノードの前。ユーザーからの挿入はコマンドプロンプトで発生するようですが、表示機能は最初のノードのみを出力します。他のキュー要素が表示されないのはなぜですか? 最初に挿入されていないのではないかと思います.10,20,30を挿入してから削除すると..空のキューが出力されます..キューには10しかなかったので..なぜですか?提案してください.

注: ここでは、delete 関数と main 関数をコードに含めていませんが、プログラムには含まれています。明らかに、実行時例外は発生しません。コンパイルは正常に動作します。しかし、望ましい出力はありません。

#include<iostream>
using namespace std;

typedef struct node{ //template would enable generic datatype
        int info,prn;
        node * link;
}node;

node * start = 0;
int item,pri;



    void insert(int item, int pri){
     node * newnode = new node;
     newnode-> info = item;
     newnode-> prn = pri;

     if(start == 0){//explicit check in insert if start is NULL.
              start = newnode;
              newnode->link = 0;
     }
     /*When you first run the program, start = 0 or NULL. You then say prev = start, 
so as a result prev = NULL. So when you try to access prev->link, there's an access violation.*/
     else{ 
          node * prev= start;
          node * temp = prev->link;
          while (temp!= 0){
                if(temp->prn > newnode->prn){
                        newnode -> link = prev -> link;
                        prev -> link = newnode;
                break;
                } 
                else{
                     if( temp->link == 0){
                              temp -> link = newnode;
                              newnode->link = 0;
                     break;
                     }
                } 
           prev = prev->link;                    
          }
     }
}
void display(){
     if(start == 0)
              cout<<"Empty priority queue\n";
     else{
          cout<<("The Contents of the List are: ");
          node *temp = start;   
          while(temp!=NULL){   //if we do while temp->link!=NULL, then last node won't print
                               cout<< temp->info;
                               cout<<" ---> ";
                               temp = temp->link;
          }
     }             
}
4

2 に答える 2

1

挿入が初めて呼び出されたとき、startは0になりますが、それでもprevに割り当てます。次の行では、呼び出したエラーが発生するprev->linkため、NULLでメソッドを呼び出すとc ++がクラッシュします(これにより、未定義の動作が呼び出されます)。startがNULLの場合は、挿入に明示的なチェックを追加する必要があります。

于 2013-03-20T09:44:18.477 に答える
1

プログラムを初めて実行するときは、start = 0 または NULL に設定します。次に prev = start と言うと、結果として prev = NULL になります。そのため、prev->link にアクセスしようとすると、アクセス違反が発生します。

于 2013-03-20T09:45:06.300 に答える