La permutation de nœuds en double liste chaînée

Je suis en train de mettre en œuvre une fonction swap de deux nœuds de mon double liste chaînée, afin de trier le contenu du répertoire courant. Mais ma fonction semble "supprimer" certains éléments de ma liste, voici le code :

void node_swap(struct s_node *left, struct s_node *right)
{
  struct s_node *tmp;

  tmp = left->prev;
  if (tmp)
   {
      tmp->next = right;
      right->prev = tmp;
   }
  else
      right->prev = NULL;

  left->prev = right;
  left->next = right->next;
  right->next = left;
  right->next->prev = left->prev;
}

Je ne vois pas où est le mal dans tout cela ?

  • Pourquoi ne pas juste changer les données?
  • Pourquoi ne pouvez-vous pas juste changer le contenu des données des deux nœuds?
  • J'ai pu, mais n'est-ce pas de cette façon plus lente ?
  • Dépend des données. Quel est votre de données de type?
  • Mes nœuds sont composées d'un char *nom, et les deux pointeurs *prev, *suivant.
  • Puis il suffit de passer d'un char * est clairement plus rapide que le remplacement de 4 struct s_node *s.
  • BTW: Êtes-vous permutation des nœuds pour être capable de trier la liste?
  • Oui, je suis en train de trier ma liste.
  • Alors vous devriez plutôt regarder mergesort, et de diviser la liste en deux, à l'aide d'un fast-pointeur (un pointeur de marcher deux nœuds) et une lente pointeur en sautant juste un nœud dans la liste. Quand le jeûne pointeur est à la fin de la liste, la lenteur de pointeur est au milieu de la liste. C'est là que vous diviser et conquérir.

InformationsquelleAutor Kernael | 2013-11-20