2012-04-02 33 views
2

编辑:我也不会介意知道这是否只是太暧昧让你了解和或者寻找什么是错的,我一知道这与代码没有直接关系,因为当我即将退出函数时发生更改,而不是在实际的“代码”期间发生。所以我希望这已经足够,不管我是否需要添加更多。先谢谢你!指针似乎没有明显的原因重新设置

我想做一个简单的(单向)链接列表,我必须自己做,不使用STL或任何其他已经制作的动态容器。我已经做了一个简单的,但我似乎有一个问题,我根本无法包裹我的头。每当我在列表中创建一个新节点(我总是返回列表的第一个节点,以防它已被更改,我不使用“哨兵”或“虚拟”节点)新节点是好的直到我到达程序中的某个点时,它将自己重置到我介绍的第一个节点。

要尽量保持我的帖子尽可能干净,我会插入更少的代码和更多的“功能”或模式,但如果它不够,我会添加更多。

这里是它如何工作的:

我的节点项目

struct Node { // simplified example 
    string type; //can be ignored 
    int ap_nr;  // I sort by apartment number 
    int sum;  // can also be ignored 
    Node *next; 
}; 

在主我初始化我的第一个节点是“假的”节点(ap_nr = -1,其他ap_nr不能为负)。

int main() 
{ 
    int command = 1; // used for loop 
    Node *begin; // head of my list 
    begin = new Node; 
    begin = create_node(); // initialize 
    while (command != 0) // This is for work with a "handler", accesses different mechanics of the program, I don't know exactly how to explain in english 
    { 
     input_command(command, begin); // reads command, sends result to handler 
    } 
return 0; 
} 

这是我输入命令:

void input_command (int &command,Node *begin) 
{ 
    cout<<"Option #"; cin>>command; 
    input_validation (command, begin); 
} 

而我处理,我使用ATM的唯一部分:

void input_validation (int command, Node *begin) 
{ 
    if (command == 1 trough 15) // pseudo code 
     execute (command)  
} 

后,我将节点添加到列表中,我用调试跟踪它,第一个保持原样,但第二个节点(我在第一个节点之前添加它并返回新的“开始”),起初没关系(有一个新的内存位置和new_begin->next = old_begin但在I退出ìnput_command结构它重​​置)

* 这里是input_command结构和程序图:*

主: - 初始化 '假' 节点/进入菜单环 - >前进到input_command。

UI: - 输入命令 - >读取命令 - >验证 - >发送到处理程序。

列表: - 增加了欲望节点“列表”(没有实际上本身的列表左右,刚刚挂节点) - >返回第一个节点。 第一个节点是确定(有新的地址,在旧节点)

返回到UI: - >输入命令(下架)和复位(我的意思是,不管什么节点I添加,它成为我添加的第一个节点。假设我介绍1到10号公寓,它只记得“1”)。

AM我错过了什么?在我的设计中是否有逻辑错误? 你需要更多的代码驴吗? 只要告诉我要补充什么,我意识到这有点模糊。

注:现在我只能我的主要节点之前添加节点,我不会强调任何新的,直到我做这项工作正常,只要我的设计是不是问题的一部分,我赢了也不会改变,但如果不好,我会欣赏笔记和建议。

这是add_node功能的唯一实现部分:

Node *add_node (Node *begin,string type, int sum, int ap_nr) // Node begin e primul nod din lista, trebuie mereu plimbat cu toate functiile pe lista 
{ 
// if first node is dummy node 

if (begin->ap_nr == -1) 
    { 
     begin->type = type; 
     begin->ap_nr = ap_nr; 
     begin->sum = sum; 
     begin->next = 0; 
     return begin; 
    } 

// else create new node and insert it in sorted position 

else 
{ 

    // if node should be inserted before first node (begin) 

    if (ap_nr <begin->ap_nr) 
    { 
     Node *cursor; 
     cursor = new Node; 
     cursor->ap_nr = ap_nr; 
     cursor->type = type; 
     cursor->sum = sum; 
     cursor->next = begin; 
     return cursor; 
    } 
} 
+0

请将来源添加到input_command函数中。我怀疑你没有传递对它的引用,所以开始指针永远不会被修改。 – 2012-04-02 12:03:54

回答

3

As RStrad说,你遇到的问题是你想修改一个函数中的指针,并且在那个函数之外还有那些修改保留在之外。

在C/C++中,所有东西都是按值传递的。如果你想要一个函数来改变某些东西,你需要传递一个指向的东西。所以,在你想改变一个指针的情况下,你需要一个指针传递给该指针,就像这样:

*Node begin; 
input_command(command, &begin); 
// the pointer itself has an address, which you are sending with & 

input_command()定义将为:

void input_command (int &command, Node **begin) 
// observe here the pointer to your pointer 

从内input_command() ,你对input_validation通话将必须:

input_validation (command, &(*begin)); 
// the address of the pointer towards which **begin points 

input_validation()定义将为:

void input_validation (int command, Node **begin) 

...以及任何进一步的调用,比如对于实际添加节点的函数,将继续遵循这种格式。总之,如果你有一个指针*P,并且你想在一个函数中修改它,你需要发送它的地址&P。该函数将接收到指针**P的指针,并且将包含P的地址的任何进一步调用将必须用&(*P)完成。

1

我真的需要看到的将节点添加到列表中的代码。根据你所描述的在当前头部之前添加节点,问题在于只在本地范围内修改了开始,并且没有从input_command返回(即通过引用或传递值)

+0

虽然我在拼贴画,在我的国家,它被认为是“非常好”,实际上它是垃圾,我知道指针很少,他们没有解释任何东西,也不会。我知道我应该自己学习,但如果我确实了解了他们自己跳过的一切,那么在这里就几乎没有任何意义。我所知道的是,我不知道如何正确地传递指针,以便在内部和外部修改指针(不在我当前的本地函数中) – Kalec 2012-04-02 12:53:38

+0

也重置为第一个分配的节点。如果问题在于它保存在本地,为什么我的原始开头也不会在本地被记住,然后被破坏?但它不是......它仍然存在。 – Kalec 2012-04-02 12:56:10

相关问题