Enviado em 27/05/2015 - 02:38h
E ai galera! Beleza?#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CHAR_NOME 50
#ifdef WIN32
void limparTela(){
system("cls");
}
void pause(){
system("pause");
limparTela();
}
#else
void limparTela(){
system("clear");
}
void pause(){
printf("Pressione qualquer tecla para continuar!\n");
system("read b");
limparTela();
}
#endif
typedef struct no{
char nomeArquivo[CHAR_NOME];
struct no * prox;
struct no * ante;
}No;
typedef struct lista{
No * ini;
No * fim;
int tamanho;
}Lista;
Lista * criarLista(){
//Aloca uma lista na memoria
Lista * l = (Lista*)malloc(sizeof(Lista));
l->ini = l->fim = NULL;
l->tamanho = 0; //indica que a lista começa sem nenhum item
return l;
}
No * criarNo(){
//Aloca um novo no na memoria e retorna o endereco
return (No*)malloc(sizeof(No*));
}
int listaExiste(Lista * l){
return (l != NULL);
}
int listaVazia(Lista * l){ //se 1 vazia se 0 cheia
return (l->tamanho == 0);
}
void getString(char *texto, int valor){
__fpurge(stdin);
fgets(texto, valor, stdin);
texto[strlen(texto)-1] = '\0';
__fpurge(stdin);
}
void insertVazia(No * novoNo, Lista * l){
l->ini = l->fim = novoNo;
novoNo->prox = l->ini;
novoNo->ante = l->fim;
l->tamanho++;
}
void insertInicio(No * novoNo, Lista * l){
novoNo->prox = l->ini;
novoNo->ante = l->fim;
l->ini->ante = novoNo;
l->fim->prox = novoNo;
l->ini = novoNo;
l->tamanho++;
}
void insertFim(No * novoNo, Lista * l){
novoNo->prox = l->ini;
novoNo->ante = l->fim;
l->fim->prox = novoNo;
l->fim = novoNo;
l->ini->ante = novoNo;
l->tamanho++;
}
void insertMeio(No * novoNo, No * noTemp, Lista * l){
novoNo->prox = noTemp;
novoNo->ante = noTemp->ante;
noTemp->ante->prox = novoNo;
noTemp->ante = novoNo;
l->tamanho++;
}
void inserirNo(Lista * l, char * texto){
if(listaExiste(l)){ //se a lista existir cria o novo nó e armazena o nome do arquivo no novo nó;
No * novoNo = criarNo();
strcpy(novoNo->nomeArquivo,texto);
if(listaVazia(l)){ //Se a lista estiver vazia, todos apontam para o novo no;
insertVazia(novoNo, l);
printf("Novo No Inserido %s - no %p - prox %p - ant %p\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante);
}else{
printf("\Primeira posicao antes de criar temporario\n");
printf("%s - no %p - prox %p - ant %p - |ini %p - fim %p\n\n", l->ini->nomeArquivo, l->ini, l->ini->prox, l->ini->ante, l->ini, l->fim);
No* noTemp = NULL;
printf("Estamos antes do erro");
pause();
//printf("\n\nTemp depois null %s - no %p - prox %p - ant %p - |ini %p - fim %p\n\n", noTemp->nomeArquivo, noTemp, noTemp->prox, noTemp->ante, l->ini, l->fim);
noTemp = l->ini;//Nó temporario para percorrer a lista
//printf("\n\nTemp Antes While %s - no %p - prox %p - ant %p - |ini %p - fim %p\n\n", noTemp->nomeArquivo, noTemp, noTemp->prox, noTemp->ante, l->ini, l->fim);
int i=0; //contador do while
do{
printf("Temp While %s - no %p - prox %p - ant %p - cnt %d\n\n", noTemp->nomeArquivo, noTemp, noTemp->prox, noTemp->ante, i);
if(strcmp(novoNo->nomeArquivo, noTemp->nomeArquivo) > 0){ //se o nome do novo no for maior que o nome do arquivo temporario
if(noTemp == l->fim){ //verifica se ele está inserindo no final
printf("Final Antes de Inserir %s - no %p - prox %p - ant %p - Tam %d\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante, l->tamanho);
insertFim(novoNo, l);
printf("Final Depoi de Inserir %s - no %p - prox %p - ant %p - Tam %d\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante, l->tamanho);
break;
}else{ //se nao for o final passa para o proximo item da lista;
noTemp = noTemp->prox;
}
}else if(strcmp(novoNo->nomeArquivo, noTemp->nomeArquivo) == 0){ //se o nome do novo nó for igual ao nome do no temporario
if(noTemp == l->ini){ //se estiver inseindo no inicio usa a funcao insertInicio;
insertInicio(novoNo, l);
break;
}else{
insertMeio(novoNo, noTemp, l); //se nao inserir no inicio, será no meio
break;
}
}else{ //se o nome do novo for menor que o arquivo temporario
if(noTemp == l->ini){ //pode ser inserido no inicio
insertInicio(novoNo, l);
break;
}else{ //ou entao inserido no final
insertMeio(novoNo, noTemp, l);
break;
}
}
i++;// contador que controla o laco de busca
}while(i < l->tamanho);
//free(noTemp);
}
printf("Fiinal do Inserir %s - no %p - prox %p - ant %p - Tam %d | ini %p - fim %p\n", novoNo->nomeArquivo, novoNo, novoNo->prox, novoNo->ante, l->tamanho, l->ini, l->fim);
}else{
printf("A lista não Existe!\n");
}
}
void removeInicio(No * noTemp, Lista * l){
l->ini = l->ini->prox;
l->fim->prox = l->ini;
l->ini->ante = l->fim;
free(noTemp);
l->tamanho--;
}
void removeFim(No * noTemp, Lista * l){
l->fim = l->fim->ante;
l->ini->ante = l->fim;
l->fim->prox = l->ini;
free(noTemp);
l->tamanho--;
}
void removeMeio(No * noTemp, Lista * l){
noTemp->ante->prox = noTemp->prox;
noTemp->prox->ante = noTemp->ante;
l->tamanho--;
free(noTemp);
}
void removerNo(Lista * l, char * texto){
if(listaExiste(l)){
if(!listaVazia(l)){
No * noTemp = l->ini;
int achou = 0;
int i = 0;
do{
printf("%s\n", noTemp->nomeArquivo);
if(strcmp(noTemp->nomeArquivo, texto) == 0){
printf("encontrou\n");
if(noTemp == l->ini){
removeInicio(noTemp, l);
}else if(noTemp == l->fim){
removeFim(noTemp, l);
}else{
removeMeio(noTemp, l);
}
achou = 1;
}else if(i < l->tamanho){
printf("proximo\n");
noTemp = noTemp->prox;
pause();
}
i++;
}while((achou == 0) && (i < l->tamanho));
//se o valor de achou == 0 indica que não foi encontrado nenhum valor para ser removido
if(achou == 0){
limparTela();
printf("Erro ao remover! O Valor informado não existe.\n");
pause();
}
}else{
limparTela();
printf("Erro ao remover!\nA estrutura está vazia.\n");
pause();
}
}else{
limparTela();
printf("Erro ao remover!\nA estrutura está não existe.\n");
pause();
}
}
void imprimirLista(Lista * l){
if(listaExiste(l)){
if(!listaVazia(l)){
No * noAux = l->ini;
int i = 0;
do{
printf("Nome = %-28s | Posição = %-5p | = %-5p | P.Ante %p | Inicio %p | Fim %p |\n", noAux->nomeArquivo, noAux, noAux->prox, noAux->ante, l->ini, l->fim);
if(l->tamanho > 1){ //garante que quando so houver 1 item ele não vai apontar para o próximo;
noAux = noAux->prox;
}
i++;
}while(i< l->tamanho);
}else{
printf("A lista está Vazia!\n");
}
}else{
printf("A lista não Existe!\n");
}
}
int main(void){
Lista * li = criarLista();
printf("\nA lista esta vazia vai inserir B\n");
pause();
inserirNo(li, "b");
printf("\nA lista contem B Vai inserir A\n");
pause();
inserirNo(li, "a");
//inserirNo(li, "c");
imprimirLista(li);
printf("\nA lista contem B e A Vai inserir C\n");
pause();
inserirNo(li, "c");
imprimirLista(li);
free(li);
return 0;
}