一个处理图形(来自图论)表示和转换的程序。邻接列表和矩阵的实现类似于动态矢量数组(不要问为什么不是矢量矢量)以用于以下函数程序退出时存储器错误和编译器指向孤立矢量定义。
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);
}
}
}
欢迎任何线索。
答案 0 :(得分:0)
一个问题是你还没有初始化adjacencyList。根据这段代码,当它进入listToAdMatrix时应该指向garbage(或null)。当尝试索引到List [in]时,这会导致错误。
答案 1 :(得分:0)
你确定adjacencyList[in].size()
总是小于顶点吗?将代码放在j
循环之前以检查它。现在你只需要设置一条虚线和一个断点,看它是否会发生。
如果确实如此,那么adjacencyList会被错误地初始化,或者这是你需要处理的情况。
您还需要确保adjacencyList设置为长度为vertex
的数组,但这更明显,所以您可能正在这样做。
答案 2 :(得分:0)
解决问题:
我再次读到一个数组之外。错误出现在 cont 变量中,我用它来解决矩阵(动态数组)中的向量,当它到达外面时递增它通过插入while语句来解决array.Problem。谢谢大家的答案。
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);