删除c中数组的重复名称 [英] removing duplicated names for array in c

查看:36
本文介绍了删除c中数组的重复名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

this is what i have to make: c. It should be possible to remove an animal with a specified name. If more animals with the same name exist, it should remove all the animal with the same name.

这是我的代码:

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

the outcome after tyring to delete the animals with the same name: Animals in shelter: 1

姓名:泰德

物种:鹦鹉

年龄:1

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

only one gets deleted, the other one stays. what could cause this?

推荐答案

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

For starters the function should be declared at least like

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

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

As for your approach then it at least is inefficient because you move all elements of the array one position left after finding an element that need to be deleted.

这是一个演示程序

#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

这篇关于删除c中数组的重复名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