动态记忆&链接列表

时间:2015-05-08 09:08:58

标签: c++

好的,假设我们在C ++中有一个链表实现。此外,假设节点是一个类,列表本身是一个类,它看起来像这样:

#include <iostream>

using namespace std;

class List;

class Node
{
private:
    Node(char, Node*);
    char data;
    Node* next;
    friend class List;
    friend ostream& operator<<(ostream&, const List&);
};

class List
{
public:
    List(int = 0);
    List(const List&);
    ~List();
    bool gotoBeginning();
    bool gotoEnd();
    bool gotoNext();
    bool gotoPrior();
    bool insert(char);
    bool remove(char&);
    bool empty() const;
    bool full() const;
    bool clear();
    List& operator=(const List&);
    friend ostream& operator<<(ostream&, const List&);

private:
    Node* head;
    Node* cursor;
};

#endif

假设列表为空。 此外,假设我们刚刚在列表中插入了一个新元素'z',这意味着列表当前有1个节点。

让我们看看插入函数:

bool List::insert(char item)
{
    if(empty())
    {
        Node* newNode = new Node(item, NULL);
        head = cursor = newNode;
        return true;
    }
    else
    {
        // I dont need to show this part because the above code will suffice
    }
}

好的,所以我们都知道变量newNode是指向节点的类型指针,它被分配了包含已经存储在堆上的节点的内存位置。

现在记得我们刚创建了一个新节点,并假设传递给insert函数的项是'z'

    Memory Allocation
Stack             Heap
    |               |
    |               |
   \|/             \|/
  512               902            memory address
| -----|   |--->|-----|-----|
|  902 |   |    |  'z'| NULL|                    
|------|---|    |-----|-----|
newNode        (no name/ newNode)   variable name

(无名称):因为堆上分配的内存不能通过指针直接访问。

我遇到的问题是这个。 newNode指针是否在堆栈上创建并且如上所示分配了一些像512这样的内存地址? 或者指针从未在堆栈上分配(所以只删除上面的512)并且只指向在堆上创建的内存(902)?

我问的原因是因为insert函数内部if语句内的第二行代码将newNode分配给head和cursor

是什么让我感到困惑。头和光标现在是否包含地址512或902?

如果我们继续并在insert函数内部的else语句中编写代码,那么它将如下所示:

bool List::insert(char item)
{
    if(empty())
    {
        Node* newNode = new Node(item, NULL);
        head = cursor = newNode;
        return true;
    }
    else
    {
        Node* newNode = new Node(item, NULL);
        cursor = cursor->next = newNode; // what is this line doing
        return true;
    }

    return false;
}

那么cursor->next如何获得新节点的值,cursor也获得新节点的值。

是的,上面的功能运行正常,我在项目上得到了A,所以所有的代码都是正确的,但我提到的概念让我感到不安

1 个答案:

答案 0 :(得分:1)

new返回的指针需要存储在某处,并存储在堆栈变量newNode中。 newNode及其内容的值是new返回的地址。

当你指向另一个指针的指针时,它指的是指针的值,指针指向的内容,地址,复制指针。

所以当你这样做时

head = newNode;

然后head将获得与newNode相同的值,并指向由new表达式分配的内存。

让我们举个小例子:假设你有两个指针:

int* a;
int* b;

您分配了一些内存并分配给a

a = new int;

现在内存看起来像这样:

+---+     +------------------+
| a | --> | allocated memory |
+---+     +------------------+

然后您从a分配到b

b = a;

然后内存看起来像这样:

+---+
| a | -.
+---+  |    +------------------+
        >-> | allocated memory |
+---+  |    +------------------+
| b | -'
+---+

存储变量ab的确切位置并不重要,它们指向的位置也不重要。