Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas G. Freitas

Implementando cadastro veiculos listas encadeada

Recommended Posts

preciso fazer esse trabalho que criei um cadastro de veiculos em listas encadeadas, minha dificuldade está em como implementar a parte de inserção na lista, na aula fizemos exemplos de inserção direta, ex nodafuncao(5) ou seja nome da função e o valor desejado, agora preciso inserir vários valores e preciso digitar e armazenar isso para depois lançar no parâmetro ou lançar direto, não sei o que é melhor, só quero um exemplo pois quero fazer esse trabalho para já estudar para a prova, já fiz de várias maneiras e até agora não consegui, se alguém poder dar uma forcinha.

 

um dos códigos que estou implementando

 

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

//Define a estrutura da Lista Encadeada (Define como será cada elemento/Nodo da lista)
typedef struct No{
 int idade; //Dados da lista
 struct No *prox; //Ponteiro para o próximo elemento da lista
} No;


//Função que cria um elemento
//Retorna um ponteiro para o elemento criado
No * cria_elemento(int idade){
 No *novo;
 novo = (No *) malloc(sizeof(No));
 novo->idade = idade;
 novo->prox  = NULL;
 return novo;
}


//Função para inserir um elemento na primeira posição da lista
No * insere_primeiro(No * lista, No * novo){
 novo->prox = lista;
 return novo;
}



//Insere o novo elemento na ultima posição da lista
No * insere_ultimo(No * lista, No * novo){
 if (lista != NULL) {
     No * aux = lista;
     while (aux->prox != NULL){
       aux = aux->prox;
     }
     aux->prox = novo;
     return lista;
 }else{
   return novo;
 }
}


//Remove o elemento da posição especificada
No * remove_elemento(No * lista, int posicao){
   printf("Implementar! \n");

}


void apresenta_lista(No * lista){
 //Percorrendo os elementos da lista
 int cont = 0;
 if (lista != NULL){
   printf("|");
   while (lista != NULL){
     printf("%d|", lista->idade);
     lista = lista->prox;
   }
   printf("\n");
 }
}


No * inserir_elemento_na_posicao(No * lista, No * novo, int posicao){

 No * aux = lista;
 int cont = 1;

 //Verifica se a lista está vazia
 if (lista == NULL){
   return novo;
 }

 //Verifica se está realizando a inclusão na primeira posição
 if (posicao == 1){
   novo->prox = lista;
   return novo;
 }else{
   //Percorre a lista até encontrar o elemento anterior a posição onde será incluído o novo elemento
   while(aux->prox!= NULL && cont < (posicao-1)){
     aux = aux->prox;
     cont++;
   }
   //ajusta a referência de próximo do novo elemento
   novo->prox = aux->prox;
   //liga o elemento anterior ao elemento novo

   aux->prox = novo;

   return lista;
 }
}

int main() {

 //Nó de referência - Início da Lista
 No * lista = NULL;

 //Cria elementos para inserir na lista
 cria_elemento(35);
 No *n2 = cria_elemento(50);
 No *n3 = cria_elemento(30);
 No *n4 = cria_elemento(55);
 No *n5 = cria_elemento(3);


 printf("Inserindo na ultima posicao da lista os elementos n1 e n2 \n");
 lista = insere_ultimo(lista, n);
 lista = insere_ultimo(lista, n2);

 //Apresenta a lista com os dois elementos
 apresenta_lista(lista);

 system("PAUSE");

 printf("Inserindo n3 como primeiro elemento da lista \n");
 lista = insere_primeiro(lista, n3);

 printf("Inserindo n4 como ultimo elemento da lista \n");
 lista = insere_ultimo(lista, n4);

 // Apresenta a lista com o elemento n3 na primeira posição
 apresenta_lista(lista);

 system("PAUSE");

 printf("Inserindo elemento n5 na posicao 1 \n");
 lista = inserir_elemento_na_posicao(lista, n5, 1);

 // Apresenta a lista
 apresenta_lista(lista);
 system("PAUSE");


 printf("Removendo o elemento da posicao 1 da lista \n");
 lista = remove_elemento(lista, 1);

 // Apresenta a lista
 apresenta_lista(lista);
 system("PAUSE");

 printf("Removendo o elemento da posicao 2 da lista \n");
 lista = remove_elemento(lista, 2);

 // Apresenta a lista
 apresenta_lista(lista);

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom seu código, só três observações:

 

1. Na função de remoção de nós:

 

No * remove_elemento(No * lista, int posicao){
   printf("Implementar! \n");
}

 

Você declara o retorno como um nó, mas na verdade não está retornando nada. O compilador pode reclamar disso.

 

2. *Geralmente* em exercícios de criar uma lista, costuma-se criar um nó dentro da função de inserção. Acaba dando no mesmo, a diferença é onde será chamada a função de criação. Isso não é muito importante. E ainda na parte da inserção, como essa é sua dúvida principal, é melhor você sempre usar uma única variável para indicar a cabeça da lista. Ou seja, na inserção, ao invés de fazer um return novo; faça a função do tipo void, e coloque o seguinte:

if (posicao == 1){
novo->prox = lista;
lista = novo;

 

3. Se não estou enganado, quando você chama a função de impressão, você acaba perdendo a cabeça da lista, já que não usa nenhuma variável auxiliar para percorrer sua lista. Como ela não é duplamente encadeada, você acaba perdendo sua estrutura.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.