Listas duplamente encadeada, circular e ordenada
Autor/fonte: João
Tweet
Montagem de uma lista duplamente encadeada e circular, podendo ser ordenada ou de inserção ao final com o o uso da função insere('M') ou insere('F'). Veja:
/* by João - Ciência da Computação */
/* e-mail: joao@cienciadacomputacao.inf.br */
#include
#include
#include
typedef struct nodo{
char nome[30];
char fone[15];
struct nodo *anterior, *proximo;
}lista;
lista *primeiro, *atual, *anterior, *proximo, *gravar;
void insere(char tipo){
if(primeiro == NULL){
primeiro = malloc(sizeof(lista));
primeiro->proximo = gravar;
primeiro->anterior = gravar;
gravar->anterior = primeiro;
gravar->proximo = primeiro;
}
else{
if(tipo == 'M'){
atual = primeiro->proximo;
while(strcmp(gravar->nome,atual->nome) > 0){
if(atual != primeiro)
atual = atual->proximo;
else
break;
}
anterior = atual->anterior;
proximo = atual; /* o endereço de atual vai para proximo */
anterior->proximo = gravar; /* Os dados contidos em "gravar" serão inseridos entre */
gravar->anterior = anterior; /* as os nodos referencia "anterior" e "proximo" */
gravar->proximo = proximo;
proximo->anterior = gravar;
}
if(tipo == 'F'){
anterior = primeiro->anterior;
proximo = primeiro;
anterior->proximo = gravar; /* Os dados contidos em "gravar" serão inseridos entre */
gravar->anterior = anterior; /* as os nodos referencia "anterior" e "proximo" */
gravar->proximo = proximo;
proximo->anterior = gravar;
}
}
}
void NovoReg(void){
system("cls");
gravar = malloc(sizeof(lista));
printf("Nome: ");
gets(gravar->nome);
printf("\nFone: ");
gets(gravar->fone);
insere('M'); /* chamada do procedimento de inserção */
/* 'M' corresponde a inserção no meio ( acarretando em encadeamento ordenado) e */
/* 'F' corresponde a inserção no fim */
printf("\nSeu registro foi incluido!\n\n");
system("pause");
}
void listar(void){
char op;
if(primeiro == NULL){
system("cls");
printf("Nenhum registro armazenado...\n\n");
system("pause");
return;
}
else{
atual = primeiro->proximo;
do{
system("cls");
printf("Pressione + e - para alternar entre os registros e para sair.\n\n");
printf("Nome: %s\n\nFone: %s\n",atual->nome,atual->fone);
op = getch();
switch (op){
case 43:{
if (atual->proximo == primeiro)
atual = primeiro->proximo;
else
atual = atual->proximo;
break;
}
case 45:{
if(atual->anterior == primeiro)
atual = primeiro->anterior;
else
atual = atual->anterior;
}
}
}while(op != 27);
}
}
void excluir(void){
char op;
if(primeiro == NULL){
system("cls");
printf("Nenhum registro armazenado...\n\n");
system("pause");
return;
}
else{
atual = primeiro->proximo;
do{
system("cls");
printf("Pressione + e - para alternar entre os registros, sair e confirmar\n\n");
printf("Nome: %s\n\nFone: %s\n",atual->nome,atual->fone);
op = getch();
switch (op){
case 43:{
if (atual->proximo == primeiro)
atual = primeiro->proximo;
else
atual = atual->proximo;
break;
}
case 45:{
if(atual->anterior == primeiro)
atual = primeiro->anterior;
else
atual = atual->anterior;
}
}
}while((op != 27) && (op != 13));
}
if(op == 27)
return;
printf("\n\nVoce confirma a exclusao deste registro (S/N): [ ]\b\b");
op = getch();
if (op >= 97)
op -= 32;
if(op == 'S'){
anterior = atual->anterior;
proximo = atual->proximo;
anterior->proximo = proximo;
proximo->anterior = anterior;
free(atual);
if (primeiro == primeiro->proximo) /* se for excluido o penultimo registro, sobrando apenas o registro "primeiro" */
primeiro = NULL; /* que não é util para nós, o primeiro tambem será liberado */
printf("\n\nRegistro excluido com sucesso!\n\n");
system("pause");
}
else
return;
}
int main(void){
char escolha;
do{
system("cls");
printf("I - Inclui\nC - Consulta\nE - Exclui\n - Sair\n\nEscolha[ ]\b\b");
escolha = getch();
if(escolha >= 97)
escolha -= 32;
if(escolha == 'I')
NovoReg();
if(escolha == 'C')
listar();
if(escolha == 'E')
excluir();
}while(escolha != 27);
return 0;
}
/* by João - Ciência da Computação */
/* e-mail: joao@cienciadacomputacao.inf.br */
#include
#include
#include
typedef struct nodo{
char nome[30];
char fone[15];
struct nodo *anterior, *proximo;
}lista;
lista *primeiro, *atual, *anterior, *proximo, *gravar;
void insere(char tipo){
if(primeiro == NULL){
primeiro = malloc(sizeof(lista));
primeiro->proximo = gravar;
primeiro->anterior = gravar;
gravar->anterior = primeiro;
gravar->proximo = primeiro;
}
else{
if(tipo == 'M'){
atual = primeiro->proximo;
while(strcmp(gravar->nome,atual->nome) > 0){
if(atual != primeiro)
atual = atual->proximo;
else
break;
}
anterior = atual->anterior;
proximo = atual; /* o endereço de atual vai para proximo */
anterior->proximo = gravar; /* Os dados contidos em "gravar" serão inseridos entre */
gravar->anterior = anterior; /* as os nodos referencia "anterior" e "proximo" */
gravar->proximo = proximo;
proximo->anterior = gravar;
}
if(tipo == 'F'){
anterior = primeiro->anterior;
proximo = primeiro;
anterior->proximo = gravar; /* Os dados contidos em "gravar" serão inseridos entre */
gravar->anterior = anterior; /* as os nodos referencia "anterior" e "proximo" */
gravar->proximo = proximo;
proximo->anterior = gravar;
}
}
}
void NovoReg(void){
system("cls");
gravar = malloc(sizeof(lista));
printf("Nome: ");
gets(gravar->nome);
printf("\nFone: ");
gets(gravar->fone);
insere('M'); /* chamada do procedimento de inserção */
/* 'M' corresponde a inserção no meio ( acarretando em encadeamento ordenado) e */
/* 'F' corresponde a inserção no fim */
printf("\nSeu registro foi incluido!\n\n");
system("pause");
}
void listar(void){
char op;
if(primeiro == NULL){
system("cls");
printf("Nenhum registro armazenado...\n\n");
system("pause");
return;
}
else{
atual = primeiro->proximo;
do{
system("cls");
printf("Pressione + e - para alternar entre os registros e para sair.\n\n");
printf("Nome: %s\n\nFone: %s\n",atual->nome,atual->fone);
op = getch();
switch (op){
case 43:{
if (atual->proximo == primeiro)
atual = primeiro->proximo;
else
atual = atual->proximo;
break;
}
case 45:{
if(atual->anterior == primeiro)
atual = primeiro->anterior;
else
atual = atual->anterior;
}
}
}while(op != 27);
}
}
void excluir(void){
char op;
if(primeiro == NULL){
system("cls");
printf("Nenhum registro armazenado...\n\n");
system("pause");
return;
}
else{
atual = primeiro->proximo;
do{
system("cls");
printf("Pressione + e - para alternar entre os registros, sair e confirmar\n\n");
printf("Nome: %s\n\nFone: %s\n",atual->nome,atual->fone);
op = getch();
switch (op){
case 43:{
if (atual->proximo == primeiro)
atual = primeiro->proximo;
else
atual = atual->proximo;
break;
}
case 45:{
if(atual->anterior == primeiro)
atual = primeiro->anterior;
else
atual = atual->anterior;
}
}
}while((op != 27) && (op != 13));
}
if(op == 27)
return;
printf("\n\nVoce confirma a exclusao deste registro (S/N): [ ]\b\b");
op = getch();
if (op >= 97)
op -= 32;
if(op == 'S'){
anterior = atual->anterior;
proximo = atual->proximo;
anterior->proximo = proximo;
proximo->anterior = anterior;
free(atual);
if (primeiro == primeiro->proximo) /* se for excluido o penultimo registro, sobrando apenas o registro "primeiro" */
primeiro = NULL; /* que não é util para nós, o primeiro tambem será liberado */
printf("\n\nRegistro excluido com sucesso!\n\n");
system("pause");
}
else
return;
}
int main(void){
char escolha;
do{
system("cls");
printf("I - Inclui\nC - Consulta\nE - Exclui\n - Sair\n\nEscolha[ ]\b\b");
escolha = getch();
if(escolha >= 97)
escolha -= 32;
if(escolha == 'I')
NovoReg();
if(escolha == 'C')
listar();
if(escolha == 'E')
excluir();
}while(escolha != 27);
return 0;
}
Enviado por xKuRt em 27/09/2006 às 09:51
Avaliação
Esta publicação ainda não foi avaliada!
A avaliação de publicações é restrita a membros cadastrados e logados no nosso site.
Comentários
| Enviado por Anao em 29/09/2006 às 22:46 perdeu a identacao e faltou o nome dos headers que vc deu include tem que ajeita a exibicao de codigos ae xkurt! []s! |
Envio de comentário:
Sexta, 24 de Maio de 2013
Área restrita
Leitura recomendada
Últimas publicações
- Microsoft pode estar "espionando" suas mensagens no Skype
- Brasil tem mais de 100 milhões de acessos à internet em banda larga
- Vírus pelo Skype já afetou 80 mil pessoas na América Latina
- Setor de telecomunicações vai receber mais recursos para a melhoria da internet
- Lynx - Browser via terminal no GNU/Linux
Top 5 membros
- dddweb213 pts
- andersonop207 pts
- Jotah197 pts
- fbinasco165 pts
- fredbcn117 pts
Últimos membros online
- GabsMullerem 23/05 às 15:52
- flexaem 23/05 às 14:09
- boettcherem 23/05 às 13:15
Últimos membros cadastrados
- flexaem 23/05
- 96049886em 23/05
- GabsMullerem 22/05





