liste supprimen(int n,liste l){ int i; liste p=l; liste a=NULL; if(!l) return l; if(!l->suiv || n==1 ) return supprimer_tete(l); if(n==1) return supprimer_tete(l); for(i=0; i<n-2 && (p->suiv)->suiv ; i++, p=p->suiv); a=p->suiv; if(!((p->suiv)->suiv)){ free(p->suiv); p->suiv=NULL; return l; } p->suiv=(p->suiv)->suiv; free(a); return l; }
int main(void) { int choix ; int nb ; Liste ma_liste ; init(); // initialisations (des structures de donnees utilisees pour la // gestion de la memoire) ma_liste = creer_liste_vide() ; menu(); choix = lire_entier() ; while (choix != 0) { switch(choix) { case 1 : ma_liste = creer_liste_vide() ; break; case 2 : afficher_chaine("nombre a inserer ? "); nb = lire_entier(); ma_liste = inserer_tete(ma_liste, nb); break ; case 3 : afficher_chaine("nombre a rechercher ? "); nb = lire_entier(); if(rechercher(ma_liste, nb) !=0) afficher_chaine (" present!\n"); else afficher_chaine(" absent!\n"); break; case 4 : afficher_liste(ma_liste); break ; case 5: afficher_liste_inverse(ma_liste); break ; case 6: ma_liste = supprimer_tete(ma_liste); break ; case 7: ma_liste = supprimer_queue(ma_liste); break ; } menu(); choix = lire_entier() ; } return(0); }
File algo_fileACM(Sommet * tab_sommet, Arc * tab_arc, int len_tab_sommet, int len_tab_arc, int num_depart, float *cout) { File fileACM = NULL; Liste C = NULL; Liste liste_sommet_atteint = NULL; Sommet d = tab_sommet[num_depart]; /* DEBUT ALGO PRIM */ Sommet *smt; for (smt = tab_sommet; smt < tab_sommet + len_tab_sommet; smt++) { smt->PPC = FLT_MAX; smt->arrive_par = NULL; } d.PPC = 0; d.arrive_par = NULL; C = ajout_tri(&d, C); liste_sommet_atteint = ajouter_queue(&d, liste_sommet_atteint, sizeof(Sommet)); while (!est_vide_liste(C)) { Sommet sommet_ppc_min; Liste liste_sommet_adjacent = NULL; Liste liste_arc_sortant = NULL; Arc *a; Liste ll; /*on récupère le sommet de plus petit PPC et son coût */ /*Comme la liste est triée, c'est le premier élément de C */ sommet_ppc_min = *(Sommet *) C->val; /*supprimer j de C */ C = supprimer_tete(C); /*si j n'est pas d */ if (sommet_ppc_min.numero != d.numero) { *cout += sommet_ppc_min.PPC; fileACM = enfiler(fileACM, sommet_ppc_min.arrive_par, sizeof(Arc)); liste_sommet_atteint = ajouter_queue(&sommet_ppc_min, liste_sommet_atteint, sizeof(Sommet)); } /* on récupère les adjacents */ for (a = tab_arc; a < tab_arc + len_tab_arc; a++) { if (a->sommet_depart == sommet_ppc_min.numero) { liste_sommet_adjacent = ajouter_queue(&tab_sommet[a->sommet_arrive], liste_sommet_adjacent, sizeof(Sommet)); liste_arc_sortant = ajouter_queue(a, liste_arc_sortant, sizeof(Arc)); } } sommet_ppc_min.voisins = liste_arc_sortant; // printf("Sommet: %s\n", sommet_ppc_min.nom); for (ll = liste_arc_sortant; !est_vide_liste(ll); ll = ll->suiv) { a = (Arc *) ll->val; if ((tab_sommet[a->sommet_arrive]).PPC > a->cout) { tab_sommet[a->sommet_arrive].PPC = a->cout; tab_sommet[a->sommet_arrive].arrive_par = a; if (recherche_elt_liste(liste_sommet_atteint, &tab_sommet[a->sommet_arrive]) != 1) { if (recherche_elt_liste(C, &tab_sommet[a->sommet_arrive]) != 1) { C = ajout_tri(&tab_sommet[a->sommet_arrive], C); } else { Liste L = C; Liste l; C = NULL; for (l = L; !est_vide_liste(l); l = l->suiv ) { C = ajout_tri(&tab_sommet[((Sommet*) l->val)->numero], C); } } } } } } printf("Cout de l'acm: %f\n", *cout); /* FIN ALGO PRIM */ return fileACM; }