Pesquisar neste blog

27/02/2018

Algoritmo Lista em C/C++

Objetivo : Inserir elementos no inicio da lista, no fim da lista, inserir em posição qualquer da lista, remover em posição qualquer da lista.

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

typedef struct celulalista{
int informacao;
struct celulalista *proximo;
}celula;

void iniciar_Lista(celula *pRecebido);
void inserir_Inicio(celula *pRecebido);
void Consultar(celula *pRecebido);
void remove_inicio(celula *pRecebido);
int levalor(int *valorrecebido);
void insere_qualquer(celula *pRecebido);
void busca_e_remove(celula *pRecebido);
void insert_Fim(celula *pRecebido);
void remove_Fim(celula *pRecebido);
void removeElementoListaFim(celula **pRecebido);

int main()
{
//Declaracoes
celula *pLista;
int opcao=0;

//pLista = (celula *)malloc(sizeof(struct celulalista));

pLista = new celulalista;
iniciar_Lista(pLista);
for(;;)
{
cout<<"\n\t1 - Inserir no inicio: ";
cout<<"\n\t2 - Consultar : ";
cout<<"\n\t3 - Remover no inicio: ";
cout<<"\n\t4 - Inserir em posicao qualquer : ";
cout<<"\n\t5 - Remover em posicao qualquer : ";
cout<<"\n\t6 - Inserir no final : ";
cout<<"\n\t7 - Remover no final : ";
cout<<"\n\t8 - Sair : \n\t";
cin>>opcao;
opcao = levalor(&opcao);
switch(opcao)
{
case 1:
inserir_Inicio(pLista);
break;
case 2:
Consultar(pLista);
break;
case 3:
remove_inicio(pLista);
break;
case 4:
insere_qualquer(pLista);
break;
case 5:
busca_e_remove(pLista);
break;
case 6:
insert_Fim(pLista);
break;
case 7:
removeElementoListaFim(&pLista);
break;
case 8:
exit(0);
}
}
return 0;
}
/*
Inicializacao da lista encadeada
*/

void iniciar_Lista(celula *pRecebido){
(pRecebido)->proximo = NULL;
}
/*
Funcao para insercao no inicio
*/

void inserir_Inicio(celula *pRecebido){
//Declaracoes
celula *temporario;
int valor;
//Instrucoes
cout<<"\n\tInforme um valor a ser inserido : ";
cin>>valor;
temporario = (celula * )malloc(sizeof(celula));
temporario->informacao = valor;
temporario->proximo = (pRecebido)->proximo;
(pRecebido)->proximo = temporario;
}
/*
Funcao para percorrer elementos
*/
void Consultar(celula *pRecebido){
//Declaracoes
celula *temporario;
int i=0;
//Instrucoes
if((pRecebido)->proximo == NULL){
cout<<"\tLista Vazia!\n";
}else{
temporario = (celula * )malloc(sizeof(celula));
temporario = (pRecebido)->proximo;
system("cls");
while(temporario!=NULL){
cout<<"\n\t"<<(i= i+1)<<": Valor : "<<temporario->informacao<<"\n";
temporario = temporario->proximo;
}
}
}
/*
Remove elemento da cabeca
*/
void remove_inicio(celula *pRecebido){
//Declaracoes
celula *temporario;
//Instrucoes
if((pRecebido)->proximo == NULL){
cout<<"\n\tLista Vazia!";
}else{
temporario = (pRecebido)->proximo;
(pRecebido)->proximo = temporario->proximo;
free(temporario);
}
}

int levalor(int *valorrecebido){
//Declaracoes
//Instrucoes
while((*valorrecebido > 8 )|| (*valorrecebido < 1)){
cout<<"\n\tOpcao Invalida. Informe novamente : \n";
scanf("%d", &(*valorrecebido));
}
return (*valorrecebido);
}
// COMECEI A IMPLEMENTAR A PARTIR DAQUI

