Я пытаюсь реализовать связанный список для класса структур данных, и у меня возникают некоторые трудности с поисковой частью алгоритма.
Ниже приведен код ошибки, который я пытался реализовать, следуя инструкциямпсевдокод во введении MIT к тексту алгоритмов:
//
// 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;
}
Голова в этой точке программы - это 4-й узел, который содержит значение int 5. Проблема, по-видимому, в телецикл for, где указатель на объект узла назначается следующему узлу.Но это выходит за пределы заголовка узла, поэтому он по существу указывает на какое-то случайное место в памяти (это имеет смысл).
Не должен ли алгоритм в этом случае переходить на предыдущий узел вместо следующего узла?Ниже приведен псевдокод:
LIST-SEARCH(L, k)
x <- head
while x != NIL and key != k
do x <- next[x]
return x
Кроме того, здесь находится файл заголовка для моей реализации связанного списка.Я еще не пытался реализовать его в форме шаблона, просто чтобы все было просто:
#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
Реализация метода 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;
}