将项目添加到链表并分配 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;
}
}
}
这是在链表中使用的节点。
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;
}
}
}