我正在尝试使用指针将结构添加到已经创建的节点。问题是我没有正确链接它们。我希望有人能帮助我。参数是正确的,一个是结构体,另一个是字符串,它将进入我新创建的与结构体 s 连接的结构。
(节点 s)--->(新节点)-->空我尝试调用 fileInsert(),当我尝试查看新节点中的数据时,它仍然是空的。文件名是指向链接节点 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;
}
有两种方法可以做到这一点。
一种是将新节点作为列表的开头:
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;
}
第一个只是创建一个新节点,然后指向当前节点,将其添加到前面。如果当前是节点或 null,则此方法有效。
第二个检查列表是否存在,如果存在,它将转到列表的末尾(通过在文件名中查找空指针)并添加新节点,如果不存在,它将使新节点成为根节点
这两个例程都返回列表的开头。
你多次给局部变量"current"分配一些值,然后你的函数退出,你永远失去这个变量。相反,您需要做的是找到最后填充的成员并为其成员文件名分配一个值,指向新分配的结构。
将循环更改为
while ( current != null && current->filename != null)
发生的事情是当前变为空,但空是地址0x0所以你没有链接任何thinf。您希望在最后一个非空节点处停止
编辑:像这样想
NODE1 -> NODE2 -> NODE3 -> NULL
^ current
当您遍历循环时,正在发生的事情是
NODE1 -> NODE2 -> NODE3 -> NULL
^ current
。
NODE1 -> NODE2 -> NODE3 -> NULL
^ current
当前是一个不是真正有形的内存地址。没有物理意义。当您重新刷新 NULL 时,您将丢失有关节点 1 到节点 3 的所有信息。
当您添加节点时,您会得到这个
NODE1 -> NODE2 -> NODE3 -> NULL
NODE4->NULL
两者都存在于内存中但未连接
很抱歉我的手机上格式化错误