C ++链接列表实现崩溃

时间:2011-10-10 00:06:09

标签: c++ algorithm data-structures linked-list

我正在尝试为数据结构类实现链接列表,并且我在算法的搜索部分遇到了一些困难。

以下是违规代码,我试图按照麻省理工学院算法文本简介中的伪代码实现:

//
// 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;
}

3 个答案:

答案 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
}