Ir ao conteúdo

Posts recomendados

Postado

Estou com dificuldade em remover o menor elemento em uma lista estática/sequencial, fiz uma maneira onde eu acho o menor valor em uma unção e nela mesmo eu chamo uma função de remover passando o menor valor para remover, desse forma está funcionando mas minha professora quer que a função percorra a lista apenas uma vez e dessa forma iria percorrer duas. Vou deixar o código e espero que me ajudem.

Obs: se alguém quiser ajudar também com esse mesmo problema mas na lista dinâmica/encadeada com cabeçalho, também ajudaria.

Obs2: a função remove_elem funciona normal, mas preciso remover o menor sem chamar ela.

 

int menor_elem(Lista lst){
    if(lst==NULL || lista_vazia(lst)==1)
        return 0; //falha
    int menor, aux;
    for(aux=0;aux<lst->fim;aux++){
        if(aux==0)
            menor=lst->no[aux];
        else
            if(lst->no[aux]<menor)
                menor=lst->no[aux];
    }
    
    remove_elem(lst,menor);
    return 1; //sucesso
}

 

  • Curtir 1
Postado

@johnsigma     você poderia colocar assim  :

int menor_elem(Lista lst){
    if(lst==NULL || lista_vazia(lst)==1)
        return 0; //falha
    int menor, aux,pos;
    menor=lst->no[0];
    for(aux=0;aux<lst->fim;aux++){
        if(lst->no[aux]<menor)
            menor=lst->no[aux];
            pos=aux;
    }
    list->no[pos] = NULL;
    /*remove_elem(lst,menor);*/
    return 1; //sucesso
}

 

Postado

@devair1010

6 minutos atrás, devair1010 disse:

@johnsigma     você poderia colocar assim  :


int menor_elem(Lista lst){
    if(lst==NULL || lista_vazia(lst)==1)
        return 0; //falha
    int menor, aux,pos;
    menor=lst->no[0];
    for(aux=0;aux<lst->fim;aux++){
        if(lst->no[aux]<menor)
            menor=lst->no[aux];
            pos=aux;
    }
    list->no[pos] = NULL;
    /*remove_elem(lst,menor);*/
    return 1; //sucesso
}

 

Não deu certo, ele não remove o elemento. Acho que não dá pra fazer esse exercício percorrendo apenas uma vez, pois como a lista não é ordenada então sempre tem que percorrê-la inteira para tentar achar o elem.

  • Curtir 1
Postado
1 hora atrás, AnsiC disse:

Olá!

Poderíamos fazer o último elemento o menor elemento. 

Depois diminua 1 no marco fim.

Não entendi, poderia especificar mais ou até deixar um código?

  • Curtir 1
Postado

@devair1010

4 minutos atrás, devair1010 disse:

@johnsigma      se você puder   poste seu todo , assim poderemos ver como está e em que podemos ajudar   .

Lista.c:

#include <stdio.h>
#include <stdlib.h>
#include "lista.h"
#define max 10

struct lista{
    int no[max];
    int fim;
};

Lista cria_lista(){
    Lista lst;
    lst = (Lista) malloc(sizeof(struct lista));

    if(lst != NULL){
        lst->fim = 0;
    }
    return lst;
}

int lista_vazia(Lista lst){
    if(lst->fim==0)
        return 1; //lista vazia
    else
        return 0; //lista NÃO vazia
}

int lista_cheia(Lista lst){
    if(lst->fim==max)
        return 1; //lista cheia
    else
        return 0; //lista NÃO cheia
}

int insere_elem(Lista lst, int elem){
    if(lst == NULL || lista_cheia(lst) == 1)
        return 0; //falha
    lst->no[lst->fim]=elem; //insere o elemento
    lst->fim++; //avança o fim
    return 1; //sucesso
}

int remove_elem(Lista lst, int elem){
    if(lst==NULL || lista_vazia(lst)==1)
        return 0; //falha
    int i, Aux=0;

    while(Aux<lst->fim && lst->no[Aux]!=elem)
        Aux++;

    if(Aux==lst->fim) //percorreu a lista inteira
        return 0; //falha, o elemento não está na lista

    //se chegou aqui é porque o elemento está na lista

    for(i=Aux+1; i<lst->fim; i++)
        lst->no[i-1]=lst->no[i];

    lst->fim--;
    return 1; //sucesso na remoção
}

Lista imprime_lista(Lista lst){
    int i;
    if(lst->fim==0)
        printf("Lista vazia!\n\n");
    else{
        printf("Lista: ");
        for(i=0;i<lst->fim;i++){
            printf("%d ", lst->no[i]);
        }
        printf("\n\n");
    }
}

int menor_elem(Lista lst){
    if(lst==NULL || lista_vazia(lst)==1)
        return 0;
    int menor, aux;
    for(aux=0;aux<lst->fim;aux++){
        if(aux==0)
            menor=lst->no[aux];
        else
            if(lst->no[aux]<menor)
                menor=lst->no[aux];
    }

    remove_elem(lst,menor);
    return 1;
}

int tamanho(Lista lst){
    return printf("A lista tem %d elementos!\n", lst->fim);
}

int insere_inicio(Lista lst, int elem){
    if(lst==NULL || lista_cheia(lst))
        return 0;

    int i;

    for(i=lst->fim;i>0;i--)
        lst->no[i]=lst->no[i-1];

    lst->fim=lst->fim+1;
    lst->no[0]=elem;
    return 1;
}

int remove_todos(Lista lst, int elem){
    if(lst==NULL || lista_vazia(lst)==1)
        return 0; //falha
    int i, Aux=0;

    while(Aux<=lst->fim){
        if(lst->no[Aux]==elem){
            for(i=Aux+1;i<lst->fim;i++)
                lst->no[i-1]=lst->no[i];
            lst->fim--;
        }
        Aux++;
    }

    return 1; //sucesso na remoção
}

Lista concatenar(Lista lst1, Lista lst2){
    Lista lst3 = (Lista) malloc(sizeof(Lista));
    int i,j;

    for(i=0;i<lst1->fim;i++){
        lst3->no[i]=lst1->no[i];
    }

    j=lst3->fim;

    for(i=0;i<lst2->fim;i++){
        lst3->no[j+1]=lst2->no[i];
    }


    return lst3;
}

lista.h:

typedef struct lista *Lista;
Lista cria_lista();
int lista_vazia(Lista lst);
int lista_cheia(Lista lst);
int insere_elem(Lista lst, int elem);
int remove_elem(Lista lst, int elem);
Lista imprime_lista(Lista lst);
int menor_elem(Lista lst);
int tamanho(Lista lst);
int insere_inicio(Lista lst, int elem);
int remove_todos(Lista lst, int elem);
Lista concatenar(Lista lst1, Lista lst2);

user.c:

#include <stdio.h>
#include <stdlib.h>
#include "lista.h"

int main(){

    Lista lista1,lst1,lst2,lst3;
    lista1=cria_lista();
    lst1=cria_lista();
    lst2=cria_lista();

    tamanho(lista1);
    imprime_lista(lista1);

    insere_elem(lista1,4);
    insere_elem(lista1,0);
    insere_elem(lista1,2);
    insere_elem(lista1,10);
    insere_elem(lista1,21);
    insere_elem(lista1,7);
    insere_elem(lista1,3);

    tamanho(lista1);
    imprime_lista(lista1);

    remove_elem(lista1,2);

    tamanho(lista1);
    imprime_lista(lista1);

    insere_inicio(lista1,15);

    tamanho(lista1);
    imprime_lista(lista1);

    remove_elem(lista1,21);

    tamanho(lista1);
    imprime_lista(lista1);

    insere_inicio(lista1,16);

    tamanho(lista1);
    imprime_lista(lista1);

    remove_elem(lista1,15);

    tamanho(lista1);
    imprime_lista(lista1);

    menor_elem(lista1);

    tamanho(lista1);
    imprime_lista(lista1);

    insere_elem(lista1,7);
    insere_elem(lista1,7);

    tamanho(lista1);
    imprime_lista(lista1);

    tamanho(lista1);
    imprime_lista(lista1);

    insere_inicio(lista1,7);

    tamanho(lista1);
    imprime_lista(lista1);

    remove_todos(lista1,7);

    tamanho(lista1);
    imprime_lista(lista1);

    printf("\n");

    insere_elem(lst1,4);
    insere_elem(lst1,12);
    insere_elem(lst1,0);

    insere_elem(lst2,11);
    insere_elem(lst2,18);
    insere_elem(lst2,25);

    lst3=concatenar(lst1,lst2);

    imprime_lista(lst3);

    return 0;
}

Obs: a função concatenar também não está funcionando, se conseguirem me ajudar nela também!

  • Curtir 2
Postado
4 horas atrás, johnsigma disse:

Não entendi, poderia especificar mais ou até deixar um código?

 

Profa. precisa de uma solução que percorra sua lista 1 vez

16 horas atrás, johnsigma disse:

minha professora quer que a função percorra a lista apenas uma vez e dessa forma iria percorrer duas

e no dê o resultado do menor valor.

 

Então para todo vez que um certo elemento de A, todos elementos são únicos, exite um valor ai menor que ai+1: só nos resta trocar até que não exista. Logo o último elemento an será o menor elemento de A. Um exemplo:

 

#include  <stdio.h>
#include <stdlib.h>


void* vetor__excluir_menor_elem(int v[], unsigned int v_tamanho);
void* vetor__exibir_elem(int v[], unsigned int v_tamanho);


int main(void)
{   int vetor[]= {10, 1 ,3,4,5,6,7,8,9,2};
    int tamanho= sizeof vetor / sizeof (int);
    
    vetor__excluir_menor_elem(vetor, tamanho);
    vetor__exibir_elem(vetor, tamanho);
    return 0;
}


void* vetor__excluir_menor_elem(int v[], unsigned int v_tamanho)
{   if ((NULL == v) && (1000 < v_tamanho))
    {   puts("Falha!");
        exit(0);
    }
    else
    {   int tmp;
        for (unsigned int t= 1; v_tamanho > t; t= 1 + t)
        {   if (v[t-1] < v[t])
            {   tmp   = v[t];
                v[t]  = v[t-1];
                v[t-1]= tmp;
    }   }   }
    return v;
}


void* vetor__exibir_elem(int v[], unsigned int v_tamanho)
{   for(unsigned int t= 0; t < v_tamanho; t= 1 + t)
    {   printf(" %d", v[t]);
    }
    puts("");
    return v;
}

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!