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 :

insertion dans Liste chaînée


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Points : 59
    Points
    59
    Par défaut insertion dans Liste chaînée
    bonjour
    je veux realiser un programme c qui saisie et affiche une liste chainee et realise les operations d'insertion au debut, fin et au milieu apres une case donnee
    j'ai realise ce programme
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    /**************************************/
    /*** ce programme affiche la liste    */
    /*** chainee saisie                   */
    /**************************************/
     
    # include <stdio.h>  //pour printf et scanf
    # include <stdlib.h> //pour malloc
     
    typedef struct element
    {
    	int val ;
    	struct  element *suivant;
    }*liste; 
     
    void main()
    {
    	int n,x,i;
    	liste tete,p,inser,fin,final,y,milieu,aux;
     
    //allocation de debut liste
    tete=(liste) malloc (sizeof (element));
    printf("\n l'adresse du tete est : %p \n",tete);
     
    //Saisie de la liste
    printf ("Saisie de la liste");
    printf ("\nDonner le nbre d'element à saisir\n");
    scanf  ("%d",&n);
     
    p=tete;
    for (i=0;i<n;i++)
    {
    	printf ("Donner un entier\n");
    	scanf ("%d",&p->val);
    	p->suivant=(liste) malloc (sizeof(element));
    	p=p->suivant;
    }
    	p->suivant=NULL; //fin liste
     
     
     
    //Affichage de la liste
    p=tete;
     
    printf("\n ADRESSE DU TETE est :%p \n",p);
    while(p->suivant != NULL)
    {
    	printf(" L'element que vous avez saisie est :%d \n",p->val);
    	p=p->suivant;
    }
     
    printf("\n ADRESSE DU NULL est :%p \n",p);
     
     
    //ajout a la fin liste
    printf("\03  SAISIE DE LA CASE A INSERER \n");
     
    fin=(liste) malloc (sizeof (element));
     
    printf ("L'adresse de la case a insere fin est %p \n",fin);
    printf ("Donner un entier\n");
    scanf("%d",&fin->val);
     
    p=tete;
    while(p != NULL)
    {
    if(p->suivant == NULL)
    {
    	p->suivant = fin;
    	break;
    }
    else
    {
    printf ("L'adresse de p->suivant est %p \n",p);
    printf(" L'element que vous avez saisie est :%d est a l'adresse %p\n",p->val,p);
    p=p->suivant;
    }
    }
    printf("\n AFFICHAGE DE LA LISTE APRES INSERTION FIN \n");
    p=tete;
     
    while(p->suivant != NULL)
    {
    printf(" L'element que vous avez saisie est :%d \n",p->val);
    p=p->suivant;
    }
    }
    et j'ai trouve une difficulte a inserer une case a la fin et au milieu de liste??
    probleme de p et p->suivant
    Merci pour vous aides

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Généralement quand j'insère en fin de liste,
    • Soit j'utilise un chaînage double, auquel cas pas de problème
    • Soit quand je parcoure la liste, j'utilise un pointeur de pointeur, pointant sur le pointeur à modifier.


    PS: Tu devrais faire deux structures séparées "chainon" et "liste", pour éviter la confusion dont tu fais preuve dans ton code.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Points : 59
    Points
    59
    Par défaut
    je dois utiliser une liste simplement chainnee
    mais pour Tu devrais faire deux structures séparées "chainon" et "liste", pour éviter la confusion dont tu fais preuve dans ton code.
    c'est a dire qoui?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct element
    {
    	int val ;
    	struct  element *suivant;
    }*liste;
    est ce que la declaration de ma structure est fausse ?? comment je realise deux structures separes!!!

  4. #4
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Pour inserer à la fin, c' est tres simple. Il suffit de trouver le dernier element et de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nouveau=(liste*) malloc(...);
    dernier->suivant=nouveau;
    Pour l' insertion au milieu, tu peux faire pareil.
    Notons nouveau, l' element à inserer entre precedant et prochain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nouveau=(liste*) maloc(...);
    nouveau->suivant=precedant->suivant;
    /*nouveau->suivant pointe vers prochain */
    precedant->suiavant=nouveau;
    et le tour est joué.

    Le code sera plus lisible si tu utilise des fonction.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 22
    Points : 25
    Points
    25
    Par défaut
    Sinon la déclaration de ta structure est juste.

    En tout cas j'espère on m'a appris comme ça

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 40
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par ALIAS200 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct element
    {
    	int val ;
    	struct  element *suivant;
    }*liste; 
     
    //allocation de debut liste
    tete=(liste) malloc (sizeof (element));//c'est quoi "element"?
    }
    c'est quoi "element"?
    sinon tu voulais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct element
    {
    	int val ;
    	struct  element *suivant;
    }element; 
     element *liste,tete,...;
    //allocation de debut liste
    tete= malloc (sizeof (element));
    }
    smpinf

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    C'est surtout le typedef de cette même structure en liste qui est incorrect.
    Surtout qu'en suite tu utilises des liste*, alors que liste est déjà un type pointeur...

    (au passage, on ne caste pas le retour de malloc() en C).


    Ce que je conseille, c'est de séparer chaînon et liste:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct element
    {
    	int val ;
    	struct  element *pSuivant;
    } s_element, *p_element;
     
    typedef struct liste
    {
    	p_element pPremier;
    	p_element pDernier;
    } s_liste, *p_liste;

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Points : 59
    Points
    59
    Par défaut
    Salut,
    j'ai pas compris l'utilite de ce qui en rouge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct element
    {
    	int val ;
    	struct  element *pSuivant;
    } s_element, *p_element;
     
    typedef struct liste
    {
    	p_element pPremier;
    	p_element pDernier;
    } s_liste, *p_liste;


    et pourkoi tu a defini liste comme un structure ??? d'apres mes connaissance une liste chainee est un ensemble de case memoire(cellule --> element) ?????

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Parce que stocker les pointeurs dans une structure réduit la complexité du traitement, et ôte les dangers liés à l'emploi de double-pointeurs. Surtout quand on est débutant.

    ...Et surtout, ça me débarrasse de cet affeux "typedef element *liste" qui ne fait que générer de la confusion.

    Faire de la liste une structure à part entière rend le code plus clair et plus lisible. De plus, cela permet de stocker un pointeur vers le dernier élement, rendant plus facile l'ajout d'élément en bout de liste.

  10. #10
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Parce que stocker les pointeurs dans une structure réduit la complexité du traitement, et ôte les dangers liés à l'emploi de double-pointeurs. Surtout quand on est débutant.

    ...Et surtout, ça me débarrasse de cet affeux "typedef element *liste" qui ne fait que générer de la confusion.

    Faire de la liste une structure à part entière rend le code plus clair et plus lisible. De plus, cela permet de stocker un pointeur vers le dernier élement, rendant plus facile l'ajout d'élément en bout de liste.
    En fait ça s' appelle une liste symetrique où un element pointe à la fois vers l' element suivant et l' element qui le precede.
    Mais tu dois d' abord comprendre les listes simplement chainée avant d' en arriver là.

    Regarde un peu mon premier post, je t' ai expliquer comment faire pour inserer un element à la fin et au milieu.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    En fait ça s' appelle une liste symétrique où un élément pointe à la fois vers l' élément suivant et l' élément qui le précède.
    Mais tu dois d' abord comprendre les listes simplement chainée avant d' en arriver là.
    Perdu, je n'ai pas encore parlé de liste doublement chaînée.
    Ma structure est juste pour une liste simplement chaînée.

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 294
    Points : 59
    Points
    59
    Par défaut

    Donc la declaration d'une liste simplement chainnee est comment ????

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Le message #7 est la façon dont moi, je déclare les structures d'une liste simplement chaînée de int.

    Le pointeur sur le premier élément est indispensable, le pointeur sur le dernier sert juste à rendre plus rapide l'ajout en fin de liste (temps constant au lieu de temps linéaire).

Discussions similaires

  1. Copier image.ppm dans liste chaînée
    Par Neolex dans le forum Débuter
    Réponses: 48
    Dernier message: 07/06/2013, 14h56
  2. Réponses: 14
    Dernier message: 18/03/2012, 18h18
  3. Insertion dans liste chaînée circulaire
    Par Cladouros dans le forum Débuter
    Réponses: 13
    Dernier message: 17/10/2010, 20h22
  4. [Free Pascal] Insertion d'éléments dans une liste chaînée
    Par Pacorabanix dans le forum Free Pascal
    Réponses: 4
    Dernier message: 20/04/2010, 01h42
  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, 23h34

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