我正在尝试为数据结构类实现链接列表,并且我在算法的搜索部分遇到了一些困难。
以下是违规代码,我试图按照麻省理工学院算法文本简介中的伪代码实现:
//
// 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;
}
答案 0 :(得分:1)
尝试使用此构建列表:
void List::addNode(int number)
{
newNode = new Node;
newNode -> number = number;
newNode -> next = m_listHead ;
m_listHead = newNode;
++m_listSize;
}
它会向头部添加节点。也许您可能希望将指针存储到尾部并在那里插入节点。
答案 1 :(得分:0)
不幸的是,您的代码与您提供的伪代码不相似。
伪代码用于在链接列表中搜索键,而不是位置。
伪代码读作:
Assign head to (node) x.
while x isn't null and the key inside the current node (x) doesn't match k
assign x->next to x
return x
返回的值是指向包含k或null
的节点的指针如果您试图在给定的位置找到节点,那么您的循环将是(请注意,这假设您将使用从零开始的索引来访问列表):< / p>
Assign head to (node) x
assign 0 to (int) pos
while x isn't null and pos not equal to given position
assign x->next to x
increment pos
return x
结果将是指向给定位置的节点的指针或null(如果您首先到达列表的末尾)
编辑:如果您正在尝试做的话,您的代码非常接近后者......您能看到差异吗?
编辑,因为我喜欢OP提出正确问题的家庭作业:)
Node* List::getNodeContaining(int searchValue)
{
Node* current = m_listHead;
while (current != 0 && current->number != searchValue)
{
current = current->next;
}
return current;
}
Node* List::getNodeAtPos(int position)
{
Node* current = m_listHead;
int pos = 0;
while (current != 0 && pos != position)
{
current = current->next;
pos++;
}
return current;
}
答案 2 :(得分:0)
您的列表与ADT的正常列表非常不同。而不是返回需要客户端知道列表实现的节点,而是返回并接受您正在列出的类型。
在这种情况下,你要制作一个你想要的整数列表
public:
void add(int num); //prepends an Item to the list
int get(int pos);
两者的实现都很简单。 Add创建一个新节点,并将其链接;
void List::add(int num)
{
Node *newNode = new Node;
newNode->number = num;
newNode->next = m_listHead;
m_listHead = newNode;
m_listSize++;
}
然后得到也很容易:
int List::get(int pos)
{
if(pos>m_listSize)
;//throw an error somehow
Node *tmp = m_listHead;
while(pos-->0)
tmp=tmp->next;
return m->number
}