Bonjour,
comment faire une copie d'une telle liste :
http://nicolasj.developpez.com/articles/listesimple/
merci.
Version imprimable
Bonjour,
comment faire une copie d'une telle liste :
http://nicolasj.developpez.com/articles/listesimple/
merci.
Oui c'est l'idée, naturellement. Mais comment l'écrire en C, concrètement ?
Je veux une 'vraie' copie, pas un simple lien.
Je ne vois pas ce qui t'ennuie. Si tu sais déjà créer une liste chaînée, alors tu en crées une seconde. Ça fonctionne exactement de la même façon.
Si cela vous semble si simple à tous les deux (je ne parle pas de l'algo mais de l'écriture effective du programme en C), est-ce que vous pouvez me montrer comment faire s'il vous plait, car je n'y arrive pas ?
Je parle d'ajouter une fonction à la bibliothèque, pour pouvoir faire une copie d'une liste quelconque, et je n'y arrive pas. Si vous savez comment faire, merci de partager.
Merci d'avance
Mais c'est bien là le problème, je ne sais pas comment écrire cela en C. Voilà le squelette de la fonction, merci de me montrer comment faire ce qui est commenté.
Code:
1
2
3
4
5
6
7
8
9
10
11
12 sll_s* sll_copy(sll_s* source_list) { sll_s* list_copy = sll_new (); sll_first (source_list); while (source_list->list != NULL) { //copier le contenu de sll_data(source_list) dans data_copy. sll_insert (list_copy, data_copy); sll_next (source_list); } }
Pourquoi ne pas copier une à une les structures de ta liste initiale à l'aide de memcpy, puis remettre les pointeurs en place une fois la copie faite :
exemple :
dans la fonction (pt_dest est le pointeur vers le premier item de la liste2 et pt source celui de la liste1) :Code:
1
2
3
4
5 struct item_liste { ... item_liste*next; };
Ceci devrait déjà te donner une idée. A priori si tu maitrise bien les listes tu ne devrais plus avoir de problème. Je ne t'ai pas tout fait (les mallocs par exemple)Code:
1
2
3
4
5
6
7
8
9 memcpy(pt_dest, pt_source, sizeof(item_liste)); pt1=pt_source->next; pt2=pt_dest; while(pt1!=NULL) { memcpy(pt2->next,pt1,sizeof(item_liste)); pt2=pt2->next; pt1=pt1->next; }
Cela me parait compliqué, je préfère suivre l'algorithme plus logique défini plus haut.
Je suis sur que Svear ou Obsidian ont une réponse bien plus simple étant donné la simplicité qu'ils voient dans cette question.
J'ai oublié de retourner la liste pour ma fonction.
Mais je ne vois toujours pas comment implémenter ce qui est en commentaires, merci de m'y aider.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 sll_s* sll_copy(sll_s* source_list) { sll_s* copy_list = sll_new (); sll_first (source_list); while (source_list->list != NULL) { //copier le contenu de sll_data(source_list) dans data_copy. sll_insert (copy_list, data_copy); sll_next (source_list); } return copy_list; }