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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Citation Envoyé par sorry60
    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
    Une liste doublement chainee est particulierement utile quand elle doit etre parcourue, et non pas seulement contenir des donnees.

    Exemple : un menu ou l'utilisateur doit choisir une option. Il appuis sur up_arrow, tu deplace ton pointeur vers le haut, il appuie sur down_arrow, tu deplace ton pointeur vers le bas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int		do_action(char *key_pressed)
    {
      if (is_up_arrow(key_pressed))
        current = current->prev;
      if (is_down_arrow(key_pressed))
        current = current->next;
      /*
      **
      */
      return (0);
    }
    C'est assez marrant a faire en fait.
    Il y a plein d'autres exemples, mais le menu utilisateur me semble etre le plus parlant.

  2. #2
    Membre éclairé 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
    Par défaut
    Voila j'ai corrigé mon code et fais des tests, je pense que maintenant c'est bon

    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
    26
    27
    28
    29
    30
    31
    32
    #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);
     
    /* Fonction qui libère la liste */
    void clearListe(list *p);
     
    /* Fonction qui supprime un element */
    void supprimer(list *p, int valeur);
     
    #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
    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #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;
    	}
    }
     
    /* 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;
    		p->pQueue = 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);
    			}
    		}
    	}
    }
    testé 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
    32
    33
    34
    35
    36
    37
    38
    39
    #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("La tete : %d\n",maListe.pTete->val);
    	printf("La queue : %d\n",maListe.pQueue->val);
     
    	printf("On supprime 1 :\n");
    	supprimer(&maListe,1);
    	afficher(&maListe);
    	printf("La tete : %d\n",maListe.pTete->val);
    	printf("La queue : %d\n",maListe.pQueue->val);
     
    	printf("On supprime 2 :\n");
    	supprimer(&maListe,2);
    	afficher(&maListe);
    	printf("La tete : %d\n",maListe.pTete->val);
    	printf("La queue : %d\n",maListe.pQueue->val);
     
    	printf("On supprime 3 :\n");
    	supprimer(&maListe,3);
    	afficher(&maListe);
    	printf("La tete : %p\n",maListe.pTete);
    	printf("La queue : %p\n",maListe.pQueue);
     
    	system("Pause");
    	return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    Voila j'ai corrigé mon code et fais des tests, je pense que maintenant c'est bon
    Ok. Juste un détail. On ne met les includes que là où ils sont nécessaires. Le header listed.h,n'a pas besoin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <stdio.h>
    #include <stdlib.h>
    qui doivent par contre être dans listed.c

    Si l'application en a besoin elle incluera ce quelle veut.

  4. #4
    Membre éclairé 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
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60
    Voila j'ai corrigé mon code et fais des tests, je pense que maintenant c'est bon
    Ok. Juste un détail. On ne met les includes que là où ils sont nécessaires. Le header listed.h,n'a pas besoin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <stdio.h>
    #include <stdlib.h>
    qui doivent par contre être dans listed.c

    Si l'application en a besoin elle incluera ce quelle veut.
    Ok, justement je me suis souvent posé la question

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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