二维动态数组C ++显示问题

| 我已经读过2D动态数组,但是由于该程序无法正常工作,因此我显然还没有完全了解它。该程序似乎在于显示数组。 输入文件是一个文本文件,第一行有V和E,它们之间有一个\'tab indent \'。输入顶点位于下一行,并再次在每行上加上新的缩进选项卡。在DevCpp上说存在分段错误。任何帮助将不胜感激。谢谢。
#include <iostream>
#include <fstream>

using namespace std;

#define maxV 100
#define unseen 0

typedef int Vertex;

class Graph {
private:
   int V, E;
   int**adj;

public:
    Graph(char filename[]);
    void display();
};

// constructor ask you for file name
Graph::Graph(char fname[])  {
    Vertex u,v;
    int j;

    ifstream f;
    f.open(fname, ios::in);
    if(!f) {
       cout << \"\\nError: Cannot open file\\n\";
       return;
    }

    //Input number of vertices and edges
    f >> V >> E;

    int** adj = new int*[V];
    for (int i=0;i<=V;i++)
    {
       adj[i]= new int[V];
    } 

    for(int x=0;x<=V; ++x) // initially 0 array
    {
       for (int y=0;y<=V;++y) 
          adj[x][y] = 0;
    }                             

    // Set diagonal to 1 
    for(int z=0; z<=V; ++z) 
       adj[z][z]=1;

    for (j =0;j<=E;++j)
    {
        f>>u>>v;
        adj[u][v] = 1;
        adj[v][u] = 1;
    }
}

// This method displays the adjacency lists representation.
void Graph::display(){
   int a,b,c;
   for (a=0;a<=V;++a)
   {
      cout << a << \"  \";
   }
   cout << endl;

   for (b=0;b<=V;++b)
   {
      cout << b << \"| \";

      for (c=0;c<=V;++c)
      {
         cout<<adj[b][c]<<\"| \";
      }
      cout<<endl;
   }
}

int main()
{
    char fname[20];
    cout << \"\\nInput name of file with graph definition: \";
    cin >> fname;

    Graph g(fname);
    g.display();
}
    
已邀请:
//Input number of vertices and edges
f >> V >> E;

// You\'re hiding your member variable in the following line, leading to an incorrect initialization    
// int** adj = new int*[V];
adj = new int*[V];
for (int i=0;i<=V;i++)
{
    adj[i]= new int[V];
} 
    
我仅在初始化数据数组的代码中看到两个重大问题。首先,像这样的循环
    for (int i=0;i<=V;i++)
循环超过数组中实际存在的元素。如果数组的长度为V个元素,则循环的正确形式为
for (int i=0;i<V;i++)
那是“小于”而不是“小于或等于”。 其次,既将指针数组分配为V指针长,又将各个列分配为V元素长;但是稍后您使用相同的数组,并期望其大小为V xE。那么,总的来说,我认为分配代码应该是
int** adj = new int*[V];
for (int i=0;i<V;i++)
{
   adj[i]= new int[E];
} 
其他地方可能还会有其他错误,但是至少我已经开始了。     
我不知道是哪条线引起了分段错误,但是这里有一些事情要看:
for (j =0;j<=E;++j)
{
    f>>u>>v;
    adj[u][v] = 1;
    adj[v][u] = 1;
}
是否保证
u
v
小于
V
?如果没有,您可能正在矩阵边界之外书写。
j == E
会怎样?您正在尝试读取文件最后一行之后的一行。您应该检查
j < E
。更好的方法仍然是一起忽略
E
,然后执行以下操作:
while(f >> u >> v)
{
    adj[u][v] = 1;
    adj[v][u] = 1;
}
尽管细分错误在这里更可能:
for (b=0;b<=V;++b)
{
    cout<<(b+1)<<\"| \";
    for (c=0;c<=V;++c)
    {
        cout<<adj[b][c]<<\"| \";
    }
    cout<<endl;
}
for循环条件应该检查​​
b < V
c < V
而不是
<=
。当
b
c == V
时,您肯定是在矩阵之外阅读。     

要回复问题请先登录注册