我必须使用邻接列表创建Dijkstra算法程序。我的老师给了我struct
。
但我有这个错误:
note: expected 'struct maillon **' but argument is of type 'LISTE' void insere(int som_a, int som_b, int poids, LISTE Adj[]){
如果参数nom
是顶点,poids
是权重,som_a
和som_b
是顶点。
function void insere:insert (som_b, poids)
在邻接列表的顶部Adj[som_a]
typedef struct maillon{
struct maillon *suiv;
int nom;
int poids;
} MAILLON, *LISTE;
void insere(int som_a, int som_b, int poids, LISTE Adj[]) {
LISTE prem = malloc(sizeof(LISTE));
prem->nom = som_b;
prem->poids = poids;
prem->suiv = Adj[som_a];
Adj[som_a] = prem;
}
void dijsktra(int s, GRAPHE G) {
int i, j, dist[NB_SOM_MAX], INT_MAX = 0, pred[NB_SOM_MAX], min, nb = 0, nbmin = 0;
LISTE S,F = G.Adj;
for(i = 0; i < G.nbSommets; i++) {
dist[i] = INT_MAX;
pred[i] = NULL;
}
dist[0] = 0;
S = NULL;
while(F != NULL){
min = G.Adj[0]->poids;
for(i = 1; i < G.nbSommets; i++) {
if(min > G.Adj[i]->poids) {
min = G.Adj[i]->poids;
nbmin = i;
}
}
insere(nb, nbmin, min, S);
nb++;
if(nbmin == 0){
F = F->suiv;
}
else{ // F[nbmin-1]->suiv = F[nbmin + 1];
F[nbmin - 1] = F[nbmin + 1];
}
for(i = G.Adj[nbmin]->nom; i < G.nbSommets; i++){
if(dist[i] > dist[nbmin] + G.Adj[nbmin]->poids){
dist[i] = dist[nbmin] + G.Adj[nbmin]->poids;
pred[i] = nbmin;
}
}
}
for(i = 0; i < G.nbSommets; i++){
printf("Chemin optimal de %d à %d : ", i, s);
printf("%d-", i);
j = i;
while(pred[j] != s || pred[j] != NULL){
printf("%d-", pred[j]);
j = pred[j];
}
printf("\n");
}
}