c中图的邻接矩阵(得到误差)

时间:2016-08-12 11:12:44

标签: c malloc

#include <stdio.h>

struct graph{
int v,e,**adj;
};

struct graph* graph_A(){
int u,V,i;
struct graph *g = (struct graph*)malloc(sizeof(struct graph));
if(!g){
 printf("error ! ");
exit(1);
 }

printf("Enter no of nodes and edges ? ");
scanf("%d, %d",&g->v,&g->e);
g->adj = (int**)malloc(sizeof(int) * sizeof(g->v * g->v ));
for(u = 0 ; u <= g->v ; u++)
for(V = 0 ; V <= g->v ; V++ )
g->adj[u][V] = 0;
printf("Enter connections ? ");
for(i = 0 ; i  <= g->e ; i++){
scanf("%d, %d",&u,&V);
g->adj[u][V] = 1;
g->adj[V][u] = 1;
 }
  return (g);
 }
 int main(){
 graph_A();
  }

我想弄清楚问题是什么,但我自己无法解决。请帮忙 ! 我在这个主题上进行了大约2个小时的研究,但遗憾的是没有找到 适当的帮助台。 我正在学习数据结构并用c和c ++语言实现。 如果你能够建议我 那真是善待你。 谢谢!

1 个答案:

答案 0 :(得分:0)

使用向量稍微修复您的代码。不是最干净的方式,因为没有使用自动循环,错误的变量选择,没有边界检查用户输入,但至少它的工作原理 我完全删除了分配,用向量代替,更简单,事实是代码没有那么大的变化。

请注意,您不需要graph课程。一切都可以在主要部分完成。如果要创建一个类,则在构造函数中提供参数而不是交互式输入(在main中执行,以便其他人可以将您的类重用于其他目的),并提供计算,访问数据,大小等方法。 ..之后会出现。

主要关注点是:

  • 实例中的malloc 构造函数本身。使用new会产生无限递归。我的建议:阅读一些C ++书籍
  • 所有循环包括上边界
  • 指针行的指针已分配但不是行本身。

当我重写代码时,我有2个编译错误,一个SEGV因为显示部分上的最后一个上限边界错误,之后它立即工作。 C ++规则(当你知道自己的方式时)

代码:

#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;

class graph{
int v,e;
vector<vector<int> > adj;
public:
graph();
 };

graph::graph()
{

int u,V,i;
cout << "Enter no of nodes and edges ? ";
cin  >> v ;
cin >> e ;
adj.resize(v);
for(u = 0 ; u < v ; u++)
{
    adj[u].resize(v);
}

for(u = 0 ; u < v ; u++)
for(V = 0 ; V < v ; V++ )
adj[u][V] = 0;
cout << " Enter connections ? ";
for(i = 0 ; i  < e ; i++){
cin >> u ;
cin >> V ;
adj[u][V] = 1;
adj[V][u] = 1;
}
for(u = 0 ; u < v ; u++)
{
for(V = 0 ; V < v ; V++ )
{
cout << adj[u][V] << " ";
}
cout << endl;
}
}


int main(){

graph a;
return 0;
}

试验:

Enter no of nodes and edges ? 10 3
 Enter connections ? 3 4
2 3
4 5
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0 0
0 0 0 1 0 1 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0