如何在C中的数组的任何部分设置“空”元素

时间:2015-06-04 16:29:35

标签: c arrays vector null

我正在做一个在数组中插入数字的程序,这里很简单,例如:

if(menu==1){
        system("cls");
        result=lastposition(array,20);

        if(result==25){
            printf("\n Error! The array is FULL!");
            printf("\n Press Enter to continue");
            getch();
        } else{

        printf("\n\n\tOption 1 selected: \n");

        printf("\n Type the number to add it to the array: ");
        scanf("%i",&value);

        if(array[0]!=NULL){
            printf("\n The first space is already filled, moving itens");

            changeplace(array,20,value);

            printf("\n Items moved with success!\n");
        }else {
            array[0] = value;
        }

        printf("\n Number %i added!\n",value);
        printf(" Press to continue.\n");
        getch();
        }

所以,这样做,你键入一个数字,它插入一个20位数组,在它的第一个位置(这就是为什么函数“lastposition”在那里,来检查数组中填充的最后位置),如果第一个位置尚未填充(NULL),它在第一个位置添加,如果已经填充,“chageplace”函数将所有值向右移动,然后添加数字!

我的问题是,当我声明数组时,我将其所有值设置为NULL,如下所示:int array[20]={NULL};!但是在C中,NULL将其所有值都更改为0,如果我的程序中有人将0作为值添加,假设数组已经有5和10,就像这个[5][10][0][0][0]...[0]一样,我将添加零,得到这样:[0][5][10][0][0]...[0],直到没有,但因为C认为NULL = 0,当我尝试添加另一个数字时,它将检查第一个位置是否已经填充(它将检查它是否为NULL ,或0,它将返回NULL [0]),如果我尝试在其上添加7,它将替换0(添加的数字,而不是NULL),它将像[7][5][10][0][0]...[0]

任何人都知道如何解决这个问题?在某种程度上能够在函数中添加0,而不会被下一个数字替换,因为它被认为是NULL?那里有一个真正的“无”,而不是“0”。

PS:我不能把随机数放在数组中,不同于0,原因有两个,首先,菜单选项3显示向量[因此显示随机数,2,我的函数会认为它已经被数字填充了!

PS²:“lastposition”函数返回的“25”只是一个随机数,如果数组的最后一个位置为20(意味着它已经满了),我将设置为返回...

7 个答案:

答案 0 :(得分:1)

这在C中根本不可能。一种解决方法可能是将数组元素更改为一个结构,其中字段used是布尔值,字段data是int。

答案 1 :(得分:1)

例如,您可以使用负值。但它真的很脏()。

答案 2 :(得分:1)

您可以使用另一个标记值来表示"未使用"。说INT_MAXINT_MIN

答案 3 :(得分:1)

NULL是一个指针。分配它或与任何其他类型(如int)进行比较至少应该从编译器产生警告。你从控制台输入指针吗?

整数标量大多数没有保留代码(如果是,那将是实现定义的)。所以你需要一些带外信号来表示“空”。

你可以限制有效的值范围,并使用该范围之外的值作为“空”标记。或者每个条目使用一个额外的标志。对于浮动,有类似的方式,例如使用NaN。

使用结构的单独标志的版本:

#include <stdbool.h>

struct {
    bool valid;
    int value;
} array[20];

将INT_MIN作为保留值的版本:

#include <limits.h>

#define VALID_MIN    (INT_MIN - 1)
#define EMPTY_VALUE  INT_MIN

for ( int i = 0 ; i < sizeof(array) /sizeof(array[0]) ; i++ )
    array[i] = EMPTY_VALUE;

....

int value;

do {
    value = input_value();    // ...
} while ( value < VALID_MIN ) ;

....

答案 4 :(得分:0)

在C中,NULL实际上总是对指针进行零转换,这就是为什么你看到零。没有特殊的“空”值,在处理整数时不应该使用NULL。

这样做的一种方法是使用另一个布尔数组来说明它是否为空。例如

_Bool isFull[25] = {0}; // Initialize it to all FALSE.

然后检查array[i] == NULL

,而不是检查isFull[i] == FALSE

添加元素(包括0)时,设置isFull[i] = TRUE;

答案 5 :(得分:0)

您应该只跟踪数组中填充元素的数量。 :)

答案 6 :(得分:0)

  1. 您可以使用一个不应该成为数组本身一部分的值。(这意味着如果您将其用作数组,则不应再在数组中输入该值占用指数的指标。)但是你的程序不那么灵活,因为你不能输入你想要的任何值。

  2. 另一种方法是使用boolean为值本身保存一个变量,另一个作为指标(如果它已填充)。(它可以是{ {1}}或int只能01)。

    struct values {
    
        int value;
        int indicator; // or bool indicator, make sure to include stdbool.h
    } array[20];
    
  3. 在不使用占用索引指标的情况下完成所需内容(添加数组的顶部/前部)的一个技巧是向后填充数组。以前的输入没有移动到这也是必要的。

    int i = max_elements; // lets say max_elements = 20
    
    printf("\n Type the number to add it to the array: ");
    scanf("%i",&value);
    
    array[i] = value; // will fill array[20]
    
    i--; // so that the next input will go to array[19], and so on...
    
  4. 但如果你真的想要改变职位

    int const_index = 0;
    
    printf("\n Type the number to add it to the array: ");
    scanf("%i",&value);
    
    array[const_index] = value;
    
    // change positions
    for (i = max_elements; i > 0; i--)
        array[i + 1] = array[i];
    
    const_index = 0;
    
  5. 或者更好的选择是使用 stack数据结构。

    您可以在这里查看如何操作。

    C Program to implement Stack Operations Using Stack