Bonjour,
J'ai un enorme tp à faire sur les listes avec pas mal de fonctions.
Il y en a une qui depuis hier me pose probleme (surtout que je la re-utilise dans d'autres).
Il s'agit d'inserer un element au bon endroit dans une liste simplement chainée supposée etre triée dans l'ordre croissant.
Voici d'abord la structure :
Et ma fonction qui donc ne marche pas bien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typedef struct _un_element { Tval elem_val; struct _un_element *suiv; } Un_element, * P_un_element;
Je l'avais pourtant testé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 /* fonction qui insere en place un element dans la liste */ void inserer_en_place (P_un_element *liste, P_un_element el ) { /* si la liste est vide */ if ( !(*liste) ) inserer_element_debut(liste,el); else { /* la liste est triee dans l'odre croissant */ P_un_element prec = NULL; /* on garde en memoire la tete */ P_un_element tete = *liste; /*Un_element tete = **liste;*/ /* on se balade dans la liste tant que el->val plus grand que le chainon->val */ /*while ( (cmpval(el->elem_val,(*liste)->elem_val)) > 0 )*/ while ( ((*liste)->suiv != NULL) && (el->elem_val > (*liste)->elem_val) ) { prec = *liste; *liste = (*liste)->suiv; } /* Si c'est en 1ere place */ if ( !prec ) { el->suiv = *liste; *liste = el; } /* si c'est en derniere place */ else if ( !(*liste)->suiv ) { el->suiv = NULL; (*liste)->suiv = el; /* on remet liste sur la tete */ *liste = tete; } else { /* on insere la valeur */ prec->suiv = el; el->suiv = *liste; /* on remet liste sur la tete */ *liste = tete; } } }
Et c'etait ok..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 /* Test de la fonction inserer_en_place */ printf("Test de la fonction inserer_en_place\n"); printf("On insere en place dans une liste vide :\n"); inserer_en_place(&maListe5,creer_element(0)); afficher_liste(maListe5); printf("On insere en 1ere place d'une liste non vide :\n"); inserer_en_place(&maListe,creer_element(1)); afficher_liste(maListe); printf("On insere en derniere place d'une liste non vide :\n"); inserer_en_place(&maListe,creer_element(7)); afficher_liste(maListe); printf("On insere au milieu d'une liste non vide :\n"); inserer_en_place(&maListe,creer_element(5)); afficher_liste(maListe);
Mais plus loin j'ai constaté son disfonctionnement..
Je la reutilise dans une autre fonction, qui insere un element au bonne endroit que si celui dernier n'est pas dans la liste :
Et cette derniere fonction me sert pour realiser l'intersection de deux ensembles (listes) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 /* fonction qui ajoute un element en place dans une liste triee si celui ci n'est pas present */ void inserer_en_place_si_unique (P_un_element *liste, P_un_element el ) { /* on test d'abord si el est deja dans la liste */ P_un_element tmp = rechercher_element (*liste,el->elem_val); /* si il a ete trouve on ne fait rien */ if ( tmp ) { printf("Element deja dans la liste !\n"); return; } /* sinon on l'insere en place */ else inserer_en_place(liste,el); }
Et c'est là que je me suis apperçu qu'il y avait un probleme...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /* Fonction qui cree un nouvelle liste qui est l'intersection de 2 listes passees en parametres, et qui renvoie cette nouvelle liste */ P_un_element intersection (P_un_element liste1, P_un_element liste2) { P_un_element newListe = malloc(sizeof(Un_element)); if ( newListe ) { P_un_element tmp = NULL; newListe = NULL; /* on parcourt liste1 */ while ( liste1 ) { /* si l'element actuel de liste1 est dans liste2, on le rajoute a la nouvelle liste */ if ( (tmp = rechercher_element(liste2,liste1->elem_val)) ) { inserer_en_place_si_unique(&newListe,creer_element(liste1->elem_val)); } liste1 = liste1->suiv; } return newListe; } else return NULL; }
Donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 /* Test de la fonction intersection */ printf("Test de la fonction intersection\n"); detruire_liste(&maListe3); printf("La liste1 :\n"); afficher_liste(maListe); inserer_en_place(&maListe2,creer_element(2)); inserer_en_place(&maListe2,creer_element(12)); printf("La liste2 :\n"); afficher_liste(maListe2); maListe3 = intersection(maListe,maListe2); printf("Leur intersection :\n"); afficher_liste(maListe3);
L'intersection (nouvelle liste) est mal triée.. mais ça le fait que au debut, pour le 2, car apres le 3 et 6 sont bien triés..Test de la fonction intersection
La liste1 :
Valeur element : -1, pointeur suivant : 0x94d9008
Valeur element : 0, pointeur suivant : 0x94d9038
Valeur element : 1, pointeur suivant : 0x94d9048
Valeur element : 2, pointeur suivant : 0x94d9078
Valeur element : 3, pointeur suivant : 0x94d9018
Valeur element : 4, pointeur suivant : 0x94d9108
Valeur element : 5, pointeur suivant : 0x94d9148
Valeur element : 6, pointeur suivant : 0x94d9118
Valeur element : 7, pointeur suivant : 0x94d9128
Valeur element : 8, pointeur suivant : 0x94d91d8
Valeur element : 9, pointeur suivant : 0x94d91e8
Valeur element : 17, pointeur suivant : (nil)
La liste2 :
Valeur element : 1, pointeur suivant : 0x94d9218
Valeur element : 2, pointeur suivant : 0x94d9168
Valeur element : 3, pointeur suivant : 0x94d9158
Valeur element : 11, pointeur suivant : 0x94d90f8
Valeur element : 6, pointeur suivant : 0x94d9208
Valeur element : 12, pointeur suivant : (nil)
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
L'element n'est pas dans la liste !
Leur intersection :
Valeur element : 2, pointeur suivant : 0x94d90a8
Valeur element : 1, pointeur suivant : 0x94d9238
Valeur element : 3, pointeur suivant : 0x94d9248
Valeur element : 6, pointeur suivant : (nil)
Voila j'ai cherché pas mal de temps mais je ne vois plus rien
J'espere qu'un oeil exterieur y verra un peu plus clair.
Merci pour votre aide
Sorry
Partager