Удалить из массива структуры; s - PullRequest
0 голосов
/ 27 марта 2012

У меня есть структура:

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

и массив: score_entry readin[1000];

Я хочу написать функцию, которая потребляет score_entry array и name(String), и удалить всеструктуры в массиве с этим именем и возвращают новый массив.Это возможно?если да, то как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 27 марта 2012

Ну, вы не можете "удалить" элементы из массива в 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;

  }
0 голосов
/ 28 марта 2012

Как вы отслеживаете количество элементов в массиве? Хотя вы не можете удалить элементы; Вы можете убить их, а затем уменьшить счет, например:

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;
}
0 голосов
/ 27 марта 2012

Элементы массива не могут быть удалены после создания.Вместо

score_entry readin[1000];

Попробуйте создать связанный список.Сначала добавьте новый элемент в структуру

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

А затем посмотрите на любой пример создания односвязных списков , а затем перейдите к реализации новой функции, в которой вы можете легко удалить узлы, которые соответствуюткритерий

0 голосов
/ 27 марта 2012

Я бы, вероятно, просто использовал связанный список, а затем удалил рассматриваемые элементы.В противном случае вам придется перебирать массив и пропускать / перемещать записи, не соответствующие строке / имени поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...