C语言中邻接矩阵的实现

时间:2018-09-23 05:21:26

标签: c data-structures graph

我正在尝试使用邻接矩阵实现图,我对二维数组的内存分配感到困惑 是否正确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;
}

2 个答案:

答案 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);