IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

liste chainée et insertion en fin ou debut


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut liste chainée et insertion en fin ou debut
    Bonjour,


    je poste car je bloque avec l'impossibilité d'inserer un element en fin ou en debut de ma liste voici mon code :


    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <stdio.h>
    #include <stdlib.h>
    #define TAILLE 10
     
    void main(void)
     
    {
     
    	struct Enr_note
    	{
    		struct Enr_note *suivant;
    		float note;
    		struct Enr_note *precedent;
     
    	};
     
    	float nb = 0;
    	struct Enr_note *pt_debut,*pt_fin,*pt_nouveau,*pt_courant;
     
     
    	pt_debut =NULL;
    	pt_fin =  NULL;
     
     
    	printf(" entrer les notes putain\n");
    	while ( nb != -1 )
    	{
    		scanf("%f",&nb);
    		if ( nb != -1)
    		{
    			pt_nouveau = (struct Enr_note*)malloc(sizeof(struct Enr_note));
     
    		pt_nouveau->note  = nb;
    		pt_nouveau->precedent = NULL;
    		pt_nouveau->suivant = NULL;
     
    		if ( pt_debut == NULL )
    		{
     
    			pt_debut  = pt_nouveau;
    			pt_fin = pt_nouveau;
    		}
    		else
    		{
    			pt_fin->suivant = pt_nouveau;
    			pt_nouveau->precedent = pt_fin;
    			pt_fin = pt_nouveau;
    		}
    		}
    	}
     
    	pt_courant  = pt_debut;
     
    	while ( pt_courant =! NULL )
    	{
    		printf("%f",pt_courant->note);
    		pt_courant = pt_courant->suivant;
    	}
    	printf("\n");
     
    }

    j'ai aucune erreur de mon compilateur ( VC++ ) mais par contre a l'execution il plante, impossible de debugger



    Voila merci
    A + Bruno

  2. #2
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut
    si tu pouvais indiquer le message d'erreur

    sinon pourquoi un chainage double juste pour ca ?? un chainage simple aurait suffit, avec juste la repere debut...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut salut
    Bonjour,
    il n'y a aucune erreur , il plante des que j'ai taper fini de taper les notes en tapant : -1 :
    il aime pas le manipulement des pointeur apparement :/

    j'utilise un double chainage pour ma familiariser avec juste a titre pédagogique



    Voila merci
    A+

  4. #4
    Membre émérite
    Avatar de lakitrid
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    1 535
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 535
    Points : 2 388
    Points
    2 388
    Par défaut Re: liste chainée et insertion en fin ou debut
    ok essaye ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if(pt_debut != NULL) {
    	pt_courant  = pt_debut;
     
    	do
    	{
    		printf("%f",pt_courant->note);
    		pt_courant = pt_courant->suivant;
    	}
            while ( pt_courant =! pt_fin );
    	printf("\n");
    }
    je peux pas compiler mais ca à l'air bon

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Beaucoup d'erreurs dans ce code:

    C'est
    Déclare ta structure à l'extérieur du main...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    struct Enr_note
       {
          struct Enr_note *suivant;
          float note;
          struct Enr_note *precedent;
     
       }; 
     
    int main()
    ....


    On ne fait jamais de test d'égalité ou d'inégalité sur des nombres rééls directement mais on teste la valeur absolue de la différence et on regarde si cela dépasse un seuil...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pt_nouveau = (struct Enr_note*)malloc(sizeof(struct Enr_note));
    On teste toujours le retour d'un malloc, et le transtypage n'est plus utile (thême de la journée)...

    EDITION: Autant pour moi, la fatigue m'avait aussi convaincu que le chaînage était faux.. Désolé

    Et encore enfin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ( pt_courant =! NULL )
    devrait être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while ( pt_courant != NULL )
    Jc

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Essayez -1f. Comparer un flottant et un entier peut donner de drôles de résultats.
    Il faut mettre pt_nouveau->suivant à null manuellement.
    (PS : message édité, je crois m'être trompé sur son chaînage.)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut vg
    bonjour

    grace a eux aux conseils de fearyourself et vous tous j'ai pu y arriver !

    voici le code :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <stdio.h>
    #include <stdlib.h>
    #define TAILLE 10
     
    	struct Enr_note
    	{
    		struct Enr_note *suivant;
    		float note;
    		struct Enr_note *precedent;
     
    	};
    void main(void)
     
    {
     
     
     
    	float nb = 0;
    	struct Enr_note *pt_debut,*pt_fin,*pt_nouveau,*pt_courant;
     
     
    	pt_debut =NULL;
    	pt_fin =  NULL;
     
     
    	printf(" entrer les notes putain\n");
    	while ( nb != -1 )
    	{
    		scanf("%f",&nb);
    		if ( nb != -1)
    		{
    			pt_nouveau = (struct Enr_note*)malloc(sizeof(struct Enr_note));
     
    		pt_nouveau->note  = nb;
    		pt_nouveau->precedent = NULL;
    		pt_nouveau->suivant = NULL;
     
    		if ( pt_debut == NULL )
    		{
     
    			pt_debut  = pt_nouveau;
    			pt_fin = pt_nouveau;
    		}
    		else
    		{
    			pt_fin->suivant = pt_nouveau;
    			pt_nouveau->precedent = pt_fin;
    			pt_fin = pt_nouveau;
    		}
    		}
    	}
     
    	pt_courant  = pt_debut;
     
    	while ( pt_courant != NULL )
    	{
    		printf("%f",pt_courant->note);
    		pt_courant = pt_courant->suivant;
    	}
    	printf("\n");
     
    }

    Merci a +

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Heureusement qu'il a intégré et vite compris tous les autres détails...



    De l'autre côté, comme ca il reviendra...



    Allez, soirée raclette pour me préparer au froid de demain,



    Bonne soirée!

    Jc

Discussions similaires

  1. Ajout à la fin d'une liste chaine
    Par youssef222 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2008, 18h35
  2. Fin de liste chainée, erreur
    Par faulk dans le forum C
    Réponses: 3
    Dernier message: 21/10/2006, 20h02
  3. Réponses: 28
    Dernier message: 24/05/2006, 18h20
  4. [debutant] pb avec liste Chainée.
    Par FamiDoo dans le forum Débuter
    Réponses: 2
    Dernier message: 19/03/2006, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo