【问题标题】:dynamic linkedlist, having trouble linking动态链表,链接有问题
【发布时间】:2013-11-21 04:22:02
【问题描述】:

我正在尝试使用指针将结构添加到已创建的节点。问题是我没有正确链接它们。我希望有人能帮助我。参数是正确的,一个是结构,另一个是一个字符串,它将进入我新创建的与 struct 连接的结构内。

(节点 s)--->(新节点)-->null 我尝试调用 fileInsert(),当我尝试查看新节点中的数据时,它仍然为空。 filenames 是指向链接节点 s 和我的新节点的结构节点指针。有人能指出我正确的方向吗?

void fileInsert(struct node *s, char *filename){
struct node *current=s->filenames;
while(current!=NULL){

    current=current->filenames;
}
struct node* f=NULL;
f=(struct node*)malloc(sizeof(struct node));
strcpy(f->data, filename);
current=f;
f->filenames=NULL;
}

【问题讨论】:

  • 你是在无限循环吗?
  • 我记得做同样的家庭作业! :)
  • 编辑了我的代码,仍然不确定我哪里出错了:/我从来没有进入 while 循环开始。第一次为空,因为它没有正确链接节点,第二次也为空,所以它再次没有进入循环。

标签: c pointers memory struct linked-list


【解决方案1】:

您正在多次为 local 变量“当前”分配某个值,然后您的函数退出并且您永远失去该变量。您需要做的是找到最后填充的成员,并为其成员 filenames 分配一个值,指向新分配的结构。

【讨论】:

  • 但它不是指向我的“根” s->filenames 指向的内容吗?所以如果我设置 current=f;,那不是让 s->filenames 指向 f 吗?
  • 不,current=f 只是将 current 的值更改为 f。两者都是指针,因此您可以将一个指针的值更改为另一个指针的值。
【解决方案2】:

有两种方法可以做到这一点。

一,就是让新节点成为你列表的开始:

struct node* fileInsert(struct node *s, char *filename) {
    struct node *current=s;

    struct node* f=NULL;
    f=(struct node*)malloc(sizeof(struct node));
    strcpy(f->data, filename);
    f->filenames=current;
    return f;
}

另一个是将它附加到当前列表中,这有点像您可能正在尝试做的事情。

struct node* fileInsert(struct node *s, char *filename) {
    struct node *current=s;

    if (current != null) {
        while(current->filenames!=NULL){ 
            current=current->filenames;
        }
    }
    struct node* f=NULL;
    f=(struct node*)malloc(sizeof(struct node));
    strcpy(f->data, filename);
    f->filenames=NULL;
    if (current == null) {
        current = f;
    } else {
        current->filenames = f;
    }
    return current;
}

第一个简单地创建一个新节点,然后指向 current,将其添加到前面。如果 current 是节点或 null,则此方法有效。

第二个检查列表是否存在,如果存在,它会转到列表的末尾(通过在文件名中查找空指针)并添加新节点,如果不存在则创建新节点node 根节点

两个例程都返回列表的开头。

【讨论】:

  • 第二个是我想要完成的。但是你为什么要做 current->filenames=f;在 if/else 语句中?我们不是在 while 语句中将 current 设置为指向最后一个已经“current->filenames”的东西吗?
  • 当您进入 IF 语句时,current 指向列表末尾的节点(因为 current->filenames == NULL)。因此,在 IF 中,我们将文件名设置为新节点,这会将节点添加到列表中。新节点 f 是列表的新结尾,因为它的文件名 == NULL。
【解决方案3】:

将循环更改为

while ( current != null && current->filename != null)

发生的事情是当前变为空,但空是地址 0x0,所以你没有链接任何东西。你想停在最后一个非空节点

编辑:像这样描绘它

NODE1 -> NODE2 -> NODE3 -> NULL
     ^ current

当你遍历你的循环时发生了什么

NODE1 -> NODE2 -> NODE3 -> NULL
         ^ current 

...

NODE1 -> NODE2 -> NODE3 -> NULL
                                                 ^ current

Current 是一个没有真正有形的内存地址。没有物理意义。当你重新获得 NULL 时,你会丢失关于 node1 到 node3 的所有信息

当你添加节点时,你会得到这个

NODE1 -> NODE2 -> NODE3 -> NULL

NODE4->NULL

两者都存在于内存中但未连接

抱歉,我的手机格式错误

【讨论】:

  • 但是 current 是一个指针,所以它指向 null 并且我正在做 current=f;所以 current 应该指向我们新创建的节点 no?
  • 是的,但是没有任何东西指向你的新节点,因为一旦你到达 null 就丢失了它
  • 但是..我不明白。 current 到底只是链表中 s->filenames 的最后一个结构节点。
  • 是的,但没有任何意义。您丢失了有关它的信息,并留下了新节点
  • 当时没有任何问题,但这就是为什么我尝试做 current=f;现在 current,它实际上是 node3 中的一个结构指针,指向我的新节点 f。
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 2014-04-18
  • 1970-01-01
  • 2021-02-21
  • 2020-07-28
  • 2020-08-18
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多