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 :

Probleme liste simplement chaîné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 Probleme liste simplement chaînée
    Bonjour,

    Suite à mon autre post, je me relance dans les listes simplement chaînées...
    J'ai le fameux "erreur de segmentation", ce qui veut dire que j'accede à une zone de mémoire qui n'est pas pour mon programme, ceci probablement du à un mauvais usage d'un pointeur...

    J'ai cherché jusqu'à très tard hier mais j'ai pas trouvé l'erreur
    L'erreur intervient sur la fonction un élément :
    Voici la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct client
    	{
    		char *login;
    		char *passwd;
    		int fd;
    		struct client *suivant;
    	} client;
    Voici la fameuse fonction qui déraille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void ajouter_client (client** p, char log[16], char mdp[16], int fd)
    {
    	client* new = malloc(sizeof (client));
     
    	new->login = log;
    	new->passwd = mdp;
    	new->fd = fd;
    	new->suivant = NULL;
    	(*p)->suivant = new;
    }
    Son appel dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "liste.h"
    #include <stdio.h>
     
    int main&#40;&#41;
    &#123;
    	client *mes_clients = NULL;
     
    	ajouter_client&#40;&mes_clients,"momo","toto",5&#41;;
     
    	return 0;
    &#125;
    J'espere que vous aurez des meilleurs yeux que moi !
    Merci pour vos réponses
    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Re: Probleme liste simplement chaînée
    Voici la fameuse fonction qui déraille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void ajouter_client &#40;client** p, char log&#91;16&#93;, char mdp&#91;16&#93;, int fd&#41;
    &#123;
    	client* new = malloc&#40;sizeof &#40;client&#41;&#41;;
     
    	new->login = log;
    	new->passwd = mdp;
    	new->fd = fd;
    	new->suivant = NULL;
    	&#40;*p&#41;->suivant = new;
    &#125;
    Son appel dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "liste.h"
    #include <stdio.h>
     
    int main&#40;&#41;
    &#123;
    	client *mes_clients = NULL;
     
    	ajouter_client&#40;&mes_clients,"momo","toto",5&#41;;
     
    	return 0;
    &#125;
    J'espere que vous aurez des meilleurs yeux que moi !
    Merci pour vos réponses
    Sorry
    Alors je peux me tromper mais :
    tu passes en paramètre l'adresse de mes_clients
    la valeur associé à cette adresse est NULL (variable initialisé comme ça)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &#40;*p&#41;->suivant = new;
    donc là (*p) est NULL donc (*p)->suivant n'existe pas donc "segmentation fault"

    ce qu'il faudrait mettre serais plutot
    bien sur il faut à la base faire untest sur ton pointeur si il est NULL alors tu affecte simplement la valeur sinon tu affescte la valeur à *p->suivant

    voila

    en esperant ne pas m'être trompé

  3. #3
    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: Probleme liste simplement chaînée
    Citation Envoyé par sorry60
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void ajouter_client &#40;client** p, char log&#91;16&#93;, char mdp&#91;16&#93;, int fd&#41;
    &#123;
    	client* new = malloc&#40;sizeof &#40;client&#41;&#41;;
     
    	new->login = log;
    	new->passwd = mdp;
    	new->fd = fd;
    	new->suivant = NULL;
    	&#40;*p&#41;->suivant = new;
    &#125;
    Sinon pour eviter d'avoir a faire un test lors de l'insersion dans une liste chainee, le plus simple c'est (pardonnez moi mon pere) d'enfiler par l'avant :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct 	client
    &#123;
      char *login;
      char *passwd;
      int fd;
      struct client *suivant;
    &#125;	       	client;
     
    void		ajouter_client &#40;client** p, char log&#91;16&#93;, char mdp&#91;16&#93;, int fd&#41;
    &#123;
      client*	new;
     
      new = malloc&#40;sizeof&#40;*new&#41;&#41;;
      new->login = log;
      new->passwd = mdp;
      new->fd = fd;
      new->suivant = *p;                                  // tu places ton nouvel element devant l'actuel premier
      *p = new;                                                 // il devient l'actuel premier
      return;
    &#125;
     
    int			display_list&#40;client *list&#41;
    &#123;
      client		*current;
     
      current = list;
      while &#40;current&#41;
        &#123;
          printf&#40;"%s, %s\n", current->login, current->passwd&#41;;
          current = current->suivant;
        &#125;
      return &#40;0&#41;;
    &#125;
     
    int			main&#40;void&#41;
    &#123;
       client		*mes_clients;
     
       mes_clients = NULL;
       ajouter_client&#40;&mes_clients,"Momo", "Toto",5&#41;;
       ajouter_client&#40;&mes_clients,"Delphine", "Talaron", 42&#41;;
       ajouter_client&#40;&mes_clients,"His_log", "His_passwd", 21&#41;;
       ajouter_client&#40;&mes_clients,"The_fourth_one", "xxxx", 84&#41;;
       ajouter_client&#40;&mes_clients,"Last", "youwillneverfindit", 31415&#41;;
       display_list&#40;mes_clients&#41;;
       return &#40;0&#41;;
    &#125;
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  4. #4
    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
    Points : 6 498
    Points
    6 498
    Par défaut
    Soit on ajoute en tête comme le propose Jack_serious soit on ajoute en queue et là, il faut défiler toute la liste pour arriver au dernier éléement (celui ou ->suivant = NULL sinon on perd des infos.
    "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

  5. #5
    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 Trap D
    Soit on ajoute en tête comme le propose Jack_serious soit on ajoute en queue et là, il faut défiler toute la liste pour arriver au dernier éléement (celui ou ->suivant = NULL sinon on perd des infos.
    Ok donc en fait, j'ai fait n'importe quoi hier soir...
    Je m'y recolle !
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  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
    J'ai rectifié et commenté mes 3 fonctions.
    J'ai testé, elles ont l'air correctes mais je les poste quand même car vous avez surement des critiques à faire
    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
     
    #include "liste.h"
    #include <stdio.h>
    #include <stdlib.h>
     
    /* ********************************************************************************** */
    void ajouter_client &#40;client** p, char log&#91;16&#93;, char mdp&#91;16&#93;, int fd&#41;
    &#123;
       /* on créé un client à ajouter */
       client* new = malloc&#40;sizeof &#40;client&#41;&#41;;
     
       if &#40; new &#41;
       &#123;
    	   /* on remplit ses champs */
    	   new->login = log;
    	   new->passwd = mdp;
    	   new->fd = fd;
    	   new->suivant = *p;
    	   /* on le place en debut de liste */
    	   *p = new;
            &#125;
       else
       &#123;
          perror&#40;"malloc&#40;&#41;"&#41;;
       &#125;
    &#125; 
    /* ********************************************************************************** */
    void retirer_client&#40;client **p,int fd&#41;
    &#123;
       client *prec = malloc&#40;sizeof &#40;client&#41;&#41;;
     
       if &#40; prec &#41;
       &#123;
    	   /* si la liste est vide */
    	   if &#40; !p &#41;
    	   &#123;
                  /* rien à faire...*/
                  return;
    	   &#125;
    	   /* si la liste ne contient qu'un seul élément */
    	   if &#40; !&#40;&#40;*p&#41;->suivant&#41; &#41;
    	   &#123;
                  /* on libère l'element */
                  free&#40;*p&#41;;
                  /* on fait pointé la liste sur NULL */
                  p = NULL;
                  return;
               &#125;
               /* sinon on parcourt la liste jusqu'au bon client*/
               while &#40; p && &#40;&#40;*p&#41;->fd != fd&#41; &#41;
               &#123;
                  /* on sauvegarde l'element precédent */
                  prec = *p;
                  /* on passe au client suivant */
                  *p = &#40;*p&#41;->suivant;
               &#125;
               /* on saute l'element bientot supprimé */
               prec->suivant = &#40;*p&#41;->suivant;
               /* on supprime l'element */
               free&#40;*p&#41;;
               /* le client precedent devient le client actuel */
               *p = prec;
            &#125;
       else
       &#123;
          perror&#40;"malloc&#40;&#41;"&#41;;
       &#125;
    &#125;	
    /* ********************************************************************************** */
    void afficher_clients&#40;client *p&#41;
    &#123;
    	/* on parcourt la liste tant qu'il y a un client */
    	while &#40;p&#41;
    	&#123;
    		/* on affiche le champ du login de chaque client */
    		puts&#40;p->login&#41;;
    		/* on pointe sur le client suivant */
    		p = p->suivant;
    	&#125;
    &#125;
    /* ********************************************************************************** */
    Merci pour vos critiques
    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  7. #7
    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 rectifié et commenté mes 3 fonctions.
    J'ai testé, elles ont l'air correctes mais je les poste quand même car vous avez surement des critiques à faire
    Ne jamais oublier que malloc() peut echouer.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    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 rectifié et commenté mes 3 fonctions.
    J'ai testé, elles ont l'air correctes mais je les poste quand même car vous avez surement des critiques à faire
    Ne jamais oublier que malloc() peut echouer.
    Oui c'est vrai, je vais rectifer de suite.
    A part ça c'est ok ?

    Edit : c'est fait pour malloc
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  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
    Citation Envoyé par sorry60
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par sorry60
    J'ai rectifié et commenté mes 3 fonctions.
    J'ai testé, elles ont l'air correctes mais je les poste quand même car vous avez surement des critiques à faire
    Ne jamais oublier que malloc() peut echouer.
    Oui c'est vrai, je vais rectifer de suite.
    A part ça c'est ok ?
    Manque la libération...
    Pas de Wi-Fi à la maison : CPL

  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
    Citation Envoyé par Emmanuel Delahaye
    Manque la libération...
    La voici :
    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
     
    /* ********************************************************************************** */
    void clear_clients&#40;client **p&#41;
    &#123;
    	client* tmp = malloc&#40;sizeof &#40;client&#41;&#41;;
    	if &#40;tmp&#41;
    	&#123;
    		/* on parcourt la liste tant qu'il y a un client */
    		while&#40;&#40;*p&#41;->suivant&#41;
    		&#123;
    			tmp = &#40;*p&#41;->suivant;
    			/* on libère la mémoire occupée par un client */
    			free&#40;*p&#41;;
    			&#40;*p&#41; = tmp;
    		&#125;
    		free&#40;*p&#41;;
    	&#125;
    	else
    	&#123;
    		perror&#40;"malloc&#40;&#41;"&#41;;
    	&#125;
    &#125;
    /* ********************************************************************************** */
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  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
    Citation Envoyé par sorry60
    Citation Envoyé par Emmanuel Delahaye
    Manque la libération...
    La voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void clear_clients&#40;client **p&#41;
    &#123;
    	client* tmp = malloc&#40;sizeof &#40;client&#41;&#41;;
    	if &#40;tmp&#41;
    	&#123;
    		/* on parcourt la liste tant qu'il y a un client */
    		while&#40;&#40;*p&#41;->suivant&#41;
    		&#123;
    			tmp = &#40;*p&#41;->suivant;
    ??? Je ne comprend pas à quoi cert cette allocation.

    Qu'est-ce qui ne va pas avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void clear_clients&#40;client **p&#41;
    &#123;
       /* on parcourt la liste tant qu'il y a un client */
       while&#40;&#40;*p&#41;->suivant&#41;
       &#123;
          client* tmp = &#40;*p&#41;->suivant;
    Pas de Wi-Fi à la maison : CPL

  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
    Citation Envoyé par Emmanuel Delahaye
    Qu'est-ce qui ne va pas avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void clear_clients&#40;client **p&#41;
    &#123;
       /* on parcourt la liste tant qu'il y a un client */
       while&#40;&#40;*p&#41;->suivant&#41;
       &#123;
          client* tmp = &#40;*p&#41;->suivant;
    Oui c'est vrai...
    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
     
    /* ********************************************************************************** */
    void clear_clients&#40;client **p&#41;
    &#123;
    	/* on parcourt la liste tant qu'il y a un client */
    	while&#40;&#40;*p&#41;->suivant&#41;
    	&#123;
    		client* tmp = &#40;*p&#41;->suivant;
    		/* on libère la mémoire occupée par un client */
    		free&#40;*p&#41;;
    		&#40;*p&#41; = tmp;
    	&#125;
    	free&#40;*p&#41;;
    &#125;
    /* ********************************************************************************** */
    Maintenant, all is ok ?
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  13. #13
    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
    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
     
    /* ********************************************************************************** */
    void clear_clients&#40;client **p&#41;
    &#123;
    	/* on parcourt la liste tant qu'il y a un client */
    	while&#40;&#40;*p&#41;->suivant&#41;
    	&#123;
    		client* tmp = &#40;*p&#41;->suivant;
    		/* on libère la mémoire occupée par un client */
    		free&#40;*p&#41;;
    		&#40;*p&#41; = tmp;
    	&#125;
    	free&#40;*p&#41;;
    &#125;
    /* ********************************************************************************** */
    Maintenant, all is ok ?
    Je ne sais pas ce qu'est un 'client'. Dans une liste chainée, il y a des 'noeuds' (nodes). Ce sont les noeuds que l'on alloue, lie, délie et libère.

    Je pense que ce que tu appelles 'client' et en réalité une structure de données applicative. Il y a peut être des choses à libérer dedans aussi...

    J'utilise une liste chainée comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct list
    &#123;
       struct node *p_head;
       struct node *p_tail;
    &#125;;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct node
    &#123;
       struct node *p_next;
       struct node *p_prec; /* si doublement chainee */
       void *p_data;
    &#125;;
    Le code qui gère tout ça peut être unique quelque soient les données...
    Il suffit de créer les fonctions qui vont bien et de préciser les regles du jeu (les données doivent avoir une duréede vie >= aux noeuds de la chaine...)
    Pas de Wi-Fi à la maison : CPL

  14. #14
    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
    Un client est un typedef struct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct client
       &#123;
          char *login;
          char *passwd;
          int fd;
          struct client *suivant;
       &#125; client;
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  15. #15
    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
    Personnellement pour liberer une liste chainee dans sa globalite, j'utilise la recursivite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdlib.h>
     
    int             free_list&#40;t_elem *elem&#41;
    &#123;
      if &#40;elem->next&#41;
        free_list&#40;elem->next&#41;;
      free&#40;elem->data&#41;;
      free&#40;elem&#41;;
      return &#40;0&#41;;
    &#125;
    Note : deconseille si la liste contient quelques millions d'elements. Avec la recursivite on risque toujours de faire sauter sa pile.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  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
    Un client est un typedef struct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct client
       &#123;
          char *login;
          char *passwd;
          int fd;
          struct client *suivant;
       &#125; client;
    Ce qui me gène, c'est le mélange entre les données 'liste' et les données applicatives. Je préconise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct client
    &#123;
       char *login;
       char *passwd;
       int fd;
    &#125;;
    d'une part, et une structure de liste (node) comme préconisée ci-dessus...
    Pas de Wi-Fi à la maison : CPL

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct node
    &#123;
       struct node *p_next;
       struct node *p_prec; /* si doublement chainee */
       void *p_data;
    &#125;;
    Moi ce qui me gêne c'est que je ne maitrise pas le type void..
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  18. #18
    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
    Moi ce qui me gêne c'est que je ne maitrise pas le type void..
    Il n'y a rien à maitriser. Il suffit d'être réveillé, c'est tout.
    Pas de Wi-Fi à la maison : CPL

  19. #19
    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
    Il n'y a rien à maitriser. Il suffit d'être réveillé, c'est tout.
    Ok je vais voir ce que ça donne
    Mais je vois pas comment (avec ton systeme) enlever un élément precis d'une liste (dans mon cas, le client qui s'appelle "toto" par exemple..)
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  20. #20
    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
    Les prototypes des fonctions seraient comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void ajouter_element&#40;list **p_list,void *p_data&#41;;
    void retirer_element&#40;list **p_list,void data&#41;;
    : :
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

Discussions similaires

  1. [Liste simplement chaînée] comment passer d'un élément à un autre ?
    Par beegees dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 18/02/2008, 23h32
  2. [Liste simplement chaînée] Dois-je allouer si Premier est NULL ?
    Par beegees dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 17/02/2008, 18h48
  3. [TP] Tri rapide pour liste simplement chaînée
    Par druzy dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 25/11/2007, 16h52

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