Проблема в C - Как стереть массив в структуре базы данных - PullRequest
1 голос
/ 04 февраля 2011

включаемых файлов:

stdio.h
string.h
ctype.h
genlib.h
simpio.h
strlib.h

Структура базы данных выглядит следующим образом:

typedef struct{

    catT *cats;
    int currentMaxSize;
    int currentNumberOfCats;
    int nextId;

} *DBT;

и структура "cats" выглядит следующим образом:

typedef struct {

    int id;
    string name;
    char gender;
    int birthYear;
    int numberOfColours;
    string colours[MAX_COLOURS];

} catT;

Если мы скажем, что у меня есть 3 кошки в базе данных DBT и мы хотим стереть один из них, как я могу его кодировать? Я хочу иметь функцию, чтобы стереть кот!

Ответы [ 4 ]

1 голос
/ 04 февраля 2011

Ну, размер catT фиксирован. Что хорошо.

Если вы хотите стереть последнего кота в списке, это легко. Просто используйте realloc (), чтобы уменьшить размер DBT. (новый размер будет 2 * sizeof (catT)).

Если вы хотите удалить кошку, которая не является последней в списке, измените ее. Если вам не нужна сортировка, просто переопределите кошку, которую вы хотите удалить, последней кошкой в ​​списке (сделайте это с помощью memcpy ()). Затем вы можете удалить последнего кота в списке.

1 голос
/ 04 февраля 2011
void freeCat(int atIndex, DBT db)
{
    if (atIndex < db->currentNumberOfCats)
    {
        if (atIndex < db->currentNumberOfCats - 1)
        {            
            memmove(db->cats + atIndex, 
                    db->cats + atIndex + 1, 
                    db->currentNumberOfCats - atIndex - 1);
        }
        db->currentNumberOfCats--;
    }
}

Но это дорого.Если вы собираетесь многократно удалять кошек, используйте связанный список или рассмотрите возможность выделения catT в куче (catT **cats), так что вам нужно только перемещать указатели (не забывайте тогда free кошку).

0 голосов
/ 04 февраля 2011

void freeCat (int atIndex, DBT db) { int i;

if (atIndex < db->currentNumberOfCats)
{         
    if (atIndex < db->currentNumberOfCats - 1)
    {
        for(i = atIndex; i < db->currentNumberOfCats; i++){
            db->cats[i] = db->cats[i+1];
        }
    }         
    db->currentNumberOfCats--;
} 

}

Я сделал эту функцию, и она отлично работает! Спасибо всем и @Daniel Gehriger за запуск функции, это мне очень помогло!

0 голосов
/ 04 февраля 2011

Я предполагаю, что вы выделите память для 3 кошек с *cats из DBT.
Чтобы стереть одну из кошек, вам нужно освободить память для кошки, которую вы хотите стереть.
Я могуне пишите код, так как я не знаю переменных и функций, которые вы используете, но я надеюсь, что это даст вам некоторое представление.

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