如何使零成为C中int数组的一部分?

时间:2018-07-22 03:16:11

标签: c

此函数除了不接受0之外还可以正常工作,因为它认为它为NULL

void addtolist(int list[], int item){
    for(int a=0;a<5;a++){
        if(list[a]==NULL){
            list[a]=item; 
            break; 
        }
     }
  }

有什么办法可以使数组接受零? 附加信息:-List-是一个简单的int数组,使用scanf

接受-item-输入

1 个答案:

答案 0 :(得分:-2)

否,无法区分list[a] == NULLlist[a] == 0list无非就是一块内存,其中每4个字节被视为一个整数。

基本问题是您想要区分为空的元素和具有值的元素。有几种方法可以解决这个问题。

使用特殊的整数。

您可以将所有负数定义为“空”。或者,如果您需要负值,则可能只是一个值。 INT_MIN是个不错的选择。

但是特殊值会导致错误,并且没有类型检查可以保存您,因此您需要专门初始化每个列表。有更好的方法。

使用整数指针。

代替存储整数,而是存储指向整数的指针。现在NULL可以使用了。

int main() {
    int **list = calloc(10, sizeof(int*));
    int num = 42;
    list[5] = &num;

    for( size_t i = 0; i < 10; i++ ) {
        int *entry = list[i];
        if( entry == NULL ) {
            continue;
        }
        printf("%d\n", *entry);
    }
}

如果要存储指针,不利之处在于,因此必须记住要进行复制,以免改变原始内存。同样,现在NULL也不能用作哨兵来指示数组的结尾。

使用哈希或树

真正的解决方案是更改数据结构以更好地匹配工作。如果您有一个完整的,有序的东西列表,可以很容易地用整数索引,那么数组就很好。如果列表不完整且带有空格,那么散列可能更合适。这是使用GLib's hash table的示例。

#include <stdio.h>
#include <glib.h>

// A little convenience function for inserting integers into a hash
// that normally wants pointers.
gboolean hash_table_insert_int(
    GHashTable *table, int key, int value
) {
    return g_hash_table_insert( table, GINT_TO_POINTER(key), GINT_TO_POINTER(value) );
}

int main() {    
    GHashTable *numbers = g_hash_table_new(g_direct_hash, g_direct_equal);

    // Add 5 -> 42 and 9 -> 23
    hash_table_insert_int( numbers, 5, 42 );
    hash_table_insert_int( numbers, 9, 23 );

    // Iterate through the entries in the table.
    GHashTableIter iter;
    gpointer key, value;
    g_hash_table_iter_init(&iter, numbers);
    while( g_hash_table_iter_next(&iter, &key, &value) ) {
        printf("%d -> %d\n", (int)key, (int)value);
    }
}

GLib的数据结构已经习惯了一些,因为它被设计为泛型类型,但是由于它们带来的强大灵活性而值得。现在,您有了一个数据结构,可以在不弄乱特殊值的情况下显式插入和删除条目,它知道其内存边界,并且内存和性能均有效。