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

Fermé
michael0703 Messages postés 4 Date d'inscription samedi 7 mars 2020 Statut Membre Dernière intervention 2 février 2021 - 1 févr. 2021 à 21:44
michael0703 Messages postés 4 Date d'inscription samedi 7 mars 2020 Statut Membre Dernière intervention 2 février 2021 - 2 févr. 2021 à 21:10
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

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
michael0703 Messages postés 4 Date d'inscription samedi 7 mars 2020 Statut Membre Dernière intervention 2 février 2021
2 févr. 2021 à 21:10
Merci pour la documentation.
0