Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 正确的AddNode函数,但当我printf_C_List_Printing_Add - Fatal编程技术网

C 正确的AddNode函数,但当我printf

C 正确的AddNode函数,但当我printf,c,list,printing,add,C,List,Printing,Add,我已经用不同的列表测试了addNode函数和printf循环,它们工作得很好。但这一个有点不对劲,因为当我打印列表时,它会打印出标题,然后所有其他单词都与用户最后给出的单词相同 这是addnode这个词是用户提供的-我检查过了,效果很好 struct list* addNode(struct list* head, char *word){ struct list *curr,*help,*Nhead; curr=(struct list *)malloc(sizeof(struct lis

我已经用不同的列表测试了addNode函数和printf循环,它们工作得很好。但这一个有点不对劲,因为当我打印列表时,它会打印出标题,然后所有其他单词都与用户最后给出的单词相同

这是addnode这个词是用户提供的-我检查过了,效果很好

struct list* addNode(struct list* head, char *word){

struct list *curr,*help,*Nhead;

curr=(struct list *)malloc(sizeof(struct list));

curr->sorted=head->sorted;          
if(curr->sorted==false){    
    Nhead=head;
    while(head->next!=NULL){
        head=head->next;
    }
    curr->data.word=word;
    curr->prev=head;
    curr->next=NULL;
    head->next=curr;

}
else{
    Nhead=head;
    for(help=head; help!=NULL; help=help->next){        
        if(strcmp(word,help->data.word)<0){             
            break;
        }
    }   
    if(help==NULL){ 
        for(help=head; help->next!=NULL; help=help->next){}
        curr->next=NULL;
        curr->data.word=word;
        curr->prev=help;
        help->next=curr;
    }
    else{
        curr->next=help;
        curr->prev=help->prev;
        curr->data.word=word;
        help->prev=curr;
        if(help!=head){
            help=curr->prev;
            help->next=curr;
        }
        else{
            Nhead=curr;
        }
    }

}   


    return Nhead;
}

你没有展示你是如何读单词的,但我想这就是发生的情况:

当您从用户获取输入时,您可能使用相同的字符缓冲区。将该字符缓冲区分配给列表节点的单词,在构建列表时,它保存当前单词。完成后,所有节点都引用相同的字符缓冲区,其内容是用户提供的最后一个字

因此,您应该复制内容,而不是分配指针。基本上有两种方法:为每个节点分配内存到list->word,或者将word条目设置为固定大小的缓冲区

非标准但广泛可用的函数strdup复制堆上的字符串。因此,与其分配指针

curr->data.word = word;
分配内容的副本:

curr->data.word = strdup(word);

由于已分配了额外内存,因此销毁列表节点时应释放word中的内存。

printf\n输入选择:\n;扫描%s,当前单词;这是我在while循环中读单词的方式。但是我没有完全理解你。我是否只需要更改您提供的代码?然后head=addNodehead,cur\u word,对吗?所有列表节点都将具有list->word==cur\u word,因此最终为所有节点打印相同的值。您的cur_word是临时空间,您必须复制内容。一种方法是使用strdup。你试过了吗?作为一个反例,如果你在循环中不要求用户输入,而是这样做:head=addNodehead,Apple;head=addNodehead,香蕉;head=addNodehead,Cherry,然后打印列表,它应该可以工作。这是因为双引号中的字符串文本都存储在不同的内存地址。在C中使用指针的部分困难在于知道何时可以指向现有内存以及何时必须复制内容。
curr->data.word = strdup(word);