将项目添加到链表并分配 space

adding items to Linked List and allocing space

这是在链表中使用的节点。

struct DataNode
{
    char data[3];
    struct DataNode *nextData;
};

我这里有一个功能:

void addDataNode(struct DataNode **DataHead, char *data)
{
    struct DataNode *temp = (struct DataNode*)(malloc(sizeof(struct DataNode)));
    struct DataNode *current = *DataHead;
    if(current == NULL){
        current = temp;
        current->nextData = NULL;
        strcpy(current->data, data);
    }else{
        while(current->nextData != NULL){
            current = current->nextData;
        }
        current->nextData = temp;
        strcpy(current->nextData->data, data);
    }
}

我主要有

struct DataNode *DataHead = NULL;

所以我用

调用函数
char test[] = "Qu";
addDataNode(&DataHead, test);

但是,在函数之外,DataHead 保持为 NULL。这是为什么?

因为您没有在 addDataNode 函数中修改 *DataHead;你只读它。您有两个选择:删除 current 变量并使用 *DataHead 代替(自始至终),或者在返回之前调用 *DataHead = current

此外,strcpy 是错误的。你想要 strdup ,否则你会进入未定义的内存。

你永远不会在你的函数中对 DataHead 做任何事情,除非将其中的内容复制到 current,那么它 指向 的内容(如果它指向任何东西)可能会改变,DataHead 中的指针本身不会。

问题的原因是函数addDataNode太复杂了,所以很难看出它是否在所有路径中都设置了DataHead。:)

事实上,在函数的这段代码中忘记了这样做

if(current == NULL){
    current = temp;
    current->nextData = NULL;
    strcpy(current->data, data);
}else{

我建议按以下方式重写函数

void addDataNode( struct DataNode **DataHead, const char *data )
{
    struct DataNode *temp = malloc( sizeof( struct DataNode ) );

    if ( temp )
    {
        const size_t n = sizeof( temp->data );

        temo->nextData = NULL;
        strncpy( temp->data, data, n );
        temp->data[n-1] = '[=11=]'; 

        if ( *DataHead == NULL )
        { 
            *DataHead = temp;
        }
        else
        {
            struct DataNode *current = *DataHead;

            while ( current->nextData ) current = current->nextData;

            current->nextData = temp;
        }
    }
}