ListaDE.h
//--------------------------------------------------------------------------
struct Pessoa {
int codigo;
char nome[40];
char idade;
};
typedef struct Pessoa pessoa;
struct DoubleLL {
pessoa dados;
struct DoubleLL *prox, *ant;
};
typedef struct DoubleLL list;
//--------------------------------------------------------------------------
void enqueue(list **l, pessoa info);
list* deenque(list **l);
void init(list **l);
void exibe(list *l);
list* busca(list *l, pessoa info);
list* meio(list *l);
void exclui(list **l, pessoa info);
//--------------------------------------------------------------------------
void init(list **l) {
*l = NULL;
}
//--------------------------------------------------------------------------
list* deenque(list **l) {
list *aux;
aux = *l;
*l = (*l)->prox;
(*l)->ant = NULL;
return aux;
}
void enqueue(list **l, pessoa info) {
list *aux, *nova = (list*) malloc(sizeof (list));
nova->dados.codigo = info.codigo;
strcpy(nova->dados.nome, info.nome);
nova->dados.idade = info.idade;
nova->ant = nova->prox = NULL;
if (*l == NULL)
*l = nova;
else {
aux = *l;
while (aux->prox != NULL) {
aux = aux->prox;
}
nova->ant = aux;
aux->prox = nova;
}
}
//--------------------------------------------------------------------------
list* meio(list *l) {
list *aux = l, *meio = aux;
int cont = 1;
while (aux->prox != NULL) {
aux = aux->prox;
if (cont % 2 == 0) {
meio = meio->prox;
}
cont++;
}
return meio;
}
//--------------------------------------------------------------------------
void exibe(list *l) {
while (l != NULL) {
printf("[%d] - [%s]\n", l->dados.codigo, l->dados.nome);
l = l->prox;
}
}
//--------------------------------------------------------------------------
list* busca(list *l, pessoa info) {
while (l != NULL && strcmp(info.nome, l->dados.nome) != 0 && l->dados.codigo != info.codigo) {
l = l->prox;
}
return l;
}
//--------------------------------------------------------------------------
list* getFim(list *l) {
while (l->prox != NULL)
l = l->prox;
return l;
}
//--------------------------------------------------------------------------
void exclui(list **l, pessoa info) {
list *aux = busca(*l, info);
if ((*l)->prox == NULL) {
*l = NULL;
free(aux);
} else if (aux->ant == NULL) {
*l = (*l)->prox;
free(aux);
} else if (aux->prox == NULL) {
aux->ant->prox = NULL;
aux->ant = NULL;
free(aux);
} else {
aux->ant->prox = aux->prox;
aux->prox->ant = aux->ant;
free(aux);
}
}
//--------------------------------------------------------------------------
void selecaoDireta(list **l) {
char menor[40];
list *i = *l, *j = NULL;
while (i->prox != NULL) {
strcpy(menor, i->dados.nome);
j = i->prox;
while (j != NULL) {
if (strcmp(j->dados.nome, menor) < 0) {
strcpy(menor, j->dados.nome);
strcpy(j->dados.nome, i->dados.nome);
strcpy(i->dados.nome, menor);
}
j = j->prox;
}
i = i->prox;
}
}
// arquivo principal
#include"ListaDE.h"
int main(int argc, char** argv) {
int op = 0;
pessoa nova;
list *lista;
init(&lista);
while (op != 6) {
printf("[ 1 ] - Inserir\n");
printf("[ 2 ] - Excluir\n");
printf("[ 3 ] - Consultar\n");
printf("[ 4 ] - Listar\n");
printf("[ 5 ] - Ordenar\n");
printf("[ 6 ] - Sair\n");
scanf("%d", &op);
switch (op) {
case 1:
do {
printf("Codigo:\n");
scanf("%d", &nova.codigo);
printf("Nome:\n");
scanf("%s", &nova.nome);
fflush(stdin);
printf("Idade:\n");
scanf("%d", &nova.idade);
printf("----------\n");
enqueue(&lista, nova);
} while (nova.codigo != 0);
break;
case 2:
printf("Entre com o codigo e o nome da pessoa:\n");
printf("Codigo:\n");
scanf("%d", &nova.codigo);
printf("Nome:\n");
scanf("%s", &nova.nome);
fflush(stdin);
exclui(&lista, nova);
break;
case 3:
printf("Entre com o codigo e o nome da pessoa:\n");
printf("Codigo:\n");
scanf("%d", &nova.codigo);
printf("Nome:\n");
scanf("%s", &nova.nome);
fflush(stdin);
printf("\n[%d] - [%s]\n", busca(lista, nova)->dados.codigo, busca(lista, nova)->dados.nome);
break;
case 4:
exibe(lista);
break;
case 5:
selecaoDireta(&lista);
break;
}
}
Parceiro o primeiro arquivo é uma Lista duplamente encadeada, que utilizei como disciplina de acesso uma fila (FIFO)
Tem um método de ordenação(Seleção Direta) por que bolha de cú é rola... Ordena as pessoas por nome.
Depois no main é so um carai de menu chamando as funções, mas pelo amor de deus, separem em dois arquivos, um .h ou .c e faça o include da ListaDE.h ou .c no main.c... Espero que ajude.
Faça:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <conio.h> //clrscr #define BUFFER 64 /* Estrutura da lista declarada para armazenar nossos dados. */ typedef struct lista { char *nome; int idade; struct lista *proximo; } Dados; /* Prototipo das funcoes de manuseio dos dados. */ Dados *inicia_dados(char *nome, int idade); Dados *insere_dados(Dados *dados, char *nome, int idade); void exibe_dados(Dados *dados); void busca_dados(Dados *dados, char *chave); Dados *deleta_dados(Dados *dados); int checa_vazio(Dados *dados); /* Prototipo das funcoes do menu.*/ void insere(void); void exibe(void); void busca(void); void deleta(void); /* Inicializa a estrutura de dados principal. */ Dados *principal = NULL; /* Cria a nova lista apontando o proximo no para NULL. */ Dados *inicia_dados(char *nome, int idade) { Dados *novo; novo = (Dados *)malloc(sizeof(Dados)); novo->nome = (char *)malloc(strlen(nome)+1); strncpy(novo->nome, nome, strlen(nome)+1); novo->idade = idade; novo->proximo = NULL; return novo; } /* Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior. */ Dados *insere_dados(Dados *dados, char *nome, int idade) { Dados *novo; novo = (Dados *)malloc(sizeof(Dados)); novo->nome = (char *)malloc(strlen(nome)+1); strncpy(novo->nome, nome, strlen(nome)+1); novo->idade = idade; novo->proximo = dados; return novo; } /* Percorre todos os campos da lista e imprime ate o ponteiro proximo chegar em NULL. */ void exibe_dados(Dados *dados) { fprintf(stdout, "Cadastro:\n\n"); fprintf(stdout, "------------------------\n"); for (; dados != NULL; dados = dados->proximo) { fprintf(stdout, "Nome: %s\n", dados->nome); fprintf(stdout, "Idade: %d\n", dados->idade); fprintf(stdout, "------------------------\n "); } printf("Pressione uma tecla para continuar."); getch(); } /* Percorre cada ponta comparando o nome com a chave. */ void busca_dados(Dados *dados, char *chave) { int achou = 0; fprintf(stdout, "Cadastro:\n\n"); for (; dados != NULL; dados = dados->proximo) { if (strcmp(chave, dados->nome) == 0) { fprintf(stdout, "------------------------\n"); fprintf(stdout, "Nome: %s\n", dados->nome); fprintf(stdout, "Idade: %d\n", dados->idade); fprintf(stdout, "------------------------\n"); achou++; } } if (achou == 0) fprintf(stdout, "Nenhum resultado encontrado.\nPressione uma tecla para continuar.\n"); else fprintf(stdout, "Foram encontrados %d registros. \nPressione uma tecla para continuar.\n", achou); sleep(1); getch(); } /* Deleta o ultimo registro inserido. */ Dados *deleta_dados(Dados *dados) { Dados *novo; novo = dados->proximo; free(dados->nome); free(dados); fprintf(stdout, "O ultimo registro inserido foi deletado com sucesso.\\n"); sleep(1); return novo; } /* a pena checa se a lista e NULL ou nao. */ int checa_vazio(Dados *dados) { if (dados == NULL) { fprintf(stdout, "Lista vazia!\\n"); sleep(1); return 1; } else return 0; } /* Obtem os dados necessarios para chamar as funcoes de manuseio de dados. */ void insere(void) { char *nome; int idade; nome = (char *)malloc(BUFFER); fprintf(stdout, "\n\nDigite o Nome: \n----> "); scanf("%s", nome); fprintf(stdout, "\n"); fprintf(stdout, "Digite a Idade: \n----> "); scanf("%d", &idade); fprintf(stdout, "\n"); if (principal == NULL) principal = inicia_dados(nome, idade); else principal = insere_dados(principal, nome, idade); } void exibe(void) { if (!checa_vazio(principal)) exibe_dados(principal); } void busca(void) { char *chave; if (!checa_vazio(principal)) { chave = (char *)malloc(BUFFER); fprintf(stdout, "Digite o nome para buscar: \\n--> "); scanf("%s", chave); busca_dados(principal, chave); getch(); } } void deleta(void) { if (!checa_vazio(principal)) principal = deleta_dados(principal); } int main(void) { char escolha; do { system("cls"); fprintf(stdout, "\n Cadastro de Pessoas\n\n"); fprintf(stdout, "Escolha uma opcao: \n\n"); fprintf(stdout, "1 - Insere Dados\n"); fprintf(stdout, "2 - Exibe Dados\n"); fprintf(stdout, "3 - Busca Dados\n"); fprintf(stdout, "4 - Deleta Dados\n"); fprintf(stdout, "5 - Sair\n\n"); scanf("%c", &escolha); switch(escolha) { case '1': insere(); break; case '2': exibe(); break; case '3': busca(); break; case '4': deleta(); break; case '5': exit(0); break; default: fprintf(stderr,"Digite uma opcao valida!\\n"); sleep(1); break; } //getchar(); /* E para impedir sujeira na entrada da escolha. Nao lembro de nada melhor tambem. */ } while (escolha > 0); /* Loop Principal. */ return 0; }
Para escrever sua resposta aqui, entre ou crie uma conta
Compartilhar