• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

suzy

eliminar os clientes que tenham idade 13

4 mensagens neste tópico

caros :), tou aqui com uma duvida algo urgente

é o seguinte, tenho uma lista ligada simples, com 4 elementos no qual cada no ´da lista contem a idade do cliente e o ponteiro para o proximo elemento

tipo isto:

typedef struct objecto cliente, *pcliente;

struct objecto{

        int idade;

        pcliente prox;

        };

o que pretendo e eliminar todos os clientes que tenham idade 13

assim que elimino um, tenho de passar para o seguinte, e continuar a verificar,

fiz assim, mas nao da o que pretendo, alguem sabe como fazer?






cliente elimina(pcliente ptr, int n)
      {
     pcliente ant,actual,next;
     ant==NULL;
     actual=ptr;
     
     while(actual!=NULL && actual->idade!=n)
          {
          ant=actual;
          actual=actual->prox;
          
        
          if(actual==NULL)
             return ptr;
          else
            ant->prox=actual->prox;
            free(actual);
            ant=ant->prox;
            }
     return ptr;
   
};

obrigada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui vai. Não testei o código por isso espero n me ter enganado:

typedef struct
{
    int idade;
    pCliente proximo;
} cliente;

typedef struct
{
    cliente* primeiro;
    cliente* ultimo;
} listaClientes;


int eliminaPorIdade( listaClientes* pLista, int idade )
{
    if ( !pLista )
        return 0;

    int numElminados = 0;

    cliente* pClienteTemp;
    cliente* pClienteAnterior = null;
    cliente* pClienteActual = pLista->primeiro;

    // percorrer toda a lista
    while ( pClienteActual )
    {
        // se foi encontrado um elemento com a idade pretendida, elimina-lo da lista
        if ( pClienteActual->idade == idade )
        {

            // se o elemento nao e o primeiro da lista, ligar o anterior ao proximo
            if ( pClienteAnterior )
                pClienteAnterior->proximo = pClienteActual->proximo;

            // caso contrario, marcar o proximo como sendo o primeiro da lista
            else
                pLista->primeiro = pClienteActual->proximo;

            // se nao existe proximo elemento, o anterior passa a ser o ultimo
            if ( pClienteActual->proximo == null )
                pList->ultimo = pClienteAnterior;
            
            // guardar a referencia para o ponteiro a libertar
            pClienteTemp = pClienteActual;

            // passar o ponteiro actual para o proximo cliente
            pClienteActual= pClienteActual->proximo;

            // libertar a memoria do elemento eliminado da lista
            free( pClienteTemp );

            // mais um eliminado!
            numElminados++;
        }
        
        // se nao foi encontrado um elemento com a idade pretendida, passar ao proximo
        else
        {
            pClienteActual = pClienteActual->proximo;
        }
    

    }

    // all done!
    return numEliminados;

}

Exemplo de utilização:


int main( int argc, char** argv )
{
    listaClientes lista;
    cliente* pCli;
    
    // substituir isto por uma funcao que adicione elementos a lista
    pCli = malloc(sizeof(cliente));
    pCli->idade = 20;
    lista->primeiro = pCli;
    
    // substituir isto por uma funcao que adicione elementos a lista
    pCli = malloc(sizeof(cliente));
    pCli->idade = 13;
    lista->primeiro->seguinte = pCli;
    
    // substituir isto por uma funcao que adicione elementos a lista
    pCli = malloc(sizeof(cliente));
    pCli->idade = 18;
    lista->primeiro->seguinte = pCli;

    // deve remover a segunda entrada da lista
    eliminaPorIdade( &lista, 13 );

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A papinha toda feita. É precisamente o que é desaconselhado, não a vai ajudar como deveria, mas cada utilizador sabe das suas respostas. E como utiliza as respostas dos outros.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:) obrigada bytecode, mas o teu exemplo esta algo complexo para aquilo que pretendia :-[

vou continuar a tentar, para o exemplo que disse

thanks

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora