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 doublement chainée


Sujet :

C

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Liste doublement chainée
    Salut !

    Je me lance dans les listes doublement chainées.
    J'ai implémenté les 2 premieres fonctions de base : l'ajout en tete, et l'affichage.
    Elles ont l'air correctes, mais je préfère en être sur avant de continuer donc je vous poste mon code et si des choses ne vont pas n'hesitez pas !

    Le .h
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct noeud
    {
    	int val;
    	struct noeud *pSuiv;
    	struct noeud *pPrec;
    }noeud;
     
    typedef struct list
    {
    	noeud *pTete;
    	noeud *pQueue;
    }list;
    listed.c :
    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
    #include "listed.h"
     
    /* Fonction qui ajoute un element en debut de liste */
    void ajouter(list *p, int valeur)
    {
    	noeud *nouv = malloc(sizeof(*nouv));
     
    	if(nouv)
    	{
    		nouv->val = valeur;
    		/* Si la liste est vide */
    		if(!p->pTete)
    		{
    			nouv->pSuiv = NULL;
    			nouv->pPrec = NULL;
    			p->pTete = nouv;
    			p->pQueue = nouv;
    		}
    		else
    		{
    			nouv->pPrec = NULL;
    			nouv->pSuiv = p->pTete;
    			p->pTete->pPrec = nouv;
    			p->pTete = nouv;
    		}
    	}
    	else
    	{
    		perror("malloc()");
    	}
    }
     
    /* Fonction qui affiche la liste */
    void afficher(list *p)
    {
    	noeud *tmp = p->pTete;
     
    	while(tmp)
    	{
    		printf("%d\n",tmp->val);
    		tmp = tmp->pSuiv;
    	}
    }
    Et le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "listed.h"
     
    int main()
    {
    	list maListe = {0};
     
    	ajouter(&maListe,1);
    	ajouter(&maListe,2);
    	ajouter(&maListe,3);
    	afficher(&maListe);
     
    	system("Pause");
    	return 0;
    }
    Voila, merci à vous pour vos remarques

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par sorry60
    Salut !

    Je me lance dans les listes doublement chainées.
    J'ai implémenté les 2 premieres fonctions de base : l'ajout en tete, et l'affichage.
    • Il manque les gardes dans le listed.h (idem dans le code de la liste simple : liste.h)
    • Il manque les prototypes des fonctions dans listed.h
    • Avec les listes doubles (et simples, aussi, d'ailleurs), il faut préciser si on ajoute en tête ou en queue. C'est soit un paramètre, soit deux fonctions séparées...
    • Fuites mémoire...
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      SYSALLOC Bloc 003D24C8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
      SYSALLOC Bloc 003D24E0 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
      SYSALLOC Bloc 003D24F8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par Emmanuel Delahaye
    • Il manque les gardes dans le listed.h (idem dans le code de la liste simple : liste.h)
    • Il manque les prototypes des fonctions dans listed.h
    • Avec les listes doubles (et simples, aussi, d'ailleurs), il faut préciser si on ajoute en tête ou en queue. C'est soit un paramètre, soit deux fonctions séparées...
    • Fuites mémoire...
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      SYSALLOC Bloc 003D24C8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
      SYSALLOC Bloc 003D24E0 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
      SYSALLOC Bloc 003D24F8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    Ok merci pour ces critiques, je m'occuppe de ça tres vite.
    Juste une question : c'est quoi une garde ? (ifdef _cplusplus...?)

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par sorry60
    Juste une question : c'est quoi une garde ? (ifdef _cplusplus...?)
    Protection anti inclusions multiples.

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    D'ici, je ne vois pas vraiment de problème. Ta fonction d'ajout en tête semble OK...
    Sinon, oui, il faudra prévoir une fonction pour vider...

    Et si tu es maniaque, tu fais une version const et une versin non-const de chaque fonction: http://www.isty-info.uvsq.fr/~fbenoit/ListeDblChainee.h



    (Oui, c'est là-dessus que je bosse en ce moment... Les grands esprits se rencontrent )

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Médinoc
    D'ici, je ne vois pas vraiment de problème. Ta fonction d'ajout en tête semble OK...
    Sinon, oui, il faudra prévoir une fonction pour vider...

    Et si tu es maniaque, tu fais une version const et une versin non-const de chaque fonction: http://www.isty-info.uvsq.fr/~fbenoit/ListeDblChainee.h



    (Oui, c'est là-dessus que je bosse en ce moment... Les grands esprits se rencontrent )
    J'y vais petit à petit avec les listes, merci pour ton exo, ça en fait un de plus, c'est pas un mal

  7. #7
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par Emmanuel Delahaye
    [*]Fuites mémoire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SYSALLOC Bloc 003D24C8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    SYSALLOC Bloc 003D24E0 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    SYSALLOC Bloc 003D24F8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    Comment tu fais pour reperer les fuites memoires ? Qu'utilises tu ?

  8. #8
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par Jack_serious
    Citation Envoyé par Emmanuel Delahaye
    [*]Fuites mémoire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SYSALLOC Bloc 003D24C8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    SYSALLOC Bloc 003D24E0 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    SYSALLOC Bloc 003D24F8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    Comment tu fais pour reperer les fuites memoires ? Qu'utilises tu ?
    Son propre traqueur il me semble... SYSALLOC il s'appelle, je crois (sur son site, dans les modules si cela n'a pas changé depuis le temps...)

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par Pouic
    Citation Envoyé par Jack_serious
    Citation Envoyé par Emmanuel Delahaye
    [*]Fuites mémoire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SYSALLOC Bloc 003D24C8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    SYSALLOC Bloc 003D24E0 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    SYSALLOC Bloc 003D24F8 (12 bytes) malloc'ed at line 8 of 'listed.c' not freed
    Comment tu fais pour reperer les fuites memoires ? Qu'utilises tu ?
    Son propre traqueur il me semble... SYSALLOC il s'appelle, je crois (sur son site, dans les modules si cela n'a pas changé depuis le temps...)
    Voui.

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module SYSALLOC

  10. #10
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60
    Juste une question : c'est quoi une garde ? (ifdef _cplusplus...?)
    Protection anti inclusions multiples.

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser


    Oui je les avais mais ça compilait pas
    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
     
    #ifndef LISTED_H
    #define LISTED_H
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct noeud
    {
    	int val;
    	struct noeud *pSuiv;
    	struct noeud *pPrec;
    }noeud;
     
    typedef struct list
    {
    	noeud *pTete;
    	noeud *pQueue;
    }list;
    1 C:\Documents and Settings\Thomas\Mes documents\Langage C\Exercices\Listes\DoublementChainée\listed.c In file included from listed.c
    1:2 C:\Documents and Settings\Thomas\Mes documents\Langage C\Exercices\Listes\DoublementChainée\listed.h invalid preprocessing directive #ifndef

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par sorry60


    Oui je les avais mais ça compilait pas
    Et le #endif, il est où ? Et je recommande H_LISTED pour éviter de commencer un jour par E, qui est reservé...

  12. #12
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Re: Liste doublement chainée
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60

    Oui je les avais mais ça compilait pas
    Et le #endif, il est où ?
    Arf quel idiot !

  13. #13
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai corrigé mon projet..
    Voilà ce que ça donne

    listed.h
    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
    #ifndef H_LISTED
    #define H_LISTED
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct noeud
    {
    	int val;
    	struct noeud *pSuiv;
    	struct noeud *pPrec;
    }noeud;
     
    typedef struct list
    {
    	noeud *pTete;
    	noeud *pQueue;
    }list;
     
    /* Fonction qui ajoute un element en debut de liste */
    void ajouterTete(list *p, int valeur);
     
    /* Fonction qui affiche la liste */
    void afficher(list *p);
    #endif
    listed.c
    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
    #include "listed.h"
     
    /* Fonction qui ajoute un element en debut de liste */
    void ajouterTete(list *p, int valeur)
    {
    	noeud *nouv = malloc(sizeof(*nouv));
     
    	if(nouv)
    	{
    		nouv->val = valeur;
    		/* Si la liste est vide */
    		if(!p->pTete)
    		{
    			nouv->pSuiv = NULL;
    			nouv->pPrec = NULL;
    			p->pTete = nouv;
    			p->pQueue = nouv;
    		}
    		else
    		{
    			nouv->pPrec = NULL;
    			nouv->pSuiv = p->pTete;
    			p->pTete->pPrec = nouv;
    			p->pTete = nouv;
    		}
    	}
    	else
    	{
    		perror("malloc()");
    	}
    }
     
    /* Fonction qui affiche la liste */
    void afficher(list *p)
    {
    	noeud *tmp = p->pTete;
     
    	while(tmp)
    	{
    		printf("%d\n",tmp->val);
    		tmp = tmp->pSuiv;
    	}
    }
     
    /* Fonction qui libère la liste */
    void clearListe(list *p)
    {
    	while(p->pTete)
    	{
    		free(p->pTete);
    		p->pTete = p->pTete->pSuiv;
    	}
    }
    le main
    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
    #ifdef __cplusplus
    #error Be sure you are using a C compiler...
    #endif
     
    #include "listed.h"
     
    int main()
    {
    	list maListe = {0};
     
    	printf("On ajoute 3 elements...:\n");
    	ajouterTete(&maListe,1);
    	ajouterTete(&maListe,2);
    	ajouterTete(&maListe,3);
    	afficher(&maListe);
    	printf("On clear la liste...:\n");
    	clearListe(&maListe);
    	afficher(&maListe);
     
    	system("Pause");
    	return 0;
    }
    C'est ok ?

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sorry60
    J'ai corrigé mon projet..
    Voilà ce que ça donne
    <...>
    C'est ok ?
    Manque le prototype de clearListe() dans le header... Il ne le voit pas ton compilateur ?

    avec "-Wall -Wextra -O2", il devrait.

    J'ai un peu instrumenté l'affichage
    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
     
    /* Fonction qui affiche la liste */
    void afficher(list *p)
    {
       noeud *tmp = p->pTete;
     
    #if DBG
       printf(" pTete = %p\n",(void *) p->pTete);
       printf("pQueue = %p\n",(void *) p->pQueue);
    #endif
     
       while(tmp)
       {
          printf("%d\n",tmp->val);
          tmp = tmp->pSuiv;
       }
    }
    et on voit que le pointeur de queue n'est pas mis à jour...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    On ajoute 3 elements...:
     pTete = 003D24F8
    pQueue = 003D24C8
    3
    2
    1
    On clear la liste...:
     pTete = 00000000
    pQueue = 003D24C8

  15. #15
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60
    J'ai corrigé mon projet..
    Voilà ce que ça donne
    <...>
    C'est ok ?
    Manque le prototype de clearListe() dans le header... Il ne le voit pas ton compilateur ?

    avec "-Wall -Wextra -O2", il devrait.
    Je compile avec les options
    -Wall -Wextra -ansi -O2
    et non il ne voit pas et moi non plus..je suis mal reveillé ce matin

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sorry60
    Je compile avec les options
    -Wall -Wextra -ansi -O2
    et non il ne voit pas et moi non plus..je suis mal reveillé ce matin
    Il n'y a pas de warning ? -Wextra est bien pris (les gcc plus anciens utilisaient -W)

  17. #17
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60
    Je compile avec les options
    -Wall -Wextra -ansi -O2
    et non il ne voit pas et moi non plus..je suis mal reveillé ce matin
    Il n'y a pas de warning ? -Wextra est bien pris (les gcc plus anciens utilisaient -W)
    Non pas de warning
    J'ai la derniere version de DevCpp

  18. #18
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Voici une fonction qui supprime un élément :

    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
    /* Fonction qui supprime un element */
    void supprimer(list *p, int valeur)
    {
    	/* Si la liste est deja vide */
    	if(!p->pTete)
    	{
    		return;
    	}
    	/* Si c'est le seul element */
    	if( (!p->pTete->pSuiv) && (p->pTete->val == valeur) )
    	{
    		free(p->pTete);
    		p->pTete = NULL;
    		return;
    	}
    	/* Si l'element à supprimer est en tete */
    	if(p->pTete->val == valeur)
    	{
    		noeud *tmp = p->pTete->pSuiv;
    		free(p->pTete);
    		tmp->pPrec = NULL;
    		p->pTete = tmp;
    		return;
    	}
    	/* Sinon on parcourt la liste...*/
    	{
    		noeud *tmp = p->pTete;
     
    		while(tmp && (tmp->val != valeur) )
    		{
    			tmp = tmp->pSuiv;
    		}
    		if(tmp)
    		{
    			/* Si c'est la queue */
    			if(tmp == p->pQueue)
    			{
    				tmp = p->pQueue->pPrec;
    				free(p->pQueue);
    				tmp->pSuiv = NULL;
    				p->pQueue = tmp;
    			}
    			/* Sinon */
    			else
    			{
    				noeud *tmp2 = tmp->pSuiv;
    				tmp2->pPrec = tmp->pPrec;
    				tmp2 = tmp->pPrec;
    				tmp2->pSuiv = tmp->pSuiv;
    				free(tmp);
    			}
    		}
    	}
    }
    Elle semble bien fonctionner.
    Par contre, je saisis pas trop l'interet d'une liste doublement chainée par rapport à la simplement chainée dans les fonctions que j'ai faite..

    Si vous avez des idées d'exercices qui mettraient en valeur ça

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    La liste doublement chaînée peut être parcourue à l'envers, et aussi, on peut retrouver le début et la fin à partir de n'importe que chaînon, on peut supprimer un chaînon sans avoir besoin de garder un pointeur sur le précédent, etc.

    La liste est assez longue, mais voici ce qui me vient le plus vite à l'esprit.

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sorry60
    Voici une fonction qui supprime un élément :
    Ca a l'air correct, mais il y a toujours un problème de mise à jour de pQueue à la fin...
    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
     
    On ajoute 3 elements...:
     pTete = 003D24F8
    pQueue = 003D24C8
    3
    2
    1
    Suppression 2
     pTete = 003D24F8
    pQueue = 003D24C8
    3
    1
    Suppression 1
     pTete = 003D24F8
    pQueue = 003D24F8
    3
    Suppression 3
     pTete = 00000000
    pQueue = 003D24F8
    On clear la liste...:
     pTete = 00000000
    pQueue = 003D24F8
    avec
    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
     
    #include "listed.h"
     
    int main()
    {
       list maListe = {0};
     
       printf("On ajoute 3 elements...:\n");
       ajouterTete(&maListe,1);
       ajouterTete(&maListe,2);
       ajouterTete(&maListe,3);
       afficher(&maListe);
     
       printf("Suppression 2\n");
       supprimer(&maListe,2);
       afficher(&maListe);
     
       printf("Suppression 1\n");
       supprimer(&maListe,1);
       afficher(&maListe);
     
       printf("Suppression 3\n");
       supprimer(&maListe,3);
       afficher(&maListe);
     
       printf("On clear la liste...:\n");
       clearListe(&maListe);
       afficher(&maListe);
     
       return 0;
    }
    Par contre, je saisis pas trop l'interet d'une liste doublement chainée par rapport à la simplement chainée dans les fonctions que j'ai faite..

    Si vous avez des idées d'exercices qui mettraient en valeur ça
    Ca sert, par exemple, à réaliser un traitement de texte. On peut facilement parcourir les lignes de haut en bas, insérer, supprimer... Pour des déplacemements relatifs (top, end, up, down) les fonctions du même nom peuvent aider. Elle s'appuient sur un troisième pointeur (pCurrent)
    • top : pCurrent := pHead
    • end : pCurrent := pQueue
    • up : pCurrent := pCurrent->pPrec
    • down : pCurrent := pCurrent->pNext

    évidemment, on fait attention aux limites...

    Pareil avec des menus dynamiques...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. liste doublement chainée
    Par gorgonite dans le forum Caml
    Réponses: 16
    Dernier message: 30/07/2007, 15h17
  2. liste doublement chainée
    Par Ucom-C++ dans le forum C
    Réponses: 11
    Dernier message: 07/06/2007, 13h34
  3. Réponses: 2
    Dernier message: 24/03/2007, 12h48
  4. Problème sur les listes doublement chainée
    Par Traouspont dans le forum C
    Réponses: 5
    Dernier message: 05/01/2007, 12h02
  5. Pb Liste doublement chainée template
    Par ederf dans le forum Langage
    Réponses: 5
    Dernier message: 19/11/2006, 10h35

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