[C] Liste chaibee Double Probleme

Liste chaibee Double Probleme [C] - C - Programmation

Marsh Posté le 22-01-2007 à 02:40:51    

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.

Reply

Marsh Posté le 22-01-2007 à 02:40:51   

Reply

Marsh Posté le 22-01-2007 à 12:03:47    

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.

Reply

Marsh Posté le 22-01-2007 à 16:45:14    

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.
Reply

Marsh Posté le 22-01-2007 à 20:27:43    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed