Buscar

LSE - Exemplo 3: Lista ordenada e sem repetidos

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

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);
 }
}

Outros materiais