Copie d'une liste doublement chainée

Copie d'une liste doublement chainée - C++ - Programmation

Marsh Posté le 11-11-2002 à 18:54:44    

Salut, j'ai un petit probleme avec une fonction qui retourne une copie d'une liste doublement chainée entrée en paramètre.
 
J'ai un truc qui donne ca:

Code :
  1. t_list * my_copy(t_dlist * list)
  2. {
  3.     t_list * list;
  4.     t_list * copy;
  5.     list = my_first(list); //renvoie le 1er elt de la liste
  6.     copy = my_alloc();  //alloue de la memoire
  7.     copy = list;
  8.    
  9.     while (NULL != list) {
  10.         copy->next = list->next;
  11.         list = my_next(my_list); //renvoie l'element suivant
  12.     }
  13.     return copy;
  14. }


 
La structure des données ressemble à ca:

Code :
  1. struct s_list {
  2.     struct s_list * prev;
  3.     struct s_list * next;
  4.     void * data;
  5. };
  6. typedef struct s_list t_list;


 
quelqu'un pourrais m'expliquer comment faire?  
 
 :jap:

Reply

Marsh Posté le 11-11-2002 à 18:54:44   

Reply

Marsh Posté le 11-11-2002 à 19:52:41    

le fait quelle soit doublement chainee c juste que il y a un lien vers lelement precedent?


Message édité par red faction le 11-11-2002 à 19:53:28
Reply

Marsh Posté le 11-11-2002 à 20:36:55    

red faction a écrit a écrit :

le fait quelle soit doublement chainee c juste que il y a un lien vers lelement precedent?




 
oui  :)

Reply

Marsh Posté le 11-11-2002 à 21:37:55    

dis moi toua!!
tu serais pas de l INSIA par hazard  
 
lol
 
 


---------------
http://nikauch.dyndns.org/board/
Reply

Marsh Posté le 11-11-2002 à 22:13:47    

Salut à toi, neokill@h
Plusieurs remarques :
 
1/ Quand tu écris :
 

Citation :


copy = my_alloc();  //alloue de la memoire  
copy = list;  


 
ta deuxième ligne annule la première ! Ta fonction d'allocation te renvoie l'adresse d'une zone mémoire libe pour ton pointeur "copy", mais à la ligne du dessous tu remplaces cette adresse par celle contenue dans "list". En gros, "copy" n'est pas un double de "list", mais le même objet avec deux noms différents.
 
Je pense que ce que tu veux faire ressemble plutôt à ça :
 
copy = my_alloc();  //alloue de la memoire  
*copy = *list;      //duplique le contenu de "list" dans "copy"
 
2/ Ce que tu viens de faire, c'est uniquement la copie du premier élément de ta liste : il faut également faire cette opération pour les autres éléments.
 
3/ Du coup, tu devras modififer ta boucle. N'oublie pas de modifier "copy->prev", que tu avais oublié semble-t-il.
 
4/ Suivant la nature de "data", un memcpy sera peut-être le bienvenu.

Reply

Marsh Posté le 11-11-2002 à 22:44:02    

nikauch a écrit a écrit :

dis moi toua!!
tu serais pas de l INSIA par hazard  
 
lol
 
 
 




 
 :hello: camarade  :D

Reply

Marsh Posté le 11-11-2002 à 22:46:20    

Fork a écrit a écrit :

Salut à toi, neokill@h
Plusieurs remarques :
 
1/ Quand tu écris :
 

Citation :


copy = my_alloc();  //alloue de la memoire  
copy = list;  


 
ta deuxième ligne annule la première ! Ta fonction d'allocation te renvoie l'adresse d'une zone mémoire libe pour ton pointeur "copy", mais à la ligne du dessous tu remplaces cette adresse par celle contenue dans "list". En gros, "copy" n'est pas un double de "list", mais le même objet avec deux noms différents.
 
Je pense que ce que tu veux faire ressemble plutôt à ça :
 
copy = my_alloc();  //alloue de la memoire  
*copy = *list;      //duplique le contenu de "list" dans "copy"
 
2/ Ce que tu viens de faire, c'est uniquement la copie du premier élément de ta liste : il faut également faire cette opération pour les autres éléments.
 
3/ Du coup, tu devras modififer ta boucle. N'oublie pas de modifier "copy->prev", que tu avais oublié semble-t-il.
 
4/ Suivant la nature de "data", un memcpy sera peut-être le bienvenu.
 




 
merci pour ton aide  :jap: , je vais tester ca de suite...

Reply

Marsh Posté le 12-11-2002 à 02:09:45    

D'abord, il faut arrêter d'écrire n'importe quoi:

Code :
  1. t_list * my_copy(t_dlist * list)
  2. {
  3. t_list * list; //le compilateur n'a rien dit ?


Code :
  1. copy = my_alloc();  //alloue de la memoire
  2. copy = list; //censé copier list dans la mémoire allouée ou quoi ?


 
Ensuite, il faut donner des noms clairs pour s'y retrouver:

Code :
  1. struct node {
  2.    struct node * prev;
  3.    struct node * next;
  4.    void * data;
  5. };
  6. typedef struct node node;


Et ce n'est pas si compliqué:

Code :
  1. node* duplicate_node(node* src){
  2. node* dst= /*alloue un node*/;
  3. //duplique data si besoin
  4. return dst;
  5. }
  6. node* my_copy(node* from) //pemier node de la liste source{
  7.    node *copy, *fromcur, *copycur;
  8. if(from==NULL) return NULL; //vite réglé !
  9. //copier le premier
  10.    copy= duplicate_node(from);
  11. //copie vers la fin
  12. fromcur= from;
  13. copycur= copy;
  14. while(fromcur->next != NULL){
  15.  node* temp= duplicate_node(fromcur);
  16.  copycur->next= &temp;
  17.  temp->prev= ©cur;
  18.  copycur= copycur->next;
  19.  fromcur= fromcur->next;
  20. }
  21. copycur->next= NULL; //terminer la fin
  22. //copie vers le début
  23. fromcur= from;
  24. copycur= copy;
  25. while(fromcur->prev != NULL){
  26.  node* temp= duplicate_node(fromcur);
  27.  copycur->prev= &temp;
  28.  temp->next= ©cur;
  29.  copycur= copycur->prev;
  30.  fromcur= fromcur->prev;
  31. }
  32. copycur->prev= NULL; //terminer le début
  33.    return copy;
  34. }


Attention, c'est du garanti 100% non-testé, donc tu va peut-être devoir faire et comprendre quand même...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

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