Buscar

LLDE Cola para os Alunos Completa

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

/*
 * File: main.c
 * Author: alysson
 *
 * Created on 15 de Março de 2011, 11:34
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*Declaração da Estrutura do Tipo nó*/
typedef struct noh {
 struct noh *ant;
 int dado;
 struct noh *prox;
} *LLDE;
/*Declaração dos Protótipos*/
void inserir_inicio(LLDE *Lista, int Num);
void imprimir_lista(LLDE Lista);
int contar_nohs(LLDE Lista);
int remover_fim(LLDE *Lista);
int remover_inicio(LLDE *Lista);
void linhas_branco();
void lista_vazia();
int remover_penultimo(LLDE *Lista);
int remover_antepenultimo(LLDE *Lista);
void impossivel_executar_acao();
int remover_segunda_posicao(LLDE *Lista);
int retorna_primeiro(LLDE Lista);
int retorna_ultimo(LLDE Lista);
void inserir_segunda_posicao(LLDE *Lista, int Num);
void inserir_penultima_posicao(LLDE *Lista, int Num);
void inserir_fim(LLDE *Lista, int Num);
int remover_por_valor(LLDE *Lista, int Num);
void inserir_ordenado(LLDE *Lista, int Num);
int remover_cardinal(LLDE *Lista, int posicao);
void resetar_lista(LLDE *Lista);
void intercalar_listas(LLDE Lista1, LLDE Lista2);
/*Inicio do Programa Principal*/
int main() {
 LLDE Lista = NULL;
 LLDE ListaAux = NULL;
 long ltimei;
 ltimei = time(NULL); //Numeração do Relógio do computador
 srand(ltimei); //Inicializa a geracao do randomico com um numero
 int resp = 1, valor, retorno, cont;
 do {
 puts("Escolha uma das opcoes Abaixo:");
 puts("Digite [1] para Inserir no INICIO da Lista.");
 puts("Digite [2] para Remover no FIM da Lista.");
 puts("Digite [3] para Remover no INICIO da Lista.");
 puts("Digite [4] para Contar Nohs da Lista.");
 puts("Digite [5] para Remover Penultimo Noh da Lista.");
 puts("Digite [6] para Remover Antepenultimo Noh da Lista.");
 puts("Digite [7] para Remover Segundo Noh da Lista.");
 puts("Digite [8] para Retornar Primeiro Noh da Lista.");
 puts("Digite [9] para Retornar Ultimo Noh da Lista.");
 puts("Digite [10] para Inserir na Segunda Posicao da Lista.");
 puts("Digite [11] para Inserir na Penultima Posicao da Lista.");
 puts("Digite [12] para Inserir no FIM da Lista.");
 puts("Digite [13] para Remover por valor da Lista.");
 puts("Digite [14] para Inserir Ordenado na Lista.");
 puts("Digite [15] para Para escolher a posicao do Noh a Remover.");
 puts("Digite [16] para Resetar a Lista.");
 puts("Digite [17] para Intercalar Duas Listas.");
 puts("Digite [0] para Imprimir Valores da Lista.");
 puts("Digite [-1] para Sair do Programa.\n");
 printf("Opcao: ");
 scanf("%d", &resp);
 switch (resp) {
 case 1:
 system("clear");
 puts("Digite o valor a ser inserido na Lista");
 scanf("%i", &valor);
 inserir_inicio(&Lista, valor);
 break;
 case 2:
 system("clear");
 retorno = remover_fim(&Lista);
 if (retorno >= 0) {
 printf("O valor [ %d ] foi Removido com sucesso!", retorno);
 linhas_branco();
 puts("A lista agora esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 3:
 system("clear");
 retorno = remover_inicio(&Lista);
 if (retorno >= 0) {
 printf("O valor [ %d ] foi Removido com sucesso!", retorno);
 linhas_branco();
 puts("A lista agora esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 4:
 system("clear");
 printf("A Lista Possui [ %d ] Nohs!", contar_nohs(Lista));
 linhas_branco();
 break;
 case 5:
 system("clear");
 retorno = remover_penultimo(&Lista);
 if (retorno >= 0) {
 printf("O valor [ %d ] foi Removido com sucesso!", retorno);
 linhas_branco();
 puts("A lista agora esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 6:
 system("clear");
 retorno = remover_antepenultimo(&Lista);
 if (retorno >= 0) {
 printf("O valor [ %d ] foi Removido com sucesso!", retorno);
 linhas_branco();
 puts("A lista agora esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 7:
 system("clear");
 retorno = remover_segunda_posicao(&Lista);
 if (retorno >= 0) {
 printf("O valor [ %d ] foi Removido com sucesso!", retorno);
 linhas_branco();
 puts("A lista agora esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 8:
 system("clear");
 retorno = retorna_primeiro(Lista);
 if (retorno >= 0) {
 printf("O valor [ %d ] eh o primeiro elemento!\n", retorno);
 puts("A lista esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 9:
 system("clear");
 retorno = retorna_ultimo(Lista);
 if (retorno >= 0) {
 printf("O valor [ %d ] eh o ultimo elemento!\n", retorno);
 puts("A lista esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 10:
 system("clear");
 puts("Digite o valor a ser inserido na Lista");
 scanf("%i", &valor);
 inserir_segunda_posicao(&Lista, valor);
 break;
 case 11:
 system("clear");
 puts("Digite o valor a ser inserido na Lista");
 scanf("%i", &valor);
 inserir_penultima_posicao(&Lista, valor);
 break;
 case 12:
 system("clear");
 puts("Digite o valor a ser inserido na Lista");
 scanf("%i", &valor);
 inserir_fim(&Lista, valor);
 break;
 case 13:
 system("clear");
 puts("Digite o valor a ser Removido da Lista");
 scanf("%i", &valor);
 retorno = remover_por_valor(&Lista, valor);
 if (retorno >= 0) {
 printf("O valor [ %d ] foi removido com sucesso!\n", retorno);
 puts("A lista esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 } else {
 puts("O valor informado não foi encontrado na lista!");
 linhas_branco();
 }
 break;
 case 14:
 system("clear");
 puts("Digite o valor a ser inserido Ordenado na Lista");
 scanf("%i", &valor);
 inserir_ordenado(&Lista, valor);
 break;
 case 15:
 system("clear");
 puts("Digite a Posicao do Noh a ser Removido da Lista");
 scanf("%i", &valor);
retorno = remover_cardinal(&Lista, valor);
 if (retorno >= 0) {
 printf("O valor [ %d ] foi Removido com sucesso!", retorno);
 linhas_branco();
 puts("A lista agora esta assim:\n");
 imprimir_lista(Lista);
 linhas_branco();
 }
 break;
 case 16:
 system("clear");
 puts("Sua Lista Foi Reinicializada!!!");
 resetar_lista(&Lista);
 break;
 case 17:
 system("clear");
 puts("A segunda Lista Sera Preenchida com valores Aleatorios");
 printf("Digite o tamanho desejado para sua lista secundaria: ");
 scanf("%i", &valor);
 for(cont = 1; cont <= valor; cont++) {
 retorno = cont; //Pega o valor aleatorio para inserir na Lista
 inserir_fim(&ListaAux, retorno);
 }
 puts("Principal");
 imprimir_lista(Lista);
 linhas_branco();
 puts("Secundaria");
 imprimir_lista(ListaAux);
 linhas_branco();
 puts("Lista Intercalada");
 intercalar_listas(Lista, ListaAux);
 break;
 case 0:
 system("clear");
 puts("Os seguintes valores estao na Lista:\n");
 imprimir_lista(Lista);
 break;
 case -1:
 break;
 default:
 system("clear");
 puts("Nao existe esta opcao!!!\n\n");
 }
 } while (resp != -1);
 puts("\n\nO sistema foi Finalizado!!! Ate mais VER!!\n\n");
 return 0;
}
/*
#############################################
### Funções e Procedimentos Auxiliares ###
#############################################
 */
void linhas_branco() {
 puts("\n");
}
void lista_vazia() {
 puts("A Lista vazia!!!");
 linhas_branco();
}
void impossivel_executar_acao() {
 puts("Impossivel Executar a acao! Verifique sua lista!");
 linhas_branco();
}
/*
##############################################################
### Funções e Procedimentos para Manuteção de Lista LLDE ###
##############################################################
 */
void resetar_lista(LLDE *Lista) {
 *Lista = NULL;
}
void inserir_inicio(LLDE *Lista, int num) {
 LLDE P = *Lista;
 LLDE PNovo = (LLDE) malloc(sizeof (struct noh));
 PNovo -> prox = P;
 //P->ant = PNovo;
 PNovo -> dado = num;
 PNovo->ant = NULL;
 *Lista = PNovo;
}
void imprimir_lista(LLDE Lista) {
 LLDE P = Lista;
 if (Lista == NULL) {
 lista_vazia();
 } else {
 while (P->prox != NULL) {
 printf("[/|%i|*]-> ", P->dado);
 P = P->prox;
 }
 printf("<-[*|%i|/]", P->dado);
 linhas_branco();
 }
}
int remover_inicio(LLDE *Lista) {
 LLDE P = *Lista;
 int valor;
 if (*Lista == NULL) {
 lista_vazia();
 return -1;
 } else {
 *Lista = P->prox;
 valor = P->dado;
 free(P);
 return valor;
 }
}
int remover_fim(LLDE *Lista) {
 LLDE P = *Lista, Q;
 int valor;
 if (*Lista == NULL) {
 lista_vazia();
 return -1;
 } else if (contar_nohs(*Lista) == 1) {
 valor = remover_inicio(&(*Lista));
 return valor;
 } else {
 while (P-> prox != NULL) {
 Q = P;
 P = P -> prox;
 }
 Q -> prox = NULL;
 valor = P->dado;
 free(P);
 return valor;
 }
}
int contar_nohs(LLDE Lista) {
 int cont = 0;
 if (Lista != NULL) {
 LLDE P = Lista;
 while (P -> prox != NULL) {
 P = P-> prox;
 cont++;
 }
 return ++cont;
 } else {
 return cont;
 }
}
int remover_penultimo(LLDE *Lista) {
 LLDE P = *Lista, Q, W;
 int valor;
 if (*Lista == NULL) {
 lista_vazia();
 return -1;
 } else if (contar_nohs(*Lista) == 1) {
 impossivel_executar_acao();
 return -1;
 } else if (contar_nohs(*Lista) == 2) {
 valor = remover_inicio(&(*Lista));
 return valor;
 } else {
 W = P;
 Q = W->prox;
 P = Q->prox;
 while (P->prox != NULL) {
 W = Q;
 Q = P;
 P = P->prox;
 }
 W-> prox = P;
 valor = Q->dado;
 free(Q);
 return valor;
 }
}
int remover_antepenultimo(LLDE *Lista) {
 LLDE P = *Lista, Q, W, K;
 int valor;
 if (*Lista == NULL) {
 lista_vazia();
 return -1;
 } else if (contar_nohs(*Lista) < 3) {
 impossivel_executar_acao();
 return -1;
 } else if (contar_nohs(*Lista) == 3) {
 valor = remover_inicio(&(*Lista));
 return valor;
 } else {
 W = P;
 Q = W->prox;
 K = Q->prox;
 P = K->prox;
 while (P->prox != NULL) {
 W = Q;
 Q = K;
 K = P;
 P = P->prox;
 }
 W-> prox = K;
 valor = Q->dado;
 free(Q);
 return valor;
 }
}
int remover_segunda_posicao(LLDE *Lista) {
 LLDE P = *Lista, Q;
 int valor, quantidade;
 quantidade = contar_nohs(*Lista);
 if(*Lista == NULL) {
 lista_vazia();
 return -1;
 } else if(quantidade == 1){
 impossivel_executar_acao();
 return -1;
 } else if(quantidade == 2) {
 valor = remover_fim(&(*Lista));
 return valor;
 } else {
 Q = P->prox;
 P->prox = Q->prox;
 valor = Q->dado;
 free(Q);
 return valor;
 }
}
int retorna_primeiro(LLDE Lista) {
 LLDE P = Lista;
 if(Lista == NULL) {
 lista_vazia();
 return -1;
 }else {
 return P->dado;
 }
}
int retorna_ultimo(LLDE Lista) {
 LLDE P = Lista;
 if(Lista == NULL) {
 lista_vazia();
 return -1;
 }else if(contar_nohs(Lista) == 1) {
 return retorna_primeiro(Lista);
 }else {
 while(P->prox != NULL) {
 P= P->prox;
 }
 return P->dado;
 }
}
void inserir_segunda_posicao(LLDE *Lista, int Num) {
 LLDE P = *Lista, Q;
 LLDE PNovo = (LLDE) malloc(sizeof(struct noh));
 if(*Lista == NULL) {
 impossivel_executar_acao();
 }else if(contar_nohs(*Lista) == 1) {
 inserir_fim(&(*Lista), Num);
 }else {
 Q = P->prox;
 PNovo->prox = Q;
 Q->ant = PNovo;
 PNovo->ant = P;
 P->prox = PNovo;
 PNovo->dado = Num;
 }
}
void inserir_penultima_posicao(LLDE *Lista, int Num) {
 LLDE P = *Lista, Q;
 LLDE PNovo = (LLDE) malloc(sizeof(struct noh));
 if(*Lista == NULL) {
 impossivel_executar_acao();
 }else if(contar_nohs(*Lista) == 1) {
 inserir_inicio(&(*Lista), Num);
 }else {
 while(P->prox != NULL) {
 Q = P;
 P = P->prox;
 }
 PNovo->prox = Q->prox;
 Q->prox = PNovo;
 PNovo->dado = Num;
 }
}
void inserir_fim(LLDE *Lista, int Num) {
 LLDE P = *Lista;
 LLDE PNovo = (LLDE) malloc(sizeof(struct noh));
 if(*Lista == NULL) {
 inserir_inicio(&(*Lista), Num);
 } else {
 while(P->prox != NULL) {
 P = P->prox;
 }
 PNovo->prox = P->prox;
 PNovo->dado = Num;
 P->prox = PNovo;
 }
}
int remover_por_valor(LLDE *Lista, int Num) {
 LLDE P = *Lista, Q;
 int valor;
 if(*Lista == NULL) {
 lista_vazia();
 return -1;
 } else if(contar_nohs(*Lista) == 1 || contar_nohs(*Lista) == 2){
 if(P->dado == Num){
return remover_inicio(&(*Lista));
 }
 } else if(contar_nohs(*Lista) > 2) {
 while(P->dado != Num && P->prox != NULL) {
 Q = P;
 P = P->prox;
 }
 Q->prox = P->prox;
 valor = P->dado;
 free(P);
 return valor;
 }
}
void inserir_ordenado(LLDE *Lista, int Num) {
 LLDE P = *Lista, Q;
 LLDE PNovo = (LLDE) malloc(sizeof(struct noh));
 if(*Lista == NULL) {
 inserir_inicio(&(*Lista), Num);
 }else if(contar_nohs(*Lista) == 1) {
 if(Num >= P->dado ) {
 inserir_fim(&(*Lista), Num);
 } else {
 inserir_inicio(&(*Lista), Num);
 }
 }else if(contar_nohs(*Lista) == 2) {
 Q = P;
 P = P->prox;
 if( Num >= Q->dado && Num < P->dado) {
 inserir_segunda_posicao(&(*Lista), Num);
 }else if(Num < Q->dado) {
 inserir_inicio(&(*Lista), Num);
 }else if(Num >= P->dado) {
 inserir_fim(&(*Lista), Num);
 }
 }else if(contar_nohs(*Lista) > 2) {
 Q = P;
 P = P->prox;
 if(Num < Q->dado) {
 inserir_inicio(&(*Lista), Num);
 }else {
 while( Num > P->dado && P->prox != NULL) {
 Q = P;
 P = P->prox;
 }
 PNovo->dado = Num;
 PNovo->prox = P;
 Q->prox = PNovo;
 }
 }
}
int remover_cardinal(LLDE *Lista, int posicao) {
 LLDE P = *Lista, Q;
 int cont = 1, valor;
 if(*Lista == NULL || contar_nohs(*Lista) < posicao){
 impossivel_executar_acao();
 return -1;
 }else if(posicao == 1) {
 return remover_inicio(&(*Lista));
 }else if(posicao == 2) {
 return remover_segunda_posicao(&(*Lista));
 }else if(posicao > 2){
 while(cont < posicao){
 Q= P;
 P= P->prox;
 cont++;
 }
 Q->prox = P->prox;
 valor = P->dado;
 free(P);
 return valor;
 }
}
void intercalar_listas(LLDE Lista1, LLDE Lista2) {
 LLDE ListaInter = NULL;
 if((Lista1 == NULL) && (Lista2 == NULL)) {
 lista_vazia();
 }
 else {
 while((Lista1 != NULL) || (Lista2 != NULL)) {
 if(Lista1 != NULL) {
 inserir_fim(&ListaInter, remover_inicio(&Lista1));
 }
 if(Lista2 != NULL) {
 inserir_fim(&ListaInter, remover_inicio(&Lista2));
 }
 }
 }
 imprimir_lista(ListaInter);
 linhas_branco();
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando