邻接列表和结构Dijkstra

时间:2016-11-29 13:27:36

标签: c dijkstra

我必须使用邻接列表创建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_asom_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");
    }
}

0 个答案:

没有答案