J'essaie de me renseigner sur les structures de données et les algorithmes par moi-même. J'ai écrit ma propre liste à double lien en C et maintenant je veux écrire quelques algorithmes à effectuer sur la liste. Quel est le moyen préféré d'échanger des éléments de la liste? Est-il préférable d'échanger le contenu ou de réorganiser les pointeurs qui pointent vers l'élément de liste suivant et précédent?Comment échanger des éléments dans une liste?
Répondre
Réorganisez les pointeurs. L'échange des éléments de données peut avoir des effets secondaires. En particulier, vous avez peut-être stocké une référence à un nœud quelque part en dehors de la fonction, et habituellement lorsque vous réorganisez l'ordre des nœuds dans une liste, vous ne voulez pas que les personnes détenant une référence à un nœud découvrent soudainement que le noeud pointe vers de nouvelles données. En effet, généralement, la caractéristique d'identification importante d'un nœud est les données qu'il pointe vers et non sa position dans la liste.
Le swap canonique se fait via le pointeur réagencement, n'a pas d'effets secondaires et est bien sûr plus rapide:
void swap (node *a, node *b) {
node *tmp;
tmp = a;
a = b;
b = tmp;
}
... mais si chaque nœud connaît sa position dans la liste chaînée, ces positions ne vont pas changer avec ce swap. –
Si chaque nœud connaît sa position, vous pouvez facilement ajouter quelques lignes pour les modifier également. –
Euh ... Qu'est-ce que ce code est censé faire exactement? Il échange deux ponters locaux dans une fonction. La fonction n'a aucun effet externe. Dans quel but? – AnT
En fonction du type de contenu étant stocké dans les éléments de la liste chaînée, en échangeant le contenu réel de l'élément serait difficile (pensez à une liste chaînée de chaînes de longueur différentes par exemple) donc il est plus facile d'échanger les pointeurs qui pointent vers les éléments de la liste suivante et précédente.
Dépend de la manière dont vous avez attribué le contenu.
Si vous stockez le pointeur sur le contenu, le changement de contenu n'est pas un gros problème. Si vous avez une grande structure qui fait partie de votre nœud, alors changer les pointeurs pourrait être plus efficace que de copier tout le contenu.
J'ai tendance à me ranger du côté de ce que la plupart des gens ont déjà dit. Un peu d'arrière-plan vous aidera probablement: l'échange de pointeurs est garanti, alors que l'échange d'objets n'est pas toujours aussi simple qu'il n'y paraît. Pensez aux temporaires qui peuvent/seront créés et des exceptions (et je veux dire en général et non pas une fonctionnalité de langage C++) peuvent se produire et laisser votre conteneur (liste) dans un état indésirable. Recherchez les invariants dans votre conteneur - c'est-à-dire qu'un échange doit laisser intacte la taille de la liste ainsi que les éléments intacts et la conception.
- 1. Comment échanger des éléments HTML en javascript?
- 2. LINQ: Comment Append Liste des éléments dans une autre liste
- 3. Comment échanger des valeurs?
- 4. jQuery échanger des images dans une séquence
- 5. ajouter/supprimer des éléments dans une liste
- 6. Comment sélectionner des éléments dans une liste en utilisant jQuery?
- 7. Comment centrer liste-éléments dans une colonne
- 8. Comment utiliser re pour rechercher des éléments dans une liste dans une autre liste en Python
- 9. Liste des éléments
- 10. Comment accéder aux éléments de liste dans une liste
- 11. Liste des éléments d'alignement
- 12. Comment échanger une image dans une liste de couches par un bitmap?
- 13. Comment générer dynamiquement des éléments de liste dans une liste non ordonnée dans ASP.NET?
- 14. Déplacer des éléments de liste d'une liste à une autre
- 15. Comment compter les éléments d'une liste dans une liste dans une liste en utilisant LINQ?
- 16. Ajouter des éléments de liste d'ajustement à une nouvelle liste
- 17. Comment échanger des contrôles basés sur une propriété de dépendance?
- 18. Liste des éléments triables ExtJs
- 19. WPF parcourir des éléments dans une vue de liste
- 20. Liste des éléments sans itération
- 21. Comment échanger des valeurs de ligne dataTable?
- 22. Utilisation des éléments dans une liste comme arguments
- 23. python sélectionner des éléments spécifiques dans une liste
- 24. Ajouter des éléments dans une liste de dictionnaires
- 25. Dessiner des éléments dans une zone de liste
- 26. LINQ: Comment obtenir des éléments d'une liste interne dans une liste?
- 27. Jquery à Hightlight éléments dans une liste
- 28. Ajouter des éléments pairs dans la liste
- 29. retourner une liste consisiting des éléments à partir des tuples
- 30. Comment prendre des éléments dans une liste enveloppée dans une monade
Je vais l'acheter. Bonne observation. – John
Cela a beaucoup de sens. Je vous remercie! – Lucas