从结构数组中删除; s

时间:2012-03-27 19:03:55

标签: c arrays string structure

我有一个结构:

typedef struct score_entry
{
    char name[21];
    int score;
} score_entry;

和一个数组:     score_entry readin[1000];

我想编写一个消耗score_entry arrayname(String)的函数,并使用该名称删除数组中的所有结构并返回新数组。这可能吗?如果是这样怎么可能呢?

4 个答案:

答案 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;
}