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


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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
    Oui en effet je me suis apperçu en testant qu'il y avait divers probleme...ceux dont tu parles et aussi si l'element à retirer est en tete de liste, ça ne fonctionne pas

    J'ai donc pensé faire plusieurs cas :
    si l'element à retirer en en tete
    si l'element à retirer est en queue
    si la liste ne contient qu'un seul element
    autres

    Voila je pense que ça suffit.
    Reste plus qu'à coder ça

  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
    J'ai corrigé 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
     
    /* Fonction qui retire un element precis */
    void retirer(list *p, int valeur)
    {
       /* Si la liste ne contient qu'un element */
       if ( (!p->pTete->pSuivant) && (p->pTete->val == valeur) )
       {
    		free(p->pTete);
    		p->pTete = NULL;
    		p->pQueue = NULL;
    		return;
    	}
    	/* Si l'element a supprimer est en tete de liste */
    	if( p->pTete->val == valeur )
    	{
    		node *tmp = p->pTete->pSuivant;
    		free(p->pTete);
    		p->pTete = tmp;
    		return;
    	}
    	/* Sinon */
    	{
    		node *prec = p->pTete;
    		node *tmp = p->pTete;
     
    		/* On se positionne sur l'element a supprimer */
    		while( (tmp) && (tmp->val != valeur) )
    		{
    			prec = tmp;
    			tmp = tmp->pSuivant;
    		}
    		if ( tmp )
    		{
    			/* Si l'element en en queue de liste */
    			if ( p->pQueue->val == valeur )
    			{
    				free(p->pQueue);
    				p->pQueue = prec;
    			}
    			else
    			{
    				prec->pSuivant = tmp->pSuivant;
    				free(tmp);
    			}
    		}
    		else
    		{
    			printf("Cet element n'est pas dans la liste.\n");
    		}
    	}
    }
    J'ai fais quelques tests, ça a l'air d'aller
    Mais encore rien de certain.

  3. #3
    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
    J'ai testé avec ce 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    int main()
    {
    	/* notre liste bientot chainée ! */
    	list maListe = {0};
     
    	/* On ajoute quelques elements */
       ajouter(&maListe,1);
       ajouter(&maListe,2);
       ajouter(&maListe,3);
     
       /* On affiche */
       printf("Avant :\n");
       afficher(&maListe);
     
       /* On le retire */
       printf("On retire 2 :\n");
       retirer(&maListe,2);
       /* On affiche */
       afficher(&maListe);
     
       printf("On retire 3 :\n");
       retirer(&maListe,3);
       /* On affiche */
       afficher(&maListe);
     
       printf("On retire 1 :\n");
       retirer(&maListe,1);
       /* On affiche */
       afficher(&maListe);
     
    	system("Pause");
    	return 0;
    }
    Ca marche pas du tout :
    Avant :
    1
    2
    3
    On retire 2 :
    1
    3
    On retire 3 :
    1
    3
    2
    On retire 1 :
    3
    2
    Appuyez sur une touche pour continuer...
    Je vois pas ce qui cloche dans le code

  4. #4
    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
    Je vois pas ce qui cloche dans le code
    Lorsqu'on retire le dernier élément, le précédent devient le dernier. Tu as bien mis à jour pQueue, mais dans l'élement final il manque la marque de fin.

    Le système d'affichage compte dessus et crac!

  5. #5
    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
    Je vois pas ce qui cloche dans le code
    Lorsqu'on retire le dernier élément, le précédent devient le dernier. Tu as bien mis à jour pQueue, mais dans l'élement final il manque la marque de fin.

    Le système d'affichage compte dessus et crac!
    Arf le NULL oui c'est vrai
    Mais comment ça se fait que le "2 reapparait alors qu'il est retiré juste avant
    On retire 2 :
    1
    3
    On retire 3 :
    1
    3
    2 <===

  6. #6
    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 correction faite !
    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
     
    /* Fonction qui retire un element precis */
    void retirer(list *p, int valeur)
    {
       /* Si la liste ne contient qu'un element */
       if ( (!p->pTete->pSuivant) && (p->pTete->val == valeur) )
       {
    		free(p->pTete);
    		p->pTete = NULL;
    		p->pQueue = NULL;
    		return;
    	}
    	/* Si l'element a supprimer est en tete de liste */
    	if( p->pTete->val == valeur )
    	{
    		node *tmp = p->pTete->pSuivant;
    		free(p->pTete);
    		p->pTete = tmp;
    		return;
    	}
    	/* Sinon */
    	{
    		node *prec = p->pTete;
    		node *tmp = p->pTete;
     
    		/* On se positionne sur l'element a supprimer */
    		while( (tmp) && (tmp->val != valeur) )
    		{
    			prec = tmp;
    			tmp = tmp->pSuivant;
    		}
    		if ( tmp )
    		{
    			/* Si l'element en en queue de liste */
    			if ( p->pQueue->val == valeur )
    			{
    				free(p->pQueue);
    				p->pQueue = prec;
    				p->pQueue->pSuivant = NULL;
    			}
    			else
    			{
    				prec->pSuivant = tmp->pSuivant;
    				free(tmp);
    				tmp = prec;
    			}
    		}
    		else
    		{
    			printf("Cet element n'est pas dans la liste.\n");
    		}
    	}
    }
    Tampon "lu et approuvé" ??

  7. #7
    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
    Arf le NULL oui c'est vrai
    Mais comment ça se fait que le "2 reapparait alors qu'il est retiré juste avant
    On retire 2 :
    1
    3
    On retire 3 :
    1
    3
    2 <===
    Parce que le chainage n'est pas détruit. C'est d'ailleurs dangereux, car le bloc n'est plus alloué. Il peut arriver n'importe quoi. Dans un systèmes très nerveux et très multitâche gérant des dizaines de listes en même temps (le moindre moteur de base de données, par exemple), les plantages peuvent être spéctaculaires !

  8. #8
    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 correction faite !
    <...>
    Tampon "lu et approuvé" ??

  9. #9
    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
    Parce que le chainage n'est pas détruit. C'est d'ailleurs dangereux, car le bloc n'est plus alloué. Il peut arriver n'importe quoi. Dans un systèmes très nerveux et très multitâche gérant des dizaines de listes en même temps (le moindre moteur de base de données, par exemple), les plantages peuvent être spéctaculaires !
    Je dois faire quelque chose ? ou ce n'est pas de mon ressort...[/quote]

  10. #10
    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 correction faite !
    <...>
    Tampon "lu et approuvé" ??


    Edit: enfin il reste encore la fonction clear à faire..facile maintenant !

  11. #11
    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
    Je viens de pondre une fonction clear, elle semble fonctionner bien, je la poste en esperant un nouveau tampon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /* Fonction qui supprime entierement une liste chainée */
    void clearListe (list *p)
    {
    	while ( p->pTete )
    	{
    		node *tmp = p->pTete->pSuivant;
    		free(p->pTete);
    		p->pTete = tmp;
    	}
    }

  12. #12
    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
    Je viens de pondre une fonction clear, elle semble fonctionner bien, je la poste en esperant un nouveau tampon
    OK.

  13. #13
    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
    Je viens de pondre une fonction clear, elle semble fonctionner bien, je la poste en esperant un nouveau tampon
    OK.
    Bon super merci pour tout

    Listes doublements chainées, me voila !

  14. #14
    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
    Listes doublements chainées, me voila !

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Fan de Loulou ??
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. problème liste simplement chainée
    Par cyrill.gremaud dans le forum C
    Réponses: 9
    Dernier message: 04/12/2012, 15h40
  2. fusion de deux liste simplement chainée
    Par mdh12 dans le forum Débuter
    Réponses: 6
    Dernier message: 14/01/2010, 19h23
  3. Tri d'une pile avec liste simplement chainée
    Par thecabbages dans le forum C
    Réponses: 3
    Dernier message: 17/12/2009, 21h08
  4. question liste simplement chainée
    Par american dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/03/2009, 21h45
  5. Réponses: 3
    Dernier message: 25/10/2006, 19h08

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