我正在尝试使用邻接矩阵实现图,我对二维数组的内存分配感到困惑
是否正确G->adj=(int**)malloc(sizeof(G->v*G->V))
或下面的一个是正确的
#include<stdio.h>
#include<stdlib.h>
struct Graph{
int V;
int E;
int **adj;
};
struct Graph* adjmatrix(){
int u,v,i;
struct Graph* G=(struct Graph*)malloc(sizeof(struct Graph));
if(!G)
printf("Memory Null");
printf("enter the number of vertex and edges");
scanf("%d %d",&G->V,&G->E);
G->adj=(int**)malloc(sizeof(int*)*( G->V * G->V ));
for(u=0;u<G->V;u++){
for(v=0;v<G->V;v++){
G->adj[u][v]=0;
}
}
for(i=0;i<G->V;i++){
printf("reading edge");
scanf("%d %d",&u,&v);
G->adj[u][v]=1;
G->adj[v][u]=1;
}
return G;
}
答案 0 :(得分:2)
如果要使用指针public class MainActivity extends Activity {
ArrayList<Contact> contact;
Contact currentcontact;
EditText nameArea,emailArea,phoneArea;
int emails=1;
int phones=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameArea=findViewById(R.id.name_area);
emailArea=findViewById(R.id.e1);
phoneArea=findViewById(R.id.p1);
contact=new ArrayList<>();
}
public void buttonclick(View v){
if(v.getId()==R.id.addemail){
createemaileditview();
}
if(v.getId()==R.id.addphone){
createphoneeditview();
}
if(v.getId()==R.id.save){
}
if(v.getId()==R.id.cancel){
}
}
protected void createemaileditview(){
LinearLayout outerLayout=new LinearLayout(this);
outerLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
outerLayout.setOrientation(LinearLayout.VERTICAL);
EditText email=new EditText(this);
email.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT,1f));
outerLayout.addView(email);
setContentView(outerLayout);
emails++;
}
protected void createphoneeditview(){
phones++;
}
}
来存储矩阵,则需要在第一步中为行分配内存,然后为列分配内存:
int** adj
另一种存储邻接矩阵的方法是创建1D数组,但是您需要使用 // create G->V rows
G->adj=(int**)malloc( sizeof(int*) * G->V);
// for every row create G->V columns
for (int i = 0; i < G->V; ++i)
G->adj[i] = (int*)malloc (sizeof(int) * G->V);
公式来访问u * G->V + v
项:
在(u,v)
中声明:
Graph
分配内存
int *adj;
和访问元素
G->adj=(int*)malloc(sizeof(int) * ( G->V * G->V));
答案 1 :(得分:0)
有多种方法可以为C中的2D数组分配内存。专门针对您的代码进行定制,您可以执行以下任一操作:
分别为每行分配内存:
首先为一个指针数组分配内存,为每一行分配一个内存,然后使用这些指针中的每个指针为整数数组分配内存。
// Pointer array of rows
G->adj = (int **)malloc(G->V * sizeof(int *));
// Allocate memory for each row
for (int i = 0; i < G->V; i++)
G->adj[i] = (int *)malloc(G->V * sizeof(int));
立即分配内存并重新定向:
首先为指针数组分配内存,每行分配一个指针,然后使用第一个指针分配足够的内存来存储完整的矩阵。然后,您可以重新定位数组中的每个指针,使其指向此分配空间的每一行。
// Pointer array of rows
G->adj = (int **)malloc(G->V * sizeof(int *));
// Allocate enough space for a matrix
G->adj[0] = (int *)malloc(G->V * G->V *sizeof(int));
// Use each pointer to point to a block G->V distance
// from the previous pointer
for(i = 0; i < G->V; i++)
G->adj[i] = (*G->adj + G->V * i);