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

  FORUM HardWare.fr
  Programmation
  C++

  Copie d'une liste doublement chainée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Copie d'une liste doublement chainée

n°243117
neokill@h
Tss tss tss!!
Posté le 11-11-2002 à 18:54:44  profilanswer
 

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:

mood
Publicité
Posté le 11-11-2002 à 18:54:44  profilanswer
 

n°243133
red factio​n
Posté le 11-11-2002 à 19:52:41  profilanswer
 

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
n°243146
neokill@h
Tss tss tss!!
Posté le 11-11-2002 à 20:36:55  profilanswer
 

red faction a écrit a écrit :

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




 
oui  :)

n°243185
nikauch
http://nikauch.dyndns.org
Posté le 11-11-2002 à 21:37:55  profilanswer
 

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


---------------
http://nikauch.dyndns.org/board/
n°243205
Fork
Posté le 11-11-2002 à 22:13:47  profilanswer
 

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.

n°243234
neokill@h
Tss tss tss!!
Posté le 11-11-2002 à 22:44:02  profilanswer
 

nikauch a écrit a écrit :

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




 
 :hello: camarade  :D

n°243235
neokill@h
Tss tss tss!!
Posté le 11-11-2002 à 22:46:20  profilanswer
 

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

n°243267
Musaran
Cerveaulté
Posté le 12-11-2002 à 02:09:45  profilanswer
 

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

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

  Copie d'une liste doublement chainée

 

Sujets relatifs
Copie automatique de fichiers...Liste déroulante et accès Oracle
Comment faire un liste un peu plu poilu qu'une simple java.awt.List ..Allocation d une liste chainee en c++
[VB6] ComboBox avec liste éditableCopie de menus Word depuis une application VBA
Copie de fichier1er pt ok. 2ime Recuper tous les champs d'une liste
ASP , une liste déroulante 
Plus de sujets relatifs à : Copie d'une liste doublement chainée


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