La mise en œuvre de Sauter de la Liste en C++
[RÉSOLU]
J'ai donc décidé d'essayer et de créer un doublement chaînée triée sauter liste...
Je suis sûr que j'ai une bonne compréhension de la façon dont il fonctionne. Lorsque vous insérez x le programme de recherches de la liste de base pour l'endroit approprié pour mettre des x (puisque c'est triée), (conceptuellement) retourne une pièce de monnaie, et si la "pièce de monnaie" sur les terres alors que l'élément est ajouté à la liste ci-dessus(ou une nouvelle liste est créée avec élément en elle), lié à l'élément ci-dessous, et la pièce de monnaie est lancée à nouveau, etc. Si la "pièce de monnaie" terres sur b à tout moment, puis l'insertion est plus. Vous devez également avoir un infini stockées dans chaque liste comme point de départ de sorte qu'il n'est pas possible d'insérer une valeur qui est inférieure au point de départ (ce qui signifie qu'il n'a jamais pu être trouvé.)
À la recherche de x, vous commencez à la "en haut à gauche" (la plus haute de la liste de valeur la plus faible) et "déplacer vers la droite" à l'élément suivant. Si la valeur est inférieure à x que vous continuez à l'élément suivant, etc. jusqu'à ce que vous avez "allé trop loin" et la valeur est supérieure à x. Dans ce cas, vous retournez à la dernier élément et descendre d'un niveau, de la poursuite de cette chaîne jusqu'à ce que vous trouver x ou x est jamais trouvé.
Pour supprimer x vous suffit d'effectuer une recherche de x et de le supprimer à chaque fois qu'il arrive dans les listes.
Pour l'instant, je suis tout simplement aller faire un saut de liste qui stocke les nombres. Je ne pense pas qu'il y est quoi que ce soit dans la STL qui peut m'aider, je vais donc avoir besoin de créer une Liste de classe qui contient une valeur de type entier et a des fonctions de membre du, de recherche, delete et insert.
Le problème, je vais avoir, c'est de traiter avec des liens. Je suis assez sûr que je pourrais créer une classe permettant de gérer les "horizontale" des liens avec un pointeur vers l'élément précédent, et l'élément avant, mais je ne suis pas sûr de savoir comment faire face à la "verticale" des liens (point à l'élément correspondant dans la liste autres?)
Si toute ma logique est erronée, veuillez me dire, mais mes principales questions sont:
- La façon de traiter avec des liens verticaux et si mon idée de lien est correct
- Maintenant que j'ai lu de ma classe Liste d'idée, je pense qu'une Liste doit contenir un vecteur d'entiers plutôt que d'un simple entier. En fait, je suis assez positive, mais voudrais juste la validation de certains.
- Je suis en supposant que la pièce de monnaie serait tout simplement appeler int fonction rand()%2 renvoie une valeur de 0 ou 1, et si c'est 0, alors la valeur "niveaux" et si c'est 0, puis l'insérer. Est-ce incorrect?
- La façon de stocker une valeur similaire à l'infini?
Edit: j'ai commencé à écrire un peu de code et je suis d'envisager la manière de gérer la Liste de constructeur....Je suppose que sur sa construction, le "infini" valeur doit être stockée dans le vectorname[0] élément et je peux juste appeler insérer, après sa création à mettre le x à l'endroit approprié.
OriginalL'auteur trikker | 2009-08-13
Vous devez vous connecter pour publier un commentaire.
Pour les 2, vous avez besoin pour stocker un pointeur vers ce que vous souhaitez stocker comme *char ou *int ou *MyClass etc...Pour la 4, il n'y a aucun moyen de le faire régulièrement des entiers, vous devez mettre en place votre propre ou à l'aide de floating points.
Pourquoi serait-il contenir un vecteur? Chaque nœud de la liste doit stocker un nombre entier. Vous pouvez utiliser std::numeric_limits<int>::min() pour l'infini, mais je recommande de faire le nœud de tête d'un cas particulier.
Ouais comme j'ai écrit le code que j'ai réalisé que les nœuds doivent contenir les valeurs et non pas la liste. J'ai lu sur le nœud de tête et la queue nœud et je pense que c'est la façon dont je vais le mettre en œuvre.
OriginalL'auteur Unknown
http://msdn.microsoft.com/en-us/library/ms379573(SV.80).aspx#datastructures20_4_topic4
http://igoro.com/archive/skip-lists-are-fascinating/
Ci-dessus skip lists sont implémentés en C#, mais peut fonctionner à une implémentation c++ à l'aide de ce code.
OriginalL'auteur Jagannath
Vous faites "verticale" et "horizontale" trop compliqué. Ils sont tous simplement des pointeurs. Les petites boîtes que vous dessinez sur du papier avec des lignes sur eux ne sont là que pour aider à visualiser quelque chose lorsque vous pensez à eux. Vous pourriez appeler un pointeur "éléphant" et qu'il irait vers le nœud suivant si vous le voulais.
par exemple. un "next" et "prev" pointeur sont exactement les mêmes comme un "haut"/"bas" pointeur.
De toute façon, bonne chance avec vos devoirs. J'ai eu les mêmes devoirs une fois dans mes structures de données de la classe.
OriginalL'auteur Doldrim