Rodson Posted November 8, 2011 Report Share Posted November 8, 2011 fiz o código abaixo de uma lista duplamente encadeada e acontece o seguinte problema no linux o programa roda perfeitamente.No windows o código dá erro na execução, descobri que o erro acontece quando vou inserir um terceiro elemento na lista.o que seria??#include <stdio.h>#include <stdlib.h>typedef struct List_dupla{ int h; struct List_dupla* ant; struct List_dupla* pro;} *list;//----------------Construtoraslist Nil(void){return NULL;}list Cons (int e, list I){ list aux = (list)malloc(sizeof(list)); aux->h = e; if (!I){ aux->ant=Nil(); aux->pro=Nil(); } else{ aux->ant=I->ant; aux->pro=I; I->ant=aux; } return aux; }//----------------acesssorasint head(list l){ return (int)l->h ;}list proximo (list l){ return l->pro; } list anterior (list l){ return l->ant; }int list_empty(list l){ return l==Nil() ;}// ---------- extras list insert_at(int pos, int x,list l){ list aux; int cont=1; aux=l; if(pos<=0) return Cons(x,l); while((cont<pos) && aux->pro!=Nil()){ aux = aux->pro; cont++; } aux->pro=Cons(x,aux->pro); return l; }list list_remove(int x, list l){ list aux=l; if (list_empty(l)||(x==head(l)&&(l->ant==l->pro))) // caso lista seja vazia return Nil(); // caso a lista tenha apenas 1 elemento; while ( head(aux) != x) { if (aux==Nil()) //não encontrou o elemento retorna a propria lista sem auteração; return l; aux = proximo(aux); } if (anterior(aux)) { // se existir um anterior a aux anterior(aux)->pro=aux->pro; } if (proximo(aux)){ // se existir um proximo a aux aux=proximo(aux); aux->ant=(anterior(aux))->ant; } if (x==head(l)) return proximo(l); return l; }void show(list l){ list aux=l; if (list_empty(l)) return ; do{ printf(" %d-",head(aux)); aux=proximo(aux); }while(aux!=Nil()); }int main(){ list c=Nil(); show©; c=Cons(60,c); c=Cons(50,c); c=Cons(40,c); c=Cons(30,c); c=Cons(20,c); c=Cons(10,c); show©; c=list_remove(10,c); printf("\nMostra de novo"); show©; c=insert_at(1,5,c); printf("\nMostra de novo"); show©; return 0;} Quote Link to comment Share on other sites More sharing options...
Question
Rodson
fiz o código abaixo de uma lista duplamente encadeada e acontece o seguinte problema no linux o programa roda perfeitamente.
No windows o código dá erro na execução, descobri que o erro acontece quando vou inserir um terceiro elemento na lista.
o que seria??
#include <stdio.h>
#include <stdlib.h>
typedef struct List_dupla{
int h;
struct List_dupla* ant;
struct List_dupla* pro;
} *list;
//----------------Construtoras
list Nil(void){return NULL;}
list Cons (int e, list I){
list aux = (list)malloc(sizeof(list));
aux->h = e;
if (!I){
aux->ant=Nil();
aux->pro=Nil();
}
else{
aux->ant=I->ant;
aux->pro=I;
I->ant=aux;
}
return aux;
}
//----------------acesssoras
int head(list l){ return (int)l->h ;}
list proximo (list l){ return l->pro; }
list anterior (list l){ return l->ant; }
int list_empty(list l){ return l==Nil() ;}
// ---------- extras
list insert_at(int pos, int x,list l){
list aux;
int cont=1;
aux=l;
if(pos<=0)
return Cons(x,l);
while((cont<pos) && aux->pro!=Nil()){
aux = aux->pro;
cont++;
}
aux->pro=Cons(x,aux->pro);
return l;
}
list list_remove(int x, list l){
list aux=l;
if (list_empty(l)||(x==head(l)&&(l->ant==l->pro))) // caso lista seja vazia
return Nil(); // caso a lista tenha apenas 1 elemento;
while ( head(aux) != x) {
if (aux==Nil()) //não encontrou o elemento retorna a propria lista sem auteração;
return l;
aux = proximo(aux);
}
if (anterior(aux)) { // se existir um anterior a aux
anterior(aux)->pro=aux->pro; }
if (proximo(aux)){ // se existir um proximo a aux
aux=proximo(aux);
aux->ant=(anterior(aux))->ant;
}
if (x==head(l))
return proximo(l);
return l;
}
void show(list l){
list aux=l;
if (list_empty(l))
return ;
do{
printf(" %d-",head(aux));
aux=proximo(aux);
}while(aux!=Nil());
}
int main(){
list c=Nil();
show©;
c=Cons(60,c);
c=Cons(50,c);
c=Cons(40,c);
c=Cons(30,c);
c=Cons(20,c);
c=Cons(10,c);
show©;
c=list_remove(10,c);
printf("\nMostra de novo");
show©;
c=insert_at(1,5,c);
printf("\nMostra de novo");
show©;
return 0;
}
Link to comment
Share on other sites
0 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.