我有一个结构:
typedef struct score_entry
{
char name[21];
int score;
} score_entry;
和一个数组:
score_entry readin[1000];
我想编写一个消耗score_entry array
和name(String)
的函数,并使用该名称删除数组中的所有结构并返回新数组。这可能吗?如果是这样怎么可能呢?
答案 0 :(得分:2)
你不能从C中的数组中“删除”元素。但你可以计算与 name 不匹配的元素,在堆上创建一个新数组,并复制所有元素利益。基本代码可能如下所示,但是,您应该使其安全,不要对struct标签和typename使用相同的标识符,并返回新数组的大小。
score_entry *sortout(score_entry *array, char* string) {
score_entry *newarray;
int i, n=0;
/* measure the size of the filtered array copy */
for(i=0; i<1000; i++) {
if (strcmp(array[i].name, string) n++;
}
/* allocate space for the filtered copy */
newarray = (score_entry*)calloc(n, sizeof(score_entry));
/* filter and copy the data */
for(i=0, n=0 ; i<1000; i++) {
if (strcmp(array[i].name, string))
newarray[n++] = array[i];
}
return newarray;
}
答案 1 :(得分:0)
我可能只是使用链表然后删除有问题的元素。否则,您必须遍历数组并跳过/移动与搜索字符串/名称不匹配的条目。
答案 2 :(得分:0)
创建后无法删除数组元素。而不是
score_entry readin[1000];
考虑创建链接列表。首先在结构中添加一个新元素
typedef struct score_entry
{
char name[21];
int score;
struct score_entry *next;
}
然后查看任何example of creating singly linked lists,然后继续执行新的功能实现,您可以轻松删除符合条件的节点
答案 3 :(得分:0)
如何跟踪数组中的元素数量?虽然你不能删除元素;你可以把它们挤出来,然后递减计数,例如:
void
delete(score arr[], int *nelem, score target){
int hi, lo, count;
for(hi=lo=0; hi<*nelem; hi++){
arr[lo] = arr[hi];
if(!same(target, arr[lo]))
lo++;
}
*nelem = lo;
}