c - 从 C 中的数组中删除元素

标签 c arrays subtraction

我只是有一个关于 C 中数组的简单问题:

从数组中删除元素并在此过程中使数组变小的最佳方法是什么。

即:数组的大小为 n,然后我从数组中取出元素,然后数组变小了我从中删除元素的数量。

基本上,我将数组视为一副纸牌,一旦我从纸牌的顶部取出一张纸牌,它就不应该再存在了。

编辑:我会在一天结束之前把自己逼疯的,感谢所有帮助我正在尝试值(value)交换的事情,但它不正常。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

enum faces { Ace = 0, Jack = 10, Queen, King };
char *facecheck(int d); 
int draw(int deck, int i); 

int main() { 
    int deck[52], i, n;
    char suits[4][9] = {
        "Hearts",
        "Diamonds",
        "Clubs",
        "Spades"
    };

    n = 0;

    for (i = 0; i < 52; i++) {
        deck[i] = n;
        n++;
    };

    for (i = 0; i < 52; i++) {       
        if (i % 13 == 0 || i % 13 == 10 || i % 13 == 11 || i % 13 == 12)
            printf("%s ", facecheck(i % 13));
        else
            printf("%d ", i % 13 + 1);
        printf("of %s \n", suits[i / 13]);
    }

    draw(deck, i);

    return 0; 
}  

char *facecheck(int d) {
    static char *face[] = {
        "Ace",
        "Jack",
        "Queen",
        "King"
    };

    if (d == Ace)
        return face[0];
    else {
        if (d == Jack) 
            return face[1];
        else {
            if (d == Queen)
                return face[2];
            else { 
                if (d == King)
                    return face[3];
            }
        }
    } 
}

int draw(int deck, int i) { 
    int hand[5], j, temp[j];

    for (i = 0; i < 52; i++) {
        j = i
    }; 

    for (i = 0; i < 5; i++) {
        deck[i] = hand[]; 
        printf("A card has been drawn \n");
        deck[i] = temp[j - 1];
        temp[j] = deck[i];
    };
      
    return deck;
}

最佳答案

实际上有两个不同的问题。第一个是保持数组元素的正确顺序,以便在删除元素后没有“漏洞”。第二个实际上是调整数组本身的大小。

C 中的数组分配为固定数量的连续元素。没有办法实际删除数组中单个元素使用的内存,但可以移动元素以填充删除元素所造成的空洞。例如:

void remove_element(array_type *array, int index, int array_length)
{
   int i;
   for(i = index; i < array_length - 1; i++) array[i] = array[i + 1];
}

静态分配的数组不能调整大小。可以使用 realloc() 调整动态分配的数组的大小。这可能会将整个数组移动到内存中的另一个位置,因此必须更新指向数组或其元素的所有指针。例如:

remove_element(array, index, array_length);  /* First shift the elements, then reallocate */
array_type *tmp = realloc(array, (array_length - 1) * sizeof(array_type) );
if (tmp == NULL && array_length > 1) {
   /* No memory available */
   exit(EXIT_FAILURE);
}
array_length = array_length - 1;
array = tmp;

如果请求的大小为 0,或者出现错误,realloc 将返回 NULL 指针。否则它返回一个指向重新分配的数组的指针。临时指针用于在调用 realloc 时检测错误,因为除了退出之外,还可以只保留原始数组原样。当 realloc 重新分配数组失败时,它不会改变原始数组。

请注意,如果数组很大或删除了很多元素,这两个操作都会相当慢。如果优先考虑高效插入和删除,还可以使用其他数据结构,例如链表和哈希。

关于c - 从 C 中的数组中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15821123/

相关文章:

python - 减去两个索引不重叠的 DataFrame

python - 减去 L8 带时 gdal_calc.py 中负值的饱和度

c - u-boot:如何从linux用户空间访问 'bootcount'?

c - 在枚举中使用十六进制时如何避免迂腐的警告?

c++ - 使用 cin.get 提取特定数量的字符并确保正确

arrays - Julia 将图像从 URL 直接下载到内存中

c - C中使用malloc动态分配内存

c - C 标准库中的 assert.h 中的 assert() 是否支持某种失败的断言处理程序?

c - 是否必须将未定义的行为定义为未定义?

c - 为什么这个指针减法会输出这个?