Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1004 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Liste chaibee Double Probleme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Liste chaibee Double Probleme

n°1505742
kaiser52
Posté le 22-01-2007 à 02:40:51  profilanswer
 

Salut a vous,
 
Debutant le C, je cherche a faire des listes chaine doubles
Sauf que j'ai un tres gros probleme avec le parametre prev de ma liste chainee, donc j'ai refais mon code pour les listes chainees basic, se qui donne :
 

Citation :

int  mettre_dans _la_liste(t_l_a **debut, void *param)
{
  t_l_a  *new_elem;
 
  if ((new_elem = malloc(sizeof(*new_elem))) == NULL)
      exit(-1);
  new_elem->data = param;
  new_elem->next = *debut;
  *debut = new_elem;
  return (0);
}


 
Donc je n'arrive pas a adaptater mon code pour les listes chainees doubles, je sais que prev doit pointer sur 0 quand le next pointe sur le premier, et ainsi de suite, mais je n'y arrive pas, je vous remercis pour votre eventuel aide.

mood
Publicité
Posté le 22-01-2007 à 02:40:51  profilanswer
 

n°1505853
Ace17
Posté le 22-01-2007 à 12:03:47  profilanswer
 

Je te conseille d'utiliser une sentinelle, tu te casseras moins la tete. C'est a dire que tu rajoutes un element "bidon" en debut de liste de maniere a ne jamais avoir a traiter le cas particulier ou la liste est "vide".  
Pour des listes doublement chainees, tu auras egalement besoin d'une sentinelle en fin de liste.
Evidemment, au niveau utilisateur de la liste, les sentinelles n'apparaissent pas.

n°1505980
Sve@r
Posté le 22-01-2007 à 16:45:14  profilanswer
 

kaiser52 a écrit :

Salut a vous,
 
Debutant le C, je cherche a faire des listes chaine doubles
Sauf que j'ai un tres gros probleme avec le parametre prev de ma liste chainee, donc j'ai refais mon code pour les listes chainees basic, se qui donne :
 

Citation :

int  mettre_dans _la_liste(t_l_a **debut, void *param)
{
  t_l_a  *new_elem;
 
  if ((new_elem = malloc(sizeof(*new_elem))) == NULL)
      exit(-1);
  new_elem->data = param;
  new_elem->next = *debut;
  *debut = new_elem;
  return (0);
}


 
Donc je n'arrive pas a adaptater mon code pour les listes chainees doubles, je sais que prev doit pointer sur 0 quand le next pointe sur le premier, et ainsi de suite, mais je n'y arrive pas, je vous remercis pour votre eventuel aide.


 
En lisant ton code, je vois que tu rajoutes chaque nouvel élément au début de la liste. Bon, t'es libre de ton choix mais je voulais juste être certain que ce que je lis est bien ce que tu veux faire.
 
Pour rajouter un pointeur "prev" pointant vers le précédent, il te suffit de rajouter


new_elem->next = *debut;     // On remplit le "next" de l'élément créé
new_elem->prev=NULL;          // L'élément créé n'a pas de "prev"
if (*debut != NULL)                // Si la liste n'est pas vide
    (*debut)->prev=new_elem;   // Le précédent du premier élément pointe vers le nouvel élément (qui deviendra le premier)
*debut = new_elem;             // Le début de la liste devient le nouvel élément


 
Maintenant, je te conseillerais de créer une seconde structure que tu pourrais appeler "liste_t" qui te permettra de manipuler ta liste. Même si cette structure ne contient qu'un pointeur vers le premier élément de ta liste et que ça te semble donc inutile vu que t'as déjà le début, tu verras à l'usage que ça simplifie énormément le travail car si un jour tu veux rajouter d'autres outils de gestion de ta liste comme par exemple un indicateur du nb d'élément ou autre truc, il te suffira de rajouter ces outils dans cette structure et t'auras que très peu de modif à faire.
 
Sinon je suis très inquiet par ta ligne "new_elem->data = param;" car si "param" est un pointeur sur une variable "auto" (venant par exemple de la fonction appelante) alors une fois que cette fonction sera terminée tu auras récupéré dans "new_elem->data" un pointeur ne pointant vers plus rien de concret => gros bug lors de la relecture de ta liste !!!
Maintenant, si dans la fonction appelante cette variable "data" pointe vers une zone mémoire allouée par "malloc" alors pas de problème. A toi de voir mais il fallait que ce soit dit. C'est bien de manipuler les pointeurs comme tu le fais mais faut jamais oublier la durée de vie de la variable pointée...
 

Ace17 a écrit :

Je te conseille d'utiliser une sentinelle, tu te casseras moins la tete. C'est a dire que tu rajoutes un element "bidon" en debut de liste de maniere a ne jamais avoir a traiter le cas particulier ou la liste est "vide".  
Pour des listes doublement chainees, tu auras egalement besoin d'une sentinelle en fin de liste.
Evidemment, au niveau utilisateur de la liste, les sentinelles n'apparaissent pas.


Très franchement, mettre le dernier "next" à NULL (et le premier "prev" à null dans le cas d'une liste double) est déjà une très bonne sentinelle...


Message édité par Sve@r le 22-01-2007 à 23:03:09

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1506056
Tamahome
⭐⭐⭐⭐⭐
Posté le 22-01-2007 à 20:27:43  profilanswer
 

Ace17 a écrit :

Je te conseille d'utiliser une sentinelle, tu te casseras moins la tete. C'est a dire que tu rajoutes un element "bidon" en debut de liste de maniere a ne jamais avoir a traiter le cas particulier ou la liste est "vide".  
Pour des listes doublement chainees, tu auras egalement besoin d'une sentinelle en fin de liste.
Evidemment, au niveau utilisateur de la liste, les sentinelles n'apparaissent pas.


 
c'est de la bidouille ca, pas de la programmation.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Liste chaibee Double Probleme

 

Sujets relatifs
Petit problème de conception (UML)callback vers un fonction membre, sans parametre "user"
[HTML/CSS] Problème affichage d'imagesGénerer un xml (rss) a partir d'une base de données mySQL
Selectionner aléatoirement un mot d'une listeaide pour un problème de décalage de texte en CSS
XPath4as2 / problème avec l'axe "descendant"Probléme requete sql = unknow column
Problème pour fixer l'image de fondEncore un petit probleme
Plus de sujets relatifs à : [C] Liste chaibee Double Probleme


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR