检查一个结构体数组是否为空。

3
我该怎么做呢?例如。
        typedef struct node
     {   int data;
         struct node* next;
     }node;

我的节点,而且在我的主程序中有

       int main(){
          node* array[10];
          if (node[0].data == 0){
           ...

                                }

我不太确定我需要在这里做什么。我想要检查数组中的这些条目是否已经被修改过。我该怎么办?我尝试使用->运算符而不是.,这让我感到有些困惑,因为我正在使用一个对象,不是吗?我对此不确定。

根据建议,现在我的代码如下。

 int main() {
 struct node* arr[10] = { 0 } ;
   addTo(data, arr);
            }


   addTo(int data, node* arr){
        if (arr[0] == NULL)
                             }

最后一行是一个分段错误。

2
最后一行出现了段错误,因为声明有误:struct node* arr[10]; 声明了一个包含 10 个指针的数组,但是没有将这些指针初始化为有效的内存。你应该使用 struct node arr[10]; 来获取一个实际结构体的数组。 - unwind
这个 hashT[n] 是什么?你需要与 arr[n] 一起使用。正如 @unwind 所说,要么分配内存,要么声明结构体节点 arr[10] - Gangadhar
@Gangadhar 哎呀,测试代码和其他代码混在一起了。 - Paul the Pirate
@Gangadhar 有什么帮助吗?我不明白为什么这个不能工作。 - Paul the Pirate
@unwind 有什么帮助吗?我还是卡住了。 - Paul the Pirate
显示剩余2条评论
3个回答

4

C语言中的数组不能是“空的”。它们永远不会为空。如果您声明了一个包含10个元素的数组,那么您将始终拥有一个包含10个元素的数组。除非您自己想出一些手动“标记”您修改的元素的方法,否则无法判断某个元素是否已被修改。例如,您可以选择一些保留的元素值,该值将指定一个“空”元素。

在您的情况下,您声明了一个包含10个指针的数组。

node* array[10];

如果您提供了一个初始化器
node* array[10] = { 0 };

你的数组元素将具有null的初始值。你可以使用该值作为空元素的标记。


那么为什么我在尝试访问特定索引处的数据时会收到分段错误? - Paul the Pirate
如果你只是访问数组元素(即指针),那么一切都会很好。但是你走得更远:尝试解引用数组元素并访问其中的数据。这就是导致崩溃的原因,因为数组元素尚未被分配任何有意义的值。你不能解引用它们。 - AnT stands with Russia
但首先您需要决定您需要什么:指向节点的指针数组还是节点本身的数组。 - AnT stands with Russia
我不确定它们之间的区别是什么,我想要一个链表数组。 - Paul the Pirate
@海盗保罗:太好了。在这种情况下,指针数组是一个可行的想法(除非你想要一个带有专用“头部”元素的列表)。在开始时用null初始化数组。空指针将代表空列表。因此,在访问任何内容之前,请不要忘记检查null。 - AnT stands with Russia
问题是,我仍然在 if(arr[0] == NULL) 处遇到分段错误。 - Paul the Pirate

2
       node array[10]; //array of struct node type 
       //node *array[10]; //this becomes declaration of array of pointers

       //assuming you have initialized all with 0.

       for(i=0;i<10;i++)   
       if (array[i].data == 0)   
       //data modified.
       //if you declare array of pointers check if(array[i]->data==0)

你是如何声明数组的? - Gangadhar
我将它定义为一个node*类型的数组[10]。 - Paul the Pirate
如果你仔细查看答案,你就会发现自己的错误。 - Gangadhar
我也尝试了node array[10],但仍然出现相同的错误。也许C语言创建数组的方式存在问题,导致我的节点太大或其他原因?我不知道。我只是猜测,但我感觉问题在于它正在尝试访问一个不存在的节点数据点,因为该节点尚不存在。我得到了一个分段错误。 - Paul the Pirate
我更新了问题,但仍然无法使其工作。 - Paul the Pirate

1
您发布的代码无法导致崩溃,因为它甚至不能编译。我修复了所有明显的错误以消除编译器错误,现在它在这里完美地运行而没有崩溃:
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node* next;
} node;

/* changed node* to node*[] and added return type */
void addTo(int data, node* arr[])
{
    if (arr[0] == NULL)
    {
        puts("yes");
    }
    else
    {
        puts("no");
    }
}

int main()
{
    struct node* arr[10] = { 0 } ;
    /* changed data to 42, because there is no variable data in scope here */
    addTo(42, arr);
}

如果您有任何进一步的问题,请随时提问。

不确定发生了什么,但如果 (arr[0] == NULL),会导致分段错误。 - Paul the Pirate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接