Copier une partie d'une liste doublement chaînée

Copier une partie d'une liste doublement chaînée - C - Programmation

Marsh Posté le 30-11-2013 à 22:07:58    

Bonjour,
 
Je travaille actuellement sur un projet et je dois copier une partie d'une liste de structure doublement chaînée. Cette manipulation doit forcément être possible mais je ne vois pas comment y arriver...
 
Admettons la structure suivante
 

Code :
  1. typedef struct e
  2. {
  3.     char* name;
  4.     int nbr;
  5. } ELEMENT;
  6. typedef struct node
  7. {
  8.     ELEMENT data;
  9.     struct node* prev;
  10.     struct node* next;
  11. }*Liste


 
 
Je cherche à copier à partir d'un noeud de la liste, le reste de la liste, puis de mettre cette copie en bout de liste. Schématiquement ça donnerait :
 
A <-> Z <-> E <-> R <-> T <-> Y -> NULL , copie à partir de T, A <-> Z <-> E <-> R <-> T <-> Y <-> T <-> Y -> NULL
 
 
d'après ce que j'ai pu voir, je ne pense pas que la fonction memecop puisse réaliser ceci.
 
Et la fonction suivante ne marche pas :
 

Code :
  1. void coy_part(Liste l, ELEMENT source)
  2. {
  3.     Liste buffer = calloc(1,sizeof(source));
  4.     while(strcmp(l->data.name,source.name) !=0) //source.name = T
  5.     {
  6.         l = l->suiv;
  7.     }
  8.     buffer = l;
  9.     while(l->suiv ! = NULL)
  10.     {
  11.         l = l->suiv;
  12.     }
  13.     l->suiv = buffer;
  14. }


 
Dans ce cas là, le 2ème élement "T" aura pour prev toujours "R" et non "Y"
 
Je cherche donc ) me placer en "T", copier tout ce qui suit, et remplacer le "prev" du nouveau "T". Je sens que c'est un truc bête mais je ne le vois pas...
 
Auriez vous une solution ?


Message édité par chrisnilson le 30-11-2013 à 22:09:43
Reply

Marsh Posté le 30-11-2013 à 22:07:58   

Reply

Marsh Posté le 30-11-2013 à 23:02:56    

Bonjour !
 
Comme indiqué, il "suffit" de copier les éléments à dupliquer et "refaire les branchements, en nommant T(1) et Y(1) les éléments actuels et T(2) et Y(2) les éléments copiés :  
 
modification de la fin de la liste :  Y(1) -> T(2)  
 
On recâble tous les éléments copiés :  
 
 Y(1) <- T(2) -> Y(2)
 T(2) <- Y(2) -> NULL  
 
(le Y(2) -> NULL devrait déjà être bon ...
 
Et on obtient logiquement ce que vous cherchez.
 
 
Pour le faire, le mieux est de faire toutes les copies au départ et de les ajouter au fur et à mesure, par exemple en ayant un pointeur "élément avant", au départ initialisé à "Y(1)", puis en récupérant chaque nouvel élément copié C : élément avant <- C -> NULL, puis élément avant = C, et cela s'arrête tout seul. Ce n'est pas optimisé (puisqu'on fait deux affectations du suivant pour chaque élément sauf le dernier, mais cela a le mérite d'être simple).
 
Bonne continuation !


Message édité par Farian le 30-11-2013 à 23:07:00
Reply

Sujets relatifs:

Leave a Replay

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