tem algo erra no remover quando eu mando remover o ultimo elemento ele da um bug. #include<stdio.h> #include<stdlib.h> typedef struct reg { struct reg *ant; int dado; struct reg *prox; }def_lista; def_lista *lista=NULL; int insere_inicio(int valor) { def_lista *aux; aux = (def_lista *) malloc(sizeof(def_lista)); if (aux==NULL) return 0; aux->dado = valor; aux->prox = NULL; if (lista==NULL) lista = aux; else { aux->prox = lista; lista = aux; } return 1; } int insere_ordenado(int valor) { def_lista *aux,*aux1,*aux2; aux = (def_lista *)malloc(sizeof(def_lista)); aux -> dado = valor; aux -> prox = NULL; aux -> ant = NULL; if(lista == NULL) lista = aux; else { aux1 = lista; if(valor < lista -> dado) { aux -> prox = lista; lista = aux; aux1->ant = lista; } else { while(valor > aux1 -> dado && aux1 -> prox != NULL) aux1 = aux1->prox; if(valor < aux1->dado) { aux2 = aux1->ant; aux1 -> ant = aux; aux -> prox = aux1; aux -> ant = aux2; aux2 -> prox = aux; } else if(aux1->prox == NULL) { aux1->prox = aux; aux->ant = aux1; } } } } int remover(int valor) { def_lista *aux,*aux1,*aux2; aux2 = lista; aux = lista; aux1 = lista->prox; if(valor == lista->dado) { lista = lista -> prox; aux1->ant = NULL; free(aux2); printf("Removeu o %d\n\n",valor); system("pause"); return 1; } while((aux1->prox != NULL) && (aux1->dado != valor)){ aux = aux1; aux1 = aux1->prox; } if(aux1 != NULL) { aux = aux1->prox; aux2->prox = aux; aux->ant = aux2; printf("Removeu o %d\n\n",valor); system("pause"); return 1; } if(aux1->prox == NULL) { aux->prox = NULL; free(aux1); printf("Removeu o %d\n\n",valor); system("pause"); return 1; } } busca(int valor) { def_lista *aux,*aux1; aux1 = lista; if(lista == NULL) puts("lista vazia"); else { do { if(aux1 -> dado == valor){ printf("Achou o %d \n\n",aux1 -> dado); return 1;} else aux1 = aux1 -> prox; }while(aux1 != NULL); if (aux != NULL) printf("não achou o %d\n\n",valor); } } int imprimir() { def_lista *aux, *aux1; aux=lista; while(aux != NULL) { printf(" é %d\n",aux->dado); aux1 = aux; aux = aux->prox; } while(aux1 != NULL) { printf("é %d\n",aux1->dado); aux1 = aux1->ant; } } main() { int num; char op; do { system ("cls"); puts ("\n\n ********** LISTAS DINAMICAS **********\n\n"); puts(" \xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC"); puts(" \xDB DIGITE 1 PARA INSERIR NO INICIO \xDB"); puts(" \xDB DIGITE 2 PARA INSERIR NO FIM \xDB"); puts(" \xDB DIGITE 3 PARA INSERIR ORDENADAMENTE\xDB"); puts(" \xDB DIGITE 4 PARA IMPRIMIR LISTA \xDB"); puts(" \xDB DIGITE 5 PARA REMOVER ELEMENTO \xDB"); puts(" \xDB DIGITE 6 PARA BUSCAR ELEMENTO \xDB"); puts(" \xDB DIGITE 7 PARA SAIR DO PROGRAMA \xDB"); puts(" \xDB\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDC\xDB"); puts(" ENTRE COM A OPCAO DESEJADA: "); puts(" \x1F"); printf(" ");scanf("%d",&op); system ("cls"); switch(op) { // case 1: // puts("\nInsira um numero\n"); // scanf("%d",&num); // insere_inicio(num); // system("cls"); // break; // // case 2: // puts("\ninsira a direita\n"); // scanf("%d", &num); // insere_direita(num); // system("cls"); // break; case 3: puts("\nentre com um valor no inicio\n"); scanf("%d",&num); insere_ordenado(num); system ("cls"); break; case 4: imprimir(); system ("pause"); break; case 5: if(lista == NULL){ puts("\nlista vazia\n\n"); system("pause"); break;} puts("\nentre com o numero removido\n"); scanf("%d",&num); remover(num); break; case 6: if (lista == 0){ puts("\nlista vazia\n\n"); system("pause"); break;} puts("\nentre com um numero para busca\n"); scanf("%d",&num); busca(num); system("pause"); break; // case 7: // puts("\n...FIM DO PROGRAMA...\n"); // break; default: system ("cls"); puts ("\nNumero Invalido!\n"); system ("pause"); } // fim do switch } while (op != 7);// fim laço do getch(); } // fim da classe main