0

グラフ (グラフ理論から) の表現と変換を扱うプログラム。隣接リストと行列は、次の関数プログラムのメモリ エラーとコンパイラが指すメモリ エラーで終了するため、ベクトルの動的配列のように実装されます (ベクトルのベクトルではない理由を尋ねないでください)。孤立ベクトルの定義。

int vertex,edges;
vector<int> *adjacencyList,*adjacencyMatrix;

void listToAdMatrix(int vertexNumber, vector<int> *List, vector<int> *Matrix){
 int in=0,cont=0;
 for(int i=0;i<vertexNumber;i++){
  in=i;
  for(auto j=List[in].begin();j!=List[in].end();j++){
   for(int k=0;k<vertexNumber;++k){
    if(k==*j) Matrix[cont].push_back(1); 
    else Matrix[cont].push_back(0);
   }
   cont++;
  }
 }
}

//function call
//vertex(number) and ajacencyList are initialized

adjacencyMatrix=new vector<int>[vertex];
listToAdMatrix(vertex,adjacencyList,adjacencyMatrix);

コンパイラが指す STL の「エラーの原因」:

http://i51.tinypic.com/2dt0t9e.jpg


エラーメッセージ:

graph.exe の 0x001a543b で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xfdfdfe01。


隣接リストを埋めるために使用される fillList 関数:

void fillList(int vertexNumber, vector<int> *List){
    int input=0;
    for (int i=0;i<vertexNumber;i++){   
        int in=i;
        cout<<"Introduce adjacent vertexes for the vertex -"<<i+1<<"-:"<<endl;
        for(int j=0;j<vertexNumber;j++){
            std::cout<<i+1<<"-";
            std::cin>>input;
            if(input==0) break;
            List[i].push_back(input-1);
        }
    }
}

手がかりは大歓迎です。


4

3 に答える 3

0

1つの問題は、adjacencyListをまだ初期化していないことです。このコードによると、listToAdMatrixに入るときにガベージ(またはnull)を指している必要があります。これにより、List[in]にインデックスを作成しようとしたときにエラーが発生する可能性があります。

于 2010-10-21T11:53:13.747 に答える
0

問題が解決しました :

もう一度配列の外側を読みました.エラーは、マトリックス(動的配列)のベクトルをアドレス指定するために使用したcont変数にあり、配列の外側にあるときにインクリメントしました.whileステートメントを挿入することで問題が解決しました.回答ありがとうございました。

int vertex,edges;
vector<int> *adjacencyList,*adjacencyMatrix;

void listToAdMatrix(int vertexNumber, vector<int> *List, vector<int> *Matrix){
 int in=0,cont=0;
 for(int i=0;i<vertexNumber;i++){
  in=i;
  for(auto j=List[in].begin();j!=List[in].end();j++){
   while(cont!=vertexNumber){
     for(int k=0;k<vertexNumber;++k){
       if(k==*j) Matrix[cont].push_back(1); 
       else Matrix[cont].push_back(0);
     }
     cont++;
   }
  }
 }
}

//function call
//vertex(number) and ajacencyList are initialized

adjacencyMatrix=new vector<int>[vertex];
listToAdMatrix(vertex,adjacencyList,adjacencyMatrix);
于 2010-10-21T14:33:26.687 に答える
0

それadjacencyList[in].size()は常に頂点よりも小さいですか?jそれを確認するためにループの前にコードを置きます。現時点では、ダミー行とブレークポイントを配置して、それが発生するかどうかを確認する必要があります.

存在する場合は、adjacencyList が正しく初期化されていないか、これを処理する必要がある状況です。

また、 adjacencyList が length の配列に設定されていることを確認する必要がありvertexますが、それはより明白であるため、おそらくそうしています。

于 2010-10-21T12:11:55.840 に答える