2012-04-02 71 views
0

随意编辑标题,engrish有时会混淆而不是帮助。创建指针的指针并进行修改而不修改原始指针?

我必须使(和不,我不能改变,这是它的方式必须是)简单的链接列表。 否我不能使用STL或std :: list。大部分工作都是在纸上完成的,但我似乎遇到了实现非常基本的光标的问题。

这是列表中的我的节点(的一部分):

struct Node { 
    int ap_nr; 
    Node *next; 
}; 

我想要走线槽我添加节点功能列表:

void add_node (Node **begin, int ap_nr) 
{ 
    stuff happens 
} 

这是我如何调用函数:

add_node(&(*begin), ap_nr); 

我想要创建一个从开始(我的列表的头)开始的光标,并通过每个节点我们槽荷兰国际集团cursor->next直到我到达终点(while (cursor->next!=0))

,但我不能简单地说:

Node *cursor; 
cursor = new Node; 
cursor = begin; 

因为这将直接覆盖光标首先,让我尝试无效。我仍然需要做一个指针才能开始并能够调用STRUCT函数“ - > next”

我该怎么做?

*还*我该如何记住以前的节点?我可以这样做:

Node *previous; 
previous = new Node; 
previous = &(*begin); // ? 
+1

'&(* begin)'完全等同于'begin',那么为什么不在调用add_node时使用那个呢? – celtschk 2012-04-02 17:33:40

+0

首先,在C++的英文讨论中通常使用“迭代器”,而不是“游标”。其次,你不提供太多的信息。你是说你想使用一个Node结构*作为一个迭代器,并且也是一个数据容器? – 2012-04-02 17:34:41

+0

每个节点都是独立的......它拥有它需要的所有信息,我需要做的唯一修改是添加一个或删除一个(暂时)。我想要一种从一个节点转到另一个节点的方式(列表不过是链接节点),直到我达到我的目标(无所谓),而不会丢失我的第一个节点。我也试过简单的'开始',但它没有工作,'&(*开始)'工作,所以我没有改变。 – Kalec 2012-04-02 17:38:16

回答

1

这听起来像你想穿越在add_node功能列表。如果是的话请尝试以下

void add_node (Node **ppBegin, int ap_nr) 
{ 
    if (!ppBegin) { 
    // Need to handle the case of bad user data here 
    } 

    // Traverse until we get the to the empty next value 
    while ((*ppBegin)->next) { 
    ppBegin = &((*ppBegin)->next); 
    } 

    // ppBegin now points to the address of where the new node should go 
    Node* created = new Node(); 
    created->ap_nr = ap_nr; 
    *ppBegin = created; 
} 

注意:要开始调用这个函数,你应该只是add_node(&theListPointer)调用它。

+0

等待,不会'ppBegin =&((* ppBegin) - >下一个);'移动我的开始,从而使我失去我的列表的“头”? – Kalec 2012-04-02 17:35:19

+0

@Kalec不,它不会。 C是一种传值语言,因此'ppBegin'实际上是提供给它的值的副本。对列表的修改只有在你使用'* ppBegin = created'行的间接级别时才会被调用者看到。在这里,我通过复制挖掘并达到了变异的真实共享值 – JaredPar 2012-04-02 17:40:44

+0

和'* ppBegin = created;'?我不应该以某种方式将它链接到列表吗?因为列表是一个链接节点的简单链,而不是实际的实体。什么是“创造”? – Kalec 2012-04-02 17:42:14