包含文件:
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;
如果我们说我在DBT数据库中有3只猫想要擦除 其中之一,我怎么能编码呢?我想要一个擦除功能 一只猫!
答案 0 :(得分:1)
嗯,catT的大小是固定的。哪个好。
如果要删除列表中的最后一只猫,那么很容易。只需使用realloc()即可使DBT变小。 (新尺寸为2 * sizeof(catT))。
如果要删除不是列表中最后一只猫的猫,请更改它。如果您不关心排序,那么只需使用列表中的最后一个cat覆盖要删除的cat(使用memcpy()执行此操作)。然后你可以删除列表中的最后一只猫。
答案 1 :(得分:1)
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
),这样你只需要移动指针(不要忘记{{1那么猫)。
答案 2 :(得分:0)
我假设您将为*cats
DBT
的3只猫分配内存
要擦除其中一只猫,你需要释放你要擦除的猫的记忆
我不能编写代码,因为我不知道你使用的变量和函数,但我希望这能给你一些想法。
答案 3 :(得分:0)
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开始这个功能,这对我非常有帮助!