Problème : Fonction qui insère récursivement des elements dans une liste triée

michael0703 Messages postés 4 Statut Membre -  
michael0703 Messages postés 4 Statut Membre -
Bonjour,
Ci-dessus le code que j'ai écrit pour insérer de manière récursive des elements dans une liste chainée triée. Néanmoins, ça ne fonctionne pas correctement.
Liste ajouter_element(Liste liste, int e) {
Liste nouveau;

if (liste == NULL)
return creer_maillon(e);

if(e <= liste->valeur && liste->suivant == NULL) {
nouveau = creer_maillon(e);
nouveau->suivant = liste;
return nouveau;
}

liste->suivant = ajouter_element(liste->suivant, e);

return liste;
}


La fonction
creer_maillon(int e)
chargée de l'allocation et de l'initialisation des maillons ;
Liste creer_maillon(int e) {
Liste nouveau = (Liste *) malloc(sizeof(maillon));

if(nouveau == NULL) {
perror("L'allocation de memoire a echoue");
exit(EXIT_SUCCESS);
}
nouveau->valeur = e;
nouveau->suivant = NULL;
return nouveau;
}


Merci de m'aider.

2 réponses

  1. Pat
     
    Bonsoir,

    La théorie
    https://perso.esiee.fr/~landschm/IN3T01/Listes%20chainees%20dynamiques.pdf
    Après les TP

    void insertion_event(Tete_ev *liste, char type[80],float time)
    {
        /* Crйation du nouvel йlйment */
        Event *nouveau = malloc(sizeof(*nouveau));
        Event *p=liste->premier;
        Event *l=liste->premier;
        if ( nouveau == NULL)
        {
            exit(EXIT_FAILURE);
        }
        if(liste->premier==NULL){
           liste->premier=nouveau;
           liste->premier->time=time;
           strcpy(liste->premier->type,type);
           liste->premier->suivant=NULL;
        }
        else{
        strcpy(nouveau->type,type);
        nouveau->time = time;
        if(l->suivant==NULL)
        {
                if(l->time>nouveau->time)
                {
                nouveau->suivant=l;
                liste->premier=nouveau;
                }else
                {
                    liste->premier->suivant=nouveau;
                }
        }else if(liste->premier->suivant!=NULL)
         {if(liste->premier->suivant->suivant==NULL){
           if(liste->premier->time>=nouveau->time){
            l=liste->premier->suivant;
            liste->premier->suivant=nouveau;
            nouveau->suivant=l;
           l->suivant=NULL;
           }
            else{
                l=liste->premier->suivant;
                l->suivant=nouveau;
            nouveau->suivant=NULL;}
         }else{
        l=liste->premier->suivant;
        if(liste->premier->time>nouveau->time)
        {
            nouveau->suivant=liste->premier;
            liste->premier=nouveau;
        }else
        {
           p=liste->premier;
           l=liste->premier->suivant;
            while(l->suivant!=NULL )
            {
                if(nouveau->time>p->time && nouveau->time<l->time)
                {
                    p->suivant=nouveau;
                    nouveau->suivant=l;
                }
                else
                {
                    p=p->suivant;
                    l=l->suivant;
                }
            }if(nouveau->suivant==NULL)
            {
                if(nouveau->time>p->time && nouveau->time<l->time)
                {
                    p->suivant=nouveau;
                    nouveau->suivant=l;
                    l->suivant=NULL;
                }
                else{
        l->suivant=nouveau;
        nouveau->suivant=NULL;}
            }
        }
        }
        }}
    }
    void suppression_event(Tete_ev *liste)
    {
        if (liste == NULL)
        {
            exit(EXIT_FAILURE);
        }
        if (liste->premier != NULL)
        {
            Event *aSupprimer = liste->premier;
            liste->premier = liste->premier->suivant;
            free(aSupprimer);
        }
    }
    void afficher_event(Tete_ev *liste)
    {
        if (liste == NULL)
        {
            exit(EXIT_FAILURE);
        }
        Event *actuel = liste->premier;
        while (actuel != NULL)
        {
            printf("type->%s \n time->%f \n", actuel->type,actuel->time);
            actuel = actuel->suivant;
        }
    }
    int nombreevent(Tete_ev *tete)
    {
        int i = 0;
        if(tete->premier == NULL)
        {
            return 0;
        }
        /* Sinon, tant qu'il y a encore un élément ayant la val = valeur */
        while(tete->premier != NULL)
        {
            /* On incrémente */
            tete->premier = tete->premier->suivant;
            i++;
        }
        /* Et on retourne le nombre d'occurrences */
        return i;
    }
    


    Fin prêt pour la maîtrise
    Je ne veux pas voir ce type de déclaration har type[80] pour tester excellent devant un prof non à moins qu'il soit sympa
    http://gallium.inria.fr/~maranget/X/421/poly/listes.html
    Go
    1
  2. michael0703 Messages postés 4 Statut Membre
     
    Merci pour la documentation.
    0