Baixe o app para aproveitar ainda mais
Prévia do material em texto
Lista Linear Simplesmente Encadeada Exemplo 3 – Lista ordenada e sem elementos repetidos #include <stdio.h> #include <string.h> typedef struct contato { char nome [100]; char fone [15]; char email [50]; struct contato * prox; }TContato; void cadastrar (TContato* *lista, char n []); void criarNo (TContato* *ptrNovo, char n[]); TContato* buscar (TContato *lista, char nome[]); void remover (TContato* *lista, char n[]); void consultar (TContato *lista, char n []); void alterar (TContato *lista, char n []); void listar (TContato * lista); void removerTodos (TContato* *lista); int main () { TContato * Agenda = NULL; char op, nome[100]; do { printf ("1 - Adicionar contato \n"); printf ("2 - Remover contato \n"); printf ("3 - Consultar contato \n"); printf ("4 - Alterar contato\n"); printf ("5 - Exibir todos os contatos \n"); printf ("6 - Sair do programa \n"); printf ("Informe a opcao: "); op = getchar (); fflush (stdin); switch (op) { case '1': printf ("Informe o nome: "); gets(nome); fflush (stdin); cadastrar (&Agenda,nome); break; case '2': printf ("Informe o nome: "); gets(nome); fflush (stdin); remover (&Agenda,nome); break; case '3': printf ("Informe o nome: "); gets(nome); fflush (stdin); consultar (Agenda,nome); break; case '4': printf ("Informe o nome: "); gets(nome); fflush (stdin); alterar (Agenda,nome); break; case '5': listar (Agenda); break; case '6': removerTodos (&Agenda); break; default: printf ("Opcao invalida \n"); } } while (op != '6'); return 0; } void cadastrar (TContato* *lista, char n []) { TContato * novo, *aux1, *aux2; if (*lista == NULL) { criarNo (&novo,n); novo->prox = NULL; *lista = novo; } else if (strcmp ((*lista)->nome,n) == 0) { printf ("Contato repetido. Insercao nao efetuada. \n"); } else if (strcmp ((*lista)->nome,n) > 0) { // inserir inicio criarNo (&novo,n); novo->prox = *lista; *lista = novo; } else { // inserir no meio da lista aux1 = *lista; aux2 = aux1->prox; while (aux2 != NULL) { if (strcmp (aux2->nome,n) == 0) { printf ("Contato repetido. Insercao nao efetuada. \n"); return; } else if (strcmp (aux2->nome, n) > 0) { criarNo (&novo,n); aux1->prox = novo; novo->prox = aux2; printf ("Insercao efetuada \n"); return; } else { aux1 = aux1->prox; aux2 = aux2->prox; } } // fim do while // insercao no final da lista criarNo (&novo,n);; aux1->prox = novo; novo->prox = NULL; } } � void criarNo (TContato* *ptrNovo, char n[]) { TContato * aux; aux = (TContato*) malloc (sizeof (TContato)); strcpy(aux->nome,n); printf ("Informe o telefone: "); gets (aux->fone); printf ("Informe o email: "); gets (aux->email); *ptrNovo = aux; } TContato* buscar (TContato *lista, char n[]) { // busca sequencial melhorada TContato * aux; int achou = 0; if (lista == NULL) // lista vazia return NULL; else { aux = lista; while (aux != NULL) { if (strcmp (aux->nome,n) == 0) { achou = 1; break; } else if (strcmp (aux->nome,n) > 0) { break; } else aux = aux->prox; } if (achou == 1) return aux; else return NULL; } } void consultar (TContato *lista, char n []) { TContato * aux; if (lista == NULL) printf ("Lista vazia \n"); else { aux = buscar (lista, n); if (aux == NULL) printf ("Contato nao cadastrado \n"); else printf ("Fone: %s Email: %s \n"); } } � void alterar (TContato *lista, char n []) { TContato * aux; char op; if (lista == NULL) printf ("Lista vazia \n"); else { aux = buscar (lista, n); if (aux == NULL) printf ("Contato nao cadastrado \n"); else { printf ("Fone atual: %s Email atual: %s \n"); do { printf ("1 - Alterar email \n2 - Alterar telefone \n"); printf ("3 - Sair da alteracao \n Informe a opcao: "); op = getchar(); fflush (stdin); if (op == '1') { printf ("Informe o nome email: "); gets (aux->email); fflush (stdin); } else if (op == '2') { printf ("Informe o nome telefone: "); gets (aux->fone); fflush (stdin); } else if (op == '3') { break; } else printf ("Opcao invalida \n"); } while (op != '3'); } } } void listar (TContato * lista) { // exibir todos os elementos da lista TContato * aux; if (lista == NULL) printf ("Lista vazia \n"); else { aux = lista; while (aux != NULL) { printf ("Nome: %s \n", aux->nome); printf ("Fone: %s \n", aux->fone); printf ("Email: %s \n", aux->email); printf ("\n"); aux = aux->prox; } } } � void remover (TContato* *lista, char n[]) { // utilizando busca sequencial melhorada TContato * aux1, *aux2; int achou = 0; if (*lista == NULL) printf ("Lista vazia \n"); else if (strcmp((*lista)->nome, n) == 0) { // remover primeiro aux1 = *lista; *lista = (*lista)->prox; free (aux1); } else { aux1 = *lista; aux2 = aux1->prox; while (aux2 != NULL) { if (strcmp((*lista)->nome, n) == 0){ achou = 1; break; } else if (strcmp((*lista)->nome, n) > 0) { break; } else { aux1 = aux1->prox; aux2 = aux2->prox; } } if (achou == 1) { aux1->prox = aux2->prox; free (aux2); printf ("Elemento removido \n"); } else printf ("Elemento nao encontrado \n"); } } void removerTodos (TContato* *lista) { TContato * aux; // enquanto a lista nao estiver vazia, remove o primeiro while (*lista != NULL) { aux = *lista; *lista = (*lista)->prox; free (aux); } }
Compartilhar