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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void ajouter_element(list **p_list,void *p_data);
    void retirer_element(list **p_list,void data);
    : :
    A la manière de qsort(). Il faut probablement une fonction externe de traitement.

    En principe, on crée une fonction de parcours de la liste qui appelle une fonction utilisateur (callback) dont les paramètres sont au minimum l'adresse du noeud courant et probablement un pointeur void * sur le contexte utilisateur (NULL si non utilisé).
    Une fois qu'on a l'adresse du noeud à retirer, on appelle la fonction qui va bien pour refaire les liens et libérer ce qui doit l'être... Attention, les données de utilisateur (allocation/libération) sont de la responsabilité de celui-ci. Chacun son boulot.

    La générécité a un coût, sinon, on change de langage (par exemple, C++ et ses templates)
    Pas de Wi-Fi à la maison : CPL

  2. #22
    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
    Si on veut utiliser la récursivité, autant le faire bien :
    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
    t_elem *free_list(t_elem *elem)
    {
      if (elem->next)
        elem->next = free_list(elem->next);
      free(elem->data);
      free(elem);
      return NULL;
    }
     
    ou
     
    void free_list(t_elem *elem)
    {
      if (elem->next)
        free_list(elem->next);
      free(elem->data);
      free(elem);
      return;
    }
    "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

  3. #23
    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
    Citation Envoyé par Trap D
    Si on veut utiliser la récursivité, autant le faire bien :
    Certes... mais que reproches tu a mon code ?
    Le type int pour la fonction qui sert a rien ?

    Autre question:

    Citation Envoyé par Trap D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    t_elem *free_list(t_elem *elem)
    {
      if (elem->next)
        elem->next = free_list(elem->next);
      free(elem->data);
      free(elem);
      return NULL;
    }
    Pourquoi affecter un pointeur a un element que tu libere deux lignes plus bas ?
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  4. #24
    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 Jack_serious
    Citation Envoyé par Trap D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    t_elem *free_list(t_elem *elem)
    {
      if (elem->next)
        elem->next = free_list(elem->next);
      free(elem->data);
      free(elem);
      return NULL;
    }
    Pourquoi affecter un pointeur a un element que tu libere deux lignes plus bas ?
    Une histoire de branche sur laquelle on est assise et que l'on évite de couper...

    Google images, c'est magique !
    Pas de Wi-Fi à la maison : CPL

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, 22h32
  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, 17h48
  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, 15h52

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