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 chaînée et structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Par défaut Liste chaînée et structure
    Bonjour à tous.

    Je bloque sur ce qui sera surement pour vous un détail.

    Je m'explique, lors d'un ajout en tête ou en queue, j'aimerais insérer un maillon créé précédemment mais je n'y arrive pas.

    Voici la structure qui sert pour la liste chaînée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct pile
    {
      char nom_prog[20];
      char pseudo[20];
      char taille_fichier[20];
      char fichier[256];
      struct pile *prec;
    }pile;
    La fonction d'ajout en tête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void ajouter_tete(pile **MaPile, pile **m){
    	pile *element = malloc (sizeof(pile)); //creation d'un nouveau chainon
     
    	strcpy(element->pseudo,(*m)->pseudo);
    	element->prec = *MaPile;
    	*MaPile = element;
    }
    Pour charger la liste avec toutes les infos qui sont lues à partir d'un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void charg_liste(pile **MaPile){
    pile *m;
     
    m= malloc (sizeof(pile));
    m->prec = NULL;
     
    /* puis les champs pseudos, taille_fichier,... sont renseignés */
     
    ajouter_tete(MaPile,&m);
     
    }
    Et enfin le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(void){
     
    pile *MaPile = NULL;
     
    charg_liste(&MaPile);
    ...
    }
    Ainsi, dans la fonction d'ajout en tête, je suis obligé de faire un strcpy pour renseigner tous les champs nécessaires (ici j'en ai mis qu'un). Et cela fonctionne comme cela. Sauf que du coup, j'ai créé un maillon intermédiaire et j'aurais aimé savoir comment me passer de ce maillon. J'ai vainement tenté de lui passer l'adresse directement mais ça merde.

    Voici ce que j'ai tenté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void ajouter_tete(pile **MaPile, pile **m){
    	(*m)->prec = *MaPile;
    	*MaPile = *m;
    }
    Et voilà ma fonction d'affichage de la liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void aff(pile **MaPile){
    	pile *p;
    	p = *MaPile;
    	while(p!=NULL){
    		printf("pseudo:\t%s\n",p->pseudo);
    		p = p->prec;
    	}
    }
    Dans le cas du strcpy, ça me retourne exactement ce qu'il faut. Mais quand je passe l'adresse, j'ai une boucle infinie qui affiche le pseudo en tête de liste uniquement.

    Merci de votre aide et désolé si le post est un peu long, j'ai essayé d'être assez précis.

    Dest.

  2. #2
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ajouter_tete(pile **MaPile, pile **m)
    Pourquoi t'utilise une nouvelle variable dans la fonction, tu peut traviler directement sur le pointeur MaPile, non ....

    et pour le pointeur m, il suffit de le passer directement et non pas l'adress du l'adress, je ne vois pas l'utiliter.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Par défaut
    J'ai pas lu tout ton code en detail, mais y'a un truc qui me parait bizar: pourquoi tu utilise des type "pile **" un peu partout ?

    Pourquoi pas simplement un "pile *"?

    Genre:

    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
     
    void ajouter_tete(pile *MaPile, pile *m){
    	pile *element = malloc (sizeof(pile)); //creation d'un nouveau chainon
     
    	strcpy(element->pseudo,m->pseudo);
    	element->prec = MaPile;
    	MaPile = element;
    }
     
    void charg_liste(pile *MaPile){
    pile *m;
     
    m= malloc (sizeof(pile));
    m->prec = NULL;
     
    /* puis les champs pseudos, taille_fichier,... sont renseignés */
     
    ajouter_tete(MaPile,m);
     
    }
     
     
    void ajouter_tete(pile *MaPile, pile *m){
    	m->prec = MaPile;
    	MaPile = m;
    }
     
    ....

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Plusieurs choses..

    1. D'abord pourquoi séparer l'insertion dans la pile de la création ?
    2. Ensuite si c'est ce que tu veux, tu fais 2 allocs, donc ... ya pas un truc dérangeant ?


    De 2 choses l'une :

    1. Soit tu fais une création, puis tu crées les liens de la pile
    2. Soit tu crées et insères.


    Donc par exemple :

    Manière 1 :

    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
     
    void ajouter_tete(pile **MaPile,  pile *pm ){
     
                 if ( pm == NULL )
                    return ;
     
    	pm->prec = *MaPile;
    	*MaPile = pm ;
    }
     
    void charg_liste(pile **MaPile){
    pile *m=NULL;
     
    m= malloc (sizeof(pile));
    if ( m == NULL )
       return ;
    m->prec = NULL;
     
    /* puis les champs pseudos, taille_fichier,... sont renseignés */
     
    ajouter_tete(MaPile,&m);
    }
     
    int main(void){
     
    pile *MaPile = NULL;
     
    charg_liste(&MaPile);
    ...
    }

    Manière 2 :

    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
     
    void ajouter_tete(pile **MaPile, char *nomproc, char *pseudo, char *fichier, int taille ){
    	pile *element = malloc (sizeof(pile)); //creation d'un nouveau chainon
                 if ( element == NULL )
                    return ;
     
    	strcpy(element->pseudo, pseudo);
                 ....
    	element->prec = *MaPile;
    	*MaPile = element;
    }
     
    void charg_liste(pile **MaPile){
    int i ; 
     
     ....
     
     for ( i = 0 ; i < NLignes ; i++ )
        {
            Lire_Ligne ( ...., pseudo, nomprog, fichier, &taille );
    ....
            ajouter_tete(MaPile, nomprog, pseudo, fichier, taille );
         }
     ....
    }
     
    int main(void){
     
    pile *MaPile = NULL;
     
    charg_liste(&MaPile);
    ...
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Par défaut
    Merci à tous pour vos réponses, commentaires et suggestions.

    Je n'ai pas eu le temps aujourd'hui de me repencher là-dessus mais j'ai bien l'intention de revenir vous voir que ça marche ou pas.

    Dest.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 147
    Par défaut Me revoilà.
    Je reviens à la charge après avoir fait quelques essais.

    Déjà pourquoi avoir des "**" ?
    Pour m'exercer, je me suis inspiré du cours de cette page: http://chgi.developpez.com/pile/

    Ensuite, je reconnais que la double allocation n'est pas nécessaire, c'est pourquoi je suis venu vous voir en vous montrant ce qui fonctionne actuellement mais que j'aimerai éviter la double allocation.

    Ta manière 1 souviron34 ressemble fortement à mon ébauche de code, mais cela ne fonctionne pas pour autant.
    Quant à la manière 2, c'est la double allocation que j'essaie justement d'éviter.

    A la question pourquoi avoir séparé l'allocation ? C'était juste pour m'exercer dans un petit coin sans pour autant pourrir ma fonction.

    @cmoibal: "et pour le pointeur m, il suffit de le passer directement et non pas l'adress du l'adress, je ne vois pas l'utiliter."

    Je vais voir de ce côté.

    Merci pour vos interventions et si vous avez d'autres suggestions, n'hésitez pas. Merci.


    Edit: En fait, je crois avoir vu ma boulette. J'ai oublié de vous mettre comme information que m changent de valeur dans une boucle et à chaque tour de boucle je fais l'insertion en pile. Sauf que je lui balance la même adresse à chaque coup. Et donc ça merde.

    ReEdit: Oui, oui, c'était bien ça. Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Structure pour liste chaînée
    Par wallace27 dans le forum C
    Réponses: 3
    Dernier message: 27/02/2015, 15h22
  2. Réponses: 5
    Dernier message: 03/03/2013, 18h37
  3. Réponses: 3
    Dernier message: 16/10/2007, 13h50
  4. Construction de liste chaînées
    Par fomblardo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 15/03/2005, 21h19
  5. Insertion d'un noeud dans une liste chaînée
    Par habib106 dans le forum Assembleur
    Réponses: 8
    Dernier message: 07/04/2004, 22h34

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