检查C中链接列表是否为空

时间:2016-01-23 22:30:54

标签: c list struct

我有一个简单的链表(我给出了一个赋值),我正在尝试检查它是否为空(它没有标题节点),但我的实现似乎不起作用。

我有.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语句也不会执行。我给出的结构没有标题节点(我无法更改它),那么我将如何解决此问题呢?

非常感谢任何帮助。

3 个答案:

答案 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;
}