bad___day | Salut,
j'ai essayer de faire un bout de programme qui construit deux listes chaînée (unidirectionnelle) de telle sorte que la liste chaînée soit trier à chaque fois que l'utilisateur rentre une valeur ( la valeur contenu dans le champ info d'un élément de la liste chainée).
et ensuite je fait une simple fusion des deux listes dans une autre liste.
tout marche normalement bien et tout (je n'ai pas essayer les cas spéciales),
le problème c'est qu'a la compilation, mon compilateur (gcc) me signle deux warning:
Citation :
Project : Console application
Compiler : GNU GCC Compiler (called directly)
Directory : C:\Documents and Settings\Simple plan\Bureau\liste ch essaye\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c: In function `MakeTriedListe':
main.c:127: warning: 'q' might be used uninitialized in this function
main.c: In function `FusionListes':
main.c:56: warning: 'q' might be used uninitialized in this function
Linking console executable: C:\Documents and Settings\Simple plan\Bureau\liste ch essaye\console.exe
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 2 warnings
|
et je n'arrive pas à vraiment trouvé l'origine de ces warning.
voici tout le code source:
Code :
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct element
- {
- int info;
- struct element *suit;
- }
- liste;
- liste* MakeTriedListe( int );
- void ShowInfosListe( liste* );
- liste* FusionListes( liste*, liste* );
- int main(void)
- {
- liste *t, *t1, *t2;
- int n1, n2;
- printf("donnez le nombre d'element de la 1ere liste:\n" );
- scanf("%d", &n1);
- printf("donnez le nombre d'element de la 2eme liste:\n" );
- scanf("%d", &n2);
- t1 = MakeTriedListe(n1);
- t2 = MakeTriedListe(n1);
- t = FusionListes( t1, t2 );
- printf("\n\nLa 1ere liste:\n" );
- ShowInfosListe( t1 );
- printf("\n\nLa 2eme liste:\n" );
- ShowInfosListe( t2 );
- printf("\n\nLa liste de fusion:\n" );
- ShowInfosListe( t );
- return 0;
- }
- void ShowInfosListe( liste *tete )
- {
- liste *A;
- for( A = tete; A != NULL; A = A->suit )
- printf("%d ", A->info);
- }
- liste* FusionListes( liste *tet1, liste *tet2 )
- {
- liste *q, *p1, *p2, *p, *tet = NULL;
- p1 = tet1;
- p2 = tet2;
- while( p1 != NULL && p2 != NULL )
- {
- p = (liste*) malloc( sizeof(liste) );
- /* prendre la plus petite info et la metre dans le champ info de p */
- if( p1->info == p2->info )
- {
- p->info = p1->info;
- p1 = p1->suit;
- p2 = p2->suit;
- }
- else if( p1->info < p2->info )
- {
- p->info = p1->info;
- p1 = p1->suit;
- }
- else
- {
- p->info = p2->info;
- p2 = p2->suit;
- }
- /* MAJ du chainage */
- if( tet == NULL )
- {
- tet = p;
- q = p;
- }
- else
- {
- q->suit = p;
- q = p;
- }
- }
- /* des que l'une des deux listes se terminer, on continue à
- fusioner le reste de la liste non terminer */
- while( p1 != NULL ) // s'il reste des element de la 1ere liste
- {
- p = (liste*) malloc( sizeof(liste) );
- p->info = p1->info;
- q->suit = p;
- q = p;
- }
- while( p2 != NULL ) // s'il reste des element de la 2eme liste
- {
- p = (liste*) malloc( sizeof(liste) );
- p->info = p2->info;
- q->suit = p;
- q = p;
- }
- return tet;
- }
- liste* MakeTriedListe( int n )
- {
- liste *p, *tete, *A, *q;
- /* on crée la tete */
- tete = (liste*) malloc( sizeof(liste) );
- printf("donnez le 1er entier: " );
- scanf("%d", &(tete->info));
- tete->suit = NULL;
- while( n!=1 )
- {
- n--; // on diminue le compteur de nombre d'elements
- p = (liste*) malloc( sizeof(liste) );
- printf("donnez un entier: " );
- scanf("%d", &(p->info));
- /* reperer la position de l'insertion de l'element */
- for( A=tete; A!=NULL && p->info <= A->info; q=A, A=A->suit );
- /* on inset avant l'element pointé par A */
- if( A == tete )
- {
- p->suit = tete;
- tete = p;
- }
- else
- {
- q->suit = p;
- p->suit = A;
- }
- }
- return tete;
- }
|
merci Message édité par bad___day le 14-03-2007 à 16:00:54
|