gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:27:05 25 4
gpt4 key购买 nike

我只是有一个关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com