我正在做一个学校作业,我被困在我的全局变量链表上。根据需求,我有一个调用loadFile()函数的main函数。此函数检查输入并对其进行标记,然后将单词添加到链接列表。 loadFile()函数调用insert()函数,该函数创建节点并将其添加到列表中。这个问题是,如果我从loadFile()函数打印,列表工作正常,但如果我尝试从main函数打印,则无法正常工作。我将节点的头部作为全局变量,但这似乎不起作用。
Node **headNode = NULL;
Node **curr = NULL;
Boolean insert( char *new_string ){
Node *temp = (Node *)malloc(sizeof(Node));
temp->item = new_string;
if(headNode == NULL){
temp->next = NULL;
headNode = &temp;
}
else{
temp->next = (*headNode);
headNode = &temp;
}
return true;
}
void loadFile()
{
#define LINE_SIZE 256
char input[LINE_SIZE];
char *token = NULL;
while ( fgets( input, LINE_SIZE, stdin ) )
{
// parse the data into separate elements
token = strtok( input, " \t\n" );
while ( token )
{
insert( token );
token = strtok( NULL, " \t\n" );
}
}
}
答案 0 :(得分:4)
问题最有可能在这一行:
temp->item = new_string;
new_string
是loadFile
的本地指针。从loadFile
返回时,指针无效。
将其替换为
temp->item = strdup(new_string);
strdup
不是标准库函数,但您可以非常轻松地实现它。在网上查找。
答案 1 :(得分:2)
您的全局变量应该是节点指针,而不是节点指针的指针。这里:
headNode = &temp;
指定局部变量的地址。从函数返回后,该变量立即超出范围,并使头指针无效。如果你的全球头只是一个指针,那你就
headNode = temp;
并正确地将新分配的内存分配给您的头部。
使用指针指向节点指针的想法可能来自与节点插入代码的混淆,该代码将头部作为参数传递。在这种情况下,签名将如下所示:
void insert(Node **head, const char *item);
然后,您将传递一个(可能是本地的)头指针的地址:
Node *head = NULL;
insert(&head, "banana");
在这种情况下,调用函数的本地头通过指向节点指针的指针进行修改 - 在insert
函数中,head
是节点指针的地址head
< em>在调用函数中。请注意,调用代码中链接列表的头部仍然只是一个节点指针。
在你的情况下,你只有一个带有全局头的列表,你的头也应该只是一个节点指针。没有必要通过指向节点ponter的指针来改变头部;只有一个头,你可以直接和毫不含糊地使用它。