Baixe o app para aproveitar ainda mais
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(); }
Compartilhar