Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <string.h>
- #define MAX_PALAVRA 50 // Tamanho maximo para o nome!
- #define MAX_LINGUA 2
- #define LINGUA "PT"
- #define NOME_FICHEIRO "PT.txt"
- //estrutura palavra
- typedef struct Palavra {
- char texto[MAX_PALAVRA];
- } *PALAVRA;
- typedef struct Elemento {
- PALAVRA inf;
- struct Elemento *seg;
- } *ELEMENTO;
- typedef struct Lista {
- char lingua[MAX_LINGUA]; /* a) */
- int nelementos; /* b */
- ELEMENTO inicio; /* c */
- } *LISTA;
- LISTA criar_lista(){
- LISTA L;
- L = (LISTA)malloc(sizeof(struct Lista));
- if(!L){
- printf("\n Memoria insuficiente");
- L->inicio = NULL;
- L->nelementos = 0;
- return L;
- }
- }
- ELEMENTO criar_elemento(){
- ELEMENTO E = (ELEMENTO) malloc(sizeof(struct Elemento));
- E->inf = (PALAVRA) malloc(sizeof(struct Palavra));
- E->seg = NULL;
- return E;
- }
- int validar_elemento(ELEMENTO E) {
- char *palavra = E->inf->texto;
- for (int i=0;i<strlen(palavra);i++)
- if (palavra[i]<0 || palavra[i]>128 || !isalpha(palavra[i]))
- return 0;
- return 1;
- }
- void ler_elemento(ELEMENTO E) {
- int elemento_valido;
- do {
- printf("Palavra: ");
- scanf("%s", E->inf->texto);
- if (!(elemento_valido = validar_elemento(E)))
- printf("Introduza apenas letras [a-zA-z] sem caracteres acentuados.\n");
- } while (!elemento_valido);
- }
- int comparar_elementos(ELEMENTO A, ELEMENTO B) {
- PALAVRA PA = (PALAVRA) A->inf, PB = (PALAVRA) B->inf;
- return strcmp(PA->texto, PB->texto); // Verificar se A=B através do texto
- }
- int elementos_iguais(ELEMENTO A, ELEMENTO B) {
- return comparar_elementos(A,B)==0;
- }
- void inserir_elemento_ordenado(LISTA L, ELEMENTO ele_novo) {
- if (!L || !ele_novo)
- return;
- int av=1;
- ELEMENTO ant,act;
- if (L->inicio==NULL) {
- ele_novo->seg=NULL;
- L->inicio=ele_novo;
- } else {
- ant=act=L->inicio;
- while(av)
- if(act==NULL)
- av=0;
- else if(comparar_elementos(act, ele_novo)>0)
- av=0;
- else {
- ant=act;
- act=act->seg;
- }
- if(act==L->inicio) {
- ele_novo->seg=L->inicio;
- L->inicio=ele_novo;
- }
- else {
- ant->seg=ele_novo;
- ele_novo->seg=act;
- }
- }
- L->nelementos++;
- }
- ELEMENTO pesquisar_iterativo(LISTA L, ELEMENTO ele_pesquisa) {
- if (!ele_pesquisa || !L)
- return NULL;
- ELEMENTO aux = L->inicio;
- while (aux) {
- if (elementos_iguais(aux, ele_pesquisa))
- return aux;
- else
- aux = aux->seg;
- }
- return NULL;
- }
- ELEMENTO pesquisar_recursivo_elemento(ELEMENTO C, ELEMENTO ele_pesquisa) {
- if (!C)
- return NULL;
- if (elementos_iguais(C, ele_pesquisa))
- return C;
- else
- return pesquisar_recursivo_elemento(C->seg, ele_pesquisa);
- }
- ELEMENTO pesquisar_recursivo(LISTA L, ELEMENTO ele_pesquisa) {
- if (!L || !ele_pesquisa)
- return NULL;
- return pesquisar_recursivo_elemento(L->inicio, ele_pesquisa);
- }
- int elementos_repetidos(LISTA L) {
- if (!L)
- return 0;
- ELEMENTO cmp = NULL;
- ELEMENTO ref = L->inicio;
- while (ref->seg) {
- cmp=ref->seg;
- while (cmp) {
- if (elementos_iguais(ref, cmp))
- return 1;
- else
- cmp=cmp->seg;
- }
- ref=ref->seg;
- }
- return 0;
- }
- void libertar_elemento(ELEMENTO ele_libertar) {
- free(ele_libertar->inf); // Destroi informacao
- free(ele_libertar); // Destroi o elemento
- }
- ELEMENTO remover_elemento(LISTA L, ELEMENTO ele_remover) {
- if (!L)
- return NULL;
- int av=1;
- ELEMENTO ret,ant,act;
- if (L->inicio==NULL)
- ret=NULL;
- else {
- ant=act=L->inicio;
- while(av)
- if(act==NULL)
- av=0;
- else if(elementos_iguais(act, ele_remover))
- av=0;
- else {
- ant=act;
- act=act->seg;
- }
- if(act!=NULL) {
- ret=act;
- if(L->inicio==act)
- L->inicio=act->seg;
- else
- ant->seg=act->seg;
- L->nelementos--;
- }else
- ret=NULL;
- }
- return ret;
- }
- ELEMENTO remover_primeiro(LISTA L) {
- if (!L)
- return NULL;
- ELEMENTO p = L->inicio;
- if (p) {
- L->inicio = p->seg;
- L->nelementos--;
- return p;
- }
- return NULL;
- }
- ELEMENTO remover_ultimo(LISTA L) {
- if (!L)
- return NULL;
- // Temos de ir andando na Lista e quando chegar ao Fim....
- // Temos de ter sempre um ponteiro para o anterior ...
- // Caso em que a Lista tem elementos!
- ELEMENTO ant = NULL;
- ELEMENTO p = L->inicio;
- while (p->seg) {
- ant = p;
- p = p->seg;
- }
- // Repare-se que ant e um ponteiro para o penultimo elemento da lista!
- if (ant) // a lista tem mais do que um elemento!
- ant->seg = NULL;
- else
- L->inicio = NULL;
- L->nelementos--;
- return p;
- }
- void mostrar_elemento(ELEMENTO ele_mostrar) {
- printf("%s",ele_mostrar->inf->texto);
- }
- void mostrar_ordenado(LISTA L) {
- if (!L)
- return;
- ELEMENTO p = L->inicio;
- while (p) {
- mostrar_elemento(p);
- printf(" ");
- p = p->seg;
- }
- }
- void mostrar_ordenado_inversa(ELEMENTO p) {
- if (p) {
- mostrar_ordenado_inversa(p->seg);
- mostrar_elemento(p);
- printf(" ");
- }:;:_kojnkl
- }
- void mostrar_inversa(LISTA L) {
- if (!L)
- return;
- mostrar_ordenado_inversa(L->inicio);
- }
- void destruir(LISTA L) {
- if (!L)
- return;
- // Destroi a Lista e toda a informação que ela contêm
- ELEMENTO p = L->inicio;
- while (p) {
- ELEMENTO ant = p;
- p = p->seg;
- libertar_elemento(ant);
- }
- L->inicio = NULL;
- L->nelementos = 0;
- }
- void exportar_ficheiro(LISTA L, char *nome_ficheiro) {
- if (!L)
- return;
- FILE *f = fopen(nome_ficheiro, "w");
- fprintf(f, "%d\n", L->nelementos);
- ELEMENTO p = L->inicio;
- while (p) {
- fprintf(f, "%s\n",p->inf->texto);
- p = p->seg;
- }
- fclose(f);
- }
- void importar_ficheiro(LISTA L, char *nome_ficheiro) {
- if (!L)
- return;
- FILE *f = fopen(nome_ficheiro, "r");
- if (!f) {
- printf("Nao foi possivel Abrir o Ficheiro!\n");
- return; // Para o caso em que nao foi possivel abrir o ficheiro!
- }
- int nelementos;
- fscanf(f, "%d", &nelementos);
- for (int i = 0; i < nelementos; i++) {
- ELEMENTO P = criar_elemento();
- fscanf(f, "%s", P->inf->texto);
- inserir_elemento_ordenado(L, P);
- }
- fclose(f);
- }
- char menu_principal() {
- char x;
- printf("\n # MENU PRINCIPAL -----------------------------------------#");
- printf("\n | (1) Inserir um novo elemento na lista |");
- printf("\n | (2) Retirar elementos da lista (+) |");
- printf("\n | (3) Mostrar os elementos pela ordem actual |");
- printf("\n | (4) Mostrar os elementos pela ordem inversa |");
- printf("\n | (5) Mostrar o numero de elementos da lista |");
- printf("\n | (6) Pesquisar por um elemento da lista |");
- printf("\n | (7) Verificar se existem elementos repetidas na lista |");
- printf("\n | (8) Exportar elementos para um ficheiro de texto |");
- printf("\n | (9) Importar elementos de um ficheiro de texto |");
- printf("\n | ----------------------------------------------------- |");
- printf("\n | (0) SAIR |");
- printf("\n #---------------------------------------------------------#\n");
- fflush(stdin);
- do {
- printf("\n Qual a sua opcao ? ");
- fflush(stdin);
- x=getchar();
- } while (x<'0' || x>'9');
- return x;
- }
- char menu_remover() {
- char x;
- printf("\n # RETIRAR ELEMENTOS DA LISTA ----------------------------#");
- printf("\n | (1) Retirar o primeiro elemento |");
- printf("\n | (2) Retirar um elemento especificado pelo utilizador |");
- printf("\n | (3) Retirar o ultimo elemento |");
- printf("\n | (4) Retirar todos os elementos da lista |");
- printf("\n | ---------------------------------------------------- |");
- printf("\n | (0) VOLTAR |");
- printf("\n #--------------------------------------------------------#\n");
- fflush(stdin);
- do {
- printf("\n Qual a sua opcao ? ");
- fflush(stdin);
- x=getchar();
- } while (x<'0' || x>'4');
- return x;
- }
- void main() {
- ELEMENTO ele_remover, ele_removido, ele_pesquisar, ele_novo;
- LISTA lista = criar_lista(); // Criar a lista
- strcpy(lista->lingua, LINGUA); // Associar a lingua a lista
- for(;;) {
- system("cls");
- switch (menu_principal()) {
- case '1':
- ele_novo = criar_elemento();
- ler_elemento(ele_novo);
- inserir_elemento_ordenado(lista, ele_novo);
- break;
- case '2':
- switch (menu_remover()) {
- case '1':
- ele_removido = remover_primeiro(lista);
- if (ele_removido) {
- printf("Foi removido o primeiro elemento");
- mostrar_elemento(ele_removido);
- libertar_elemento(ele_removido);
- }else
- printf("Não foi encontrado nenhum elemento!\n");
- break;
- case '2':
- ele_remover = criar_elemento();
- ler_elemento(ele_remover);
- ele_removido = remover_elemento(lista, ele_remover);
- if (ele_removido) {
- printf("O elemento foi removido!\n");
- mostrar_elemento(ele_removido);
- libertar_elemento(ele_removido);
- }else
- printf("Não foi encontrado nenhum elemento!\n");
- break;
- case '3':
- ele_removido = remover_ultimo(lista);
- if (ele_removido) {
- printf("Foi removido o ultimo elemento\n");
- mostrar_elemento(ele_removido);
- libertar_elemento(ele_removido);
- } else
- printf("Não foi encontrado nenhum elemento!\n");
- break;
- case '4':
- destruir(lista);
- break;
- }
- break;
- case '3':
- if (lista->nelementos == 0)
- printf("Nao existem elementos na lista!\n");
- else
- mostrar_ordenado(lista);
- break;
- case '4':
- if (lista->nelementos == 0)
- printf("Nao existem elementos na lista!\n");
- else
- mostrar_inversa(lista);
- break;
- case '5':
- printf("Numero de elementos da lista: %d\n", lista->nelementos);
- break;
- case '6':
- ele_pesquisar = criar_elemento();
- ler_elemento(ele_pesquisar);
- printf("Pesquisar iterativo\n");
- if (pesquisar_iterativo(lista, ele_pesquisar))
- printf("O elemento introduzido existe na lista!\n");
- else
- printf("O elemento introduzido nao existe na lista!\n");
- printf("Pesquisar recursivo\n");
- if (pesquisar_recursivo(lista, ele_pesquisar))
- printf("O elemento introduzido existe na lista!\n");
- else
- printf("O elemento introduzido nao existe na lista!\n");
- break;
- case '7':
- if (elementos_repetidos(lista))
- printf("Existem elementos repetidos na lista!\n");
- else
- printf("Nao existem elementos repetidos na lista!\n");
- break;
- case '8':
- exportar_ficheiro(lista, NOME_FICHEIRO);
- break;
- case '9':
- importar_ficheiro(lista, NOME_FICHEIRO);
- break;
- case '0':
- exit(0);
- }
- system("pause");
- }
- }
Add Comment
Please, Sign In to add comment