删除c中数组的重复名称

2024-02-10

这就是我要做的:c。应该可以删除具有指定名称的动物。如果存在更多同名动物,则应删除所有同名动物。

这是我的代码:

void deleteAnimalByName(char *animalName, int *nrOfAnimals, ANIMAL *animalArray)
{
   for(int i = 0; i < *nrOfAnimals; i ++)
   {
       if(strcmp((animalArray + i)->Name, animalName) == 0)
       {
           for(int j = i; j < *nrOfAnimals - 1; j++)
           {
            animalArray[j] = animalArray[j + 1];
           }
           (*nrOfAnimals)--;
       }
   }
}

尝试删除同名动物后的结果: 收容所内的动物:1

姓名: 特德

种类: 鹦鹉

Age: 1

只有一个被删除,另一个保留。什么可能导致这种情况?


对于初学者来说,该函数至少应该声明为

size_t deleteAnimalByName( ANIMAL *animalArray, size_t nrOfAnimals, const char *animalName );

该函数可以定义为

size_t deleteAnimalByName( ANIMAL *animalArray, size_t nrOfAnimals, const char *animalName )
{
    size_t n = 0;

    for ( size_t i = 0; i < nrOfAnimals; i++ )
    {
        if ( strcmp( animalArray[i].Name, animalName ) != 0 )
        {
            if ( n != i ) animalArray[n] = animalArray[i];
            ++n;
        }
    }

    return n;
}

至于你的方法,那么它至少是低效的,因为你在找到需要删除的元素后将数组的所有元素向左移动一个位置。

这是一个演示程序

#include <stdio.h>
#include <string.h>

typedef struct ANIMAL
{
    char *Name;
} ANIMAL;

size_t deleteAnimalByName( ANIMAL *animalArray, size_t nrOfAnimals, const char *animalName )
{
    size_t n = 0;

    for ( size_t i = 0; i < nrOfAnimals; i++ )
    {
        if ( strcmp( animalArray[i].Name, animalName ) != 0 )
        {
            if ( n != i ) animalArray[n] = animalArray[i];
            ++n;
        }
    }

    return n;
}

int main(void) 
{
    ANIMAL animalArray[] =
    {
        { "hare" }, { "hare" }, { "fox" }, { "hare" }
    };
    
    size_t nrOfAnimals = sizeof( animalArray ) / sizeof( *animalArray );
    
    nrOfAnimals = deleteAnimalByName( animalArray, nrOfAnimals, "hare" );
    
    for ( size_t i = 0; i < nrOfAnimals; i++ )
    {
        printf( "%s ", animalArray[i].Name );
    }
    putchar( '\n' );

    return 0;
}

程序输出是

fox
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除c中数组的重复名称 的相关文章

随机推荐