【发布时间】:2015-10-23 12:29:15
【问题描述】:
我正在开发以下程序:
...
typedef struct node_tag{
int id;
char pLabel[10];
struct node_tag *pNext;
struct node_tag *pInner;
}NODE;
...
int main(int argc, char** argv)
{
NODE *list = create_node("start");
add_node(&list, "MUSIC");
add_node(&list, "VIDEOS");
add_node(&list, "PICTURES");
create_sub_node( &list, "2015" ); // sub node of PICTURES
create_sub_node( &list, "Trip" ); // sub node of 2015
print_nodes(list);
return (EXIT_SUCCESS);
}
输出:
|
|-> [ID:4] PICTURES
| |-> [ID:40] 2015
| | |-> [ID:400] Trip
|
|-> [ID:3] VIDEOS
|
|-> [ID:2] MUSIC
|
|-> [ID:1] start
|
到目前为止,一切都按我的意愿进行,从输出中可以看出。但是我想实现创建子节点的不同方法。我现在所拥有的非常有限,因为它只能创建 2 个子节点的深度,但我想拥有无限的深度:
void create_sub_node( NODE **handle, char* label )
{
NODE *new = malloc( sizeof(NODE) );
new->pNext = NULL;
new->pInner = NULL;
strncpy( new->pLabel , label , strlen(label) +1 );
if( (*handle)->pInner == NULL )
{
new->id = (*handle)->id * 10;
(*handle)->pInner = new;
}
else if( (*handle)->pInner->pInner == NULL )
{
new->id = (*handle)->pInner->id * 10;
(*handle)->pInner->pInner = new;
}
}
我尝试实现 while 循环,它可以遍历内部节点,直到找到 NULL 一个,然后创建新节点。我遇到的问题是,当我遍历节点时,指针地址发生了变化,我留下了一个不再工作的大混乱。
我尝试复制内部节点的所有地址,但无法再次重新分配它们。
问题是我必须将子节点添加到列表中,因此我将更改各种指针地址但要做到这一点看起来我需要一个列表的副本,我可以在其中使用它,以便原始地址不变。
如何遍历子节点并创建新节点,这样我就不必对一堆 IF 语句进行硬编码?
【问题讨论】:
-
你能告诉我们你尝试了什么吗?
-
我认为您的问题是您尝试使用
(*handle) = (*handle)->pInner之类的东西进行迭代,而您应该在循环中使用tmp = *handle;并使用tmp = tmp->pInner。但我真的不能说,因为我还没有看到你的代码。 -
你确定你的
create_sub_node函数应该像这样工作吗?如果您想在创建PICTURES节点后创建MUSIC的子节点怎么办?如果add_node会返回一个节点,那么如果将那个 节点传递给create_sub_node,而不是让它遍历你的节点,那么 if 会更有意义。 -
@Groo 这是一个有趣的观察,但后来我想修改
create_sub_node函数,使其在我将传递其 ID 的节点下创建子节点。我认为如果我要朝那个方向发展,整个返回节点的业务将会在主代码中变得混乱。
标签: c pointers linked-list nodes