void insere_qualquer(celula *pRecebido){
// Declarações
celula *aux1, *aux2, *temporario;
int posicao, valor;

// Instruções
if((pRecebido)->proximo == NULL){
printf("\nA lista esta vazia!");
}else{
cout<<"\n\tDigite o valor a ser inserido apos o valor :";cin>>posicao;
cout<<"\n\tDigite o valor a ser inserido :";cin>>valor;

temporario = (celula *)malloc(sizeof(celula));
temporario->informacao = valor;
aux1 = (pRecebido);
aux2 = (pRecebido)->proximo;
while (aux2 != NULL && aux2->informacao != posicao) {
aux1 = aux2;
aux2 = aux2->proximo;
}
temporario->proximo = aux2;
aux1->proximo = temporario; 
}
}

void busca_e_remove(celula *pRecebido){
// Declarações
celula *aux1, *aux2;
int posicao;
// Instruções
if((pRecebido)->proximo == NULL){
printf("\nA lista esta vazia!");
}else{
aux1 = (pRecebido);
aux2 = (pRecebido)->proximo;
cout<<"\n\tDigite o valor a ser removido : "; cin>>posicao;

while (aux2 != NULL && aux2->informacao != posicao){
aux1 = aux2;
aux2 = aux2->proximo;
}
if(aux2 != NULL){
aux1->proximo = aux2->proximo;
free(aux2);//liberar e evitar esvaziamento de memoria
}
}
}

void insert_Fim(celula *pRecebido){
// Declarações
celula *temporario;
int valor;
// Instruções
temporario = (celula *)malloc(sizeof(celula));
if(!temporario){
printf("Lista Cheia!\n");
exit(1);
}else{
printf("\nInforme um Valor a ser Inserido : ");
scanf("%d", &valor);
}
temporario->informacao = valor;
temporario->proximo = NULL;

if((pRecebido)->proximo == NULL){
(pRecebido)->proximo = temporario;
}else{
celula *tmp = (pRecebido)->proximo;

while(tmp->proximo != NULL)
tmp = tmp->proximo;
tmp->proximo = temporario;
}
}

void removeElementoListaFim(celula **pRecebido){
// Declarações
celula *temporario;
// Instruções
if((*pRecebido)->proximo == NULL){
printf("Lista vazia\n\n");
}else{
celula *ultimo = (*pRecebido)->proximo,
*penultimo = (*pRecebido);

while(ultimo->proximo != NULL){
penultimo = ultimo;
ultimo = ultimo->proximo;
}
penultimo->proximo = NULL;
}
}


MÉTODO 2

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

using namespace std;

typedef struct celulaLista{
   int informacao;
   struct celulaLista *proximo;
}celula;

void initLista(celula **pRecebido);
void insertListaInicio(celula **pRecebido);
void insertListaFim(celula **pRecebido);
void insertListaPosicao(celula **pRecebido);
void buscaListaSimples(celula **pRecebido);
void removeElementoListaInicio(celula **pRecebido);
void removeElementoListaFim(celula **pRecebido);
void removeElementoListaPosicao(celula **pRecebido);
int leValor(int *valorRecebido);

int main(){
// Declarações
celula *pLista;
int opcao = 0;
//pLista = (celula *)malloc(sizeof(struct celulaLista));
pLista = new celulaLista;
initLista(&pLista);
for(;;){
printf("\n1 - Inserir no Inicio: ");
printf("\n2 - Inserir no Final: ");
printf("\n3 - Inserir em qualquer posicao: ");
printf("\n4 - Consultar: ");
printf("\n5 - Remover do Inicio");
printf("\n6 - Remover do Final");
printf("\n7 - Remover de qualquer posicao");
printf("\n8 - Sair\n");
scanf("%d", &opcao);
opcao = leValor(&opcao);
switch(opcao)
{
case 1:
insertListaInicio(&pLista);
break;
case 2:
insertListaFim(&pLista);
  break;
case 3:
insertListaPosicao(&pLista);
  break;
case 4:
buscaListaSimples(&pLista);
break;
case 5:
removeElementoListaInicio(&pLista);
break;
case 6:
removeElementoListaFim(&pLista);
break;
case 7:
removeElementoListaPosicao(&pLista);
break;
case 8:
exit(0);
}
}
return 0;
}
/*
   Inicialização da Lista Encadeada
*/
void initLista(celula **pRecebido){
   (*pRecebido)->proximo = NULL;
}
/*
   Função para Inserção no Início
*/
void insertListaInicio(celula **pRecebido){
// Declarações
celula *temporario;
int valor;
// Instruções
printf("\nInforme um Valor a ser Inserido : ");
scanf("%d", &valor);
temporario = (celula *)malloc(sizeof(celula));
temporario->informacao = valor;
temporario->proximo = (*pRecebido)->proximo;
(*pRecebido)->proximo = temporario; 
}
/*
   Função para Inserção no Fim
*/
void insertListaFim(celula **pRecebido){
// Declarações
celula *temporario;
int valor;
// Instruções
temporario = (celula *)malloc(sizeof(celula));
if(!temporario){
printf("Lista Cheia!\n");
exit(1);
}else{
printf("\nInforme um Valor a ser Inserido : ");
scanf("%d", &valor);
}
temporario->informacao = valor;
temporario->proximo = NULL;

if((*pRecebido)->proximo == NULL){
(*pRecebido)->proximo = temporario;
}else{
celula *tmp = (*pRecebido)->proximo;

while(tmp->proximo != NULL)
tmp = tmp->proximo;
tmp->proximo = temporario;
}
}
/*
   Função para Inserção em Qualquer Posicao
*/
void insertListaPosicao(celula **pRecebido){
// Declarações
celula *p, *q, *temporario;
int posicao;
int valor;
// Instruções
if((*pRecebido)->proximo == NULL){
printf("\nLista Vazia!");
}else{
printf("\nInserir apos a posicao : ");
scanf("%d", &posicao); 
printf("\nInforme um Valor a ser Inserido : ");
scanf("%d", &valor);

temporario = (celula *)malloc(sizeof(celula));
temporario->informacao = valor;
p = (*pRecebido);
q = (*pRecebido)->proximo;
while (q != NULL && q->informacao != posicao) {
p = q;
q = q->proximo;
}
temporario->proximo = q;
p->proximo = temporario; 
}
}
/*
   Função para Percorrer Elementos
*/
void buscaListaSimples(celula **pRecebido){
// Declarações
celula *temporario;
// Instruções
if((*pRecebido)->proximo == NULL){
printf("Lista Vazia!\n");
}
else{
temporario = (celula *)malloc(sizeof(celula));
temporario = (*pRecebido)->proximo;
while(temporario != NULL){
printf("Valor : %d\n", temporario->informacao);
temporario = temporario->proximo;
}

}
/*
   Remove Elemento do Inicio
*/
void removeElementoListaInicio(celula **pRecebido){
// Declarações
celula *temporario;
// Instruções
if((*pRecebido)->proximo == NULL){
printf("\nLista Vazia!");
}
else{
temporario = (*pRecebido)->proximo;
(*pRecebido)->proximo = temporario->proximo;
free(temporario);
}
}
/*
   Remove Elemento do Fim
*/
void removeElementoListaFim(celula **pRecebido){
// Declarações
celula *temporario;
// Instruções
if((*pRecebido)->proximo == NULL){
printf("Lista vazia\n\n");
}else{
celula *ultimo = (*pRecebido)->proximo,
*penultimo = (*pRecebido);

while(ultimo->proximo != NULL){
penultimo = ultimo;
ultimo = ultimo->proximo;
}
penultimo->proximo = NULL;
}
}
/*
   Remove Elemento de Qualquer Posicao
*/
void removeElementoListaPosicao(celula **pRecebido){
// Declarações
celula *p, *q;
int posicao;
// Instruções
if((*pRecebido)->proximo == NULL){
printf("\nLista Vazia!");
}else{
p = (*pRecebido);
q = (*pRecebido)->proximo;
printf("\nRemover o valor : ");
scanf("%d", &posicao);
while (q != NULL && q->informacao != posicao){
p = q;
q = q->proximo;
}
if(q != NULL){
p->proximo = q->proximo;
free(q);
}
}
}
/*
   Opção para Validação da Entrada
*/
int leValor(int *valorRecebido){
   // Declarações
   // Instruções
while((*valorRecebido > 8) || (*valorRecebido < 1)){
printf("Opcao Invalida. Informe novamente : \n");
scanf("%d", &(*valorRecebido));
}
return(*valorRecebido);
}

Nenhum comentário: