J'essaie d'implémenter une liste chaînée pour une classe de structures de données et j'ai des difficultés avec la partie recherche de l'algorithme.C++ Implémentation de l'implémentation de la liste chaînée
est en dessous du code incriminé, que j'ai essayé de mettre en œuvre après la pseudo-code dans l'introduction du MIT à des algorithmes texte:
//
// Method searches and retrieves a specified node from the list
//
Node* List::getNode(unsigned position)
{
Node* current = m_listHead;
for(unsigned i = m_listSize-1; (current != 0) && (i != position); --i)
current = current->next;
return current;
}
La tête à ce stade du programme est le 4ème noeud, qui contient la valeur de int 5. le problème semble être dans le corps de la boucle for, où le pointeur vers l'objet nœud est assigné au nœud suivant. Mais cela va au-delà de la tête du nœud, donc il pointe essentiellement vers un emplacement aléatoire dans la mémoire (cela a du sens).
L'algorithme ne devrait-il pas être déplacé vers le nœud précédent au lieu du nœud suivant dans ce cas? Voici le pseudo-code:
LIST-SEARCH(L, k)
x <- head
while x != NIL and key != k
do x <- next[x]
return x
En outre, voici le fichier d'en-tête pour ma mise en œuvre de la liste Linked. Je ne l'ai pas essayé de le mettre en œuvre sous forme de modèle encore juste pour garder les choses simples:
#ifndef linkList_H
#define linkList_h
//
// Create an object to represent a Node in the linked list object
// (For now, the objects to be put in the list will be integers)
//
struct Node
{
// nodes of list will be integers
int number;
// pointer to the next node in the linked list
Node* next;
};
//
// Create an object to keep track of all parts in the list
//
class List
{
public:
// Contstructor intializes all member data
List() : m_listSize(0), m_listHead(0) {}
// methods to return size of list and list head
Node* getListHead() const { return m_listHead; }
unsigned getListSize() const { return m_listSize; }
// method for adding a new node to the linked list,
// retrieving and deleting a specified node in the list
void addNode(Node* newNode);
Node* getNode(unsigned position);
private:
// member data consists of an unsigned integer representing
// the list size and a pointer to a Node object representing head
Node* m_listHead;
unsigned m_listSize;
};
#endif
Mise en œuvre de la méthode addNode:
//
// Method adds a new node to the linked list
//
void List::addNode(Node* newNode)
{
Node* theNode = new Node;
theNode = newNode;
theNode->next;
m_listHead = theNode;
++m_listSize;
}
Est-ce la liste doublement liée? A quoi ressemble la mémoire? – Dave
Je pense que le problème peut être dans la fonction membre addNode. Veuillez fournir ce code afin que nous puissions nous assurer que la liste est correctement construite. –
Code fourni ci-dessus. – dtg