我有一个简单的链表(我给出了一个赋值),我正在尝试检查它是否为空(它没有标题节点),但我的实现似乎不起作用。
我有.c文件:
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
int main(void) {
List * node;
node = NULL;
node = malloc(sizeof(List));
addToList(node);
return 0;
}
void addToList(List * node) {
if(node == NULL) {
node->value = 3;
node->next = NULL;
}
else {
//add to end of the list:
List * temp = malloc(sizeof(List));
temp->value = 4;
while(node->next != NULL)
node = node->next;
node->next = temp;
temp->next = NULL;
}
}
结构中的链接列表(在.h文件中)
typedef struct List {
int value;
List * next;
}List;
但是,即使列表为空,if语句也不会执行。我给出的结构没有标题节点(我无法更改它),那么我将如何解决此问题呢?
非常感谢任何帮助。
答案 0 :(得分:0)
问题在于addToList
node == NULL
应该是
node->next == NULL
然后你还需要确保函数没有给出空指针。
目前,您正在为函数提供有效指针,因此它永远不会== NULL
请参阅:
node = malloc(sizeof(List));
addToList(node);
这里为节点分配了一个指向List的指针并提供给addToList。
我怀疑你真正想要的东西并不包含if / else,并且应该看起来像这样(注意:你必须在调用它之前手动初始化你的列表节点function.malloc只给你一个指向垃圾的指针。
//add to end of the list:
void addToList(List *node) {
if (node == NULL)
return;
List * temp = malloc(sizeof(List));
temp->value = 4;
while(node->next != NULL)
node = node->next;
node->next = temp;
temp->next = NULL;
}
答案 1 :(得分:0)
正如已经说过的问题是,首先你分配了一个节点
node = malloc(sizeof(List));
它获得了已分配内存的地址,之后才调用了函数
addToList(node);
以此节点作为参数。
结果是函数中的这个条件
if(node == NULL) {
等于假。节点不等于NULL。它等于分配的内存的地址。
当函数为每个新节点分配自身时,效果要好得多。但是,在这种情况下,您必须以不同方式声明函数。
它及其调用可以采用以下方式
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
void addToList( List ** node, int value );
// ^^^^^^^ ^^^^^^^^^
int main(void)
{
List * node NULL;
addToList( &node, 4 );
return 0;
}
void addToList( List ** node, int value )
{
while ( *node ) node = &( *node )->next;
List * temp = malloc( sizeof( List ) );
if ( temp != NULL )
{
temp->value = value;
temp->next = NULL;
*node = temp;
}
}
答案 2 :(得分:-1)
条件node == NULL
始终为false,因为在访问addToList
函数之前,您需要编写node = malloc(sizeof(List))
。
尝试删除此声明并更改
中的if
声明
if(node == NULL) {
node = malloc(sizeof(List));
node->value = 3;
node->next = NULL;
}