Falha de Segmentação

1. Falha de Segmentação

Andrei Toledo
andrei1110

(usa Ubuntu)

Enviado em 25/06/2013 - 20:54h

Eaí galera, beleza?
Meu primeiro post aqui.
Estou fazendo uma árvore AVL, porém quando eu insiro os números 1, 3, 14 nessa ordem, ele dá uma falha de segmentação. Vou postar aqui as funções mais principais.

no *inserir(no *t, info *dado, no *pai){//Função para inserir novo nó
if (t == NULL){
t = criarNo(dado);
t->dado = dado;
t->pai = pai;
return t;
}
if (t->dado->cod > dado->cod)
t->esq = inserir(t->esq, dado, t);
if(t->dado->cod < dado->cod)
t->dir = inserir(t->dir, dado, t);
return balanceia(t);
}


no *balanceia(no *t){//Função para fazer o balanceamento da árvore
if (t == NULL)//Se o nó estiver vazio
return NULL;//Retorna nulo
if (verificaB(t) > 1) //verifica se está pendendo para a direita
return verificaB(t->dir) < -1 ? simplesEsq(t) : duplaEsq(t);//Verifica qual balanceamento é necessário aplicar
if (verificaB(t) < -1)//Verifica se está pendendo para a esquerda
return verificaB(t->esq) > 1 ? simplesDir(t) : duplaDir(t);//Verifica qual balanceamento é necessário aplicar
return t;//retorna a árvore
}

no *simplesDir(no *t){ //Função da rotação simples para direita
no *aux = t->esq; //Cria um nó auxiliar e coloca como valor o nó que vai assumir o lugar do nó a ser rotacionado
no *pai = t->pai; //Nó auxiliar para o pai do nó a ser rotacionado
if(pai != NULL && pai->esq == t) pai->esq = aux; //Se o nó a ser rotacionado está a direita do pai dele, então altera o conteúdo do nó a direita do seu pai.
if(pai != NULL && pai->dir == t) pai->dir = aux; //Se o nó a ser rotacionado está a esquerda do pai dele, então altera o conteúdo do nó a esquerda do seu pai.
t->esq = aux->dir;//transforma o filho a esquerda o filho a esquerda de aux(lembrando que t é o nó a ser rotacionado)
aux->dir = t;//filho a direita de aux agora é o t
t->pai = aux;//o pai de t agora é o aux
aux->pai = pai;//o pai de aux é o antigo pai de t
return aux;//retorna aux no lugar de t, já rotacionado
}

no *simplesEsq(no *t){//Função para rotação simples para a esquerda
no *aux = t->dir; //Variável auxiliar é o filho a direita de T, o filho que irá virar o T
no *pai = t->pai; //Armazena o conteúdo do pai do T
if(pai != NULL && pai->esq == t) pai->esq = aux;//Se T estiver a esquerda de seu pai, então o filho a esquerda será o aux.
if(pai != NULL && pai->dir == t) pai->dir = aux;//Se T estiver a direita de seu pai, então o filho a direita será o aux.
t->dir = aux->esq;//transforma o filho a direita de t o filho a esquerda de aux(lembrando que t é o nó a ser rotacionado)
aux->esq = t;//filho a esquerda de aux agora então é o t
t->pai = aux;//o pai de t agora passará a ser aux.
aux->pai = pai;//o pai de aux agora será o antigo pai de t
return aux;//retorna o aux no lugar de t, já rotacionado
}

no *duplaDir(no *t){//Função para rotação dupla à direita
no *aux = simplesEsq(t->esq);//Faz a primeira rotação simples à esquerda
t->esq = aux;//Salva a rotação simples à esquerda no filho à esquerda do nó a ser balanceado
aux = simplesDir(t);//Faz a rotação simples a direita no nó a ser rotacionado
return aux;//Retorna o nó balanceado
}

no *duplaEsq(no *t){//Função para rotação dupla à esquerda
no *aux = simplesDir(t->dir);
t->dir = aux;
aux = simplesEsq(t);
return aux;
}


Se alguém souber me ajudar, agradeço desde já. Vlw


  


2. Re: Falha de Segmentação

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 25/06/2013 - 23:24h

Opa,

Você poderia colocar o código entre os campos code /code ?

Assim o código fica mais fácil de visualizar.


3. Re: Falha de Segmentação

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/06/2013 - 01:26h

Como depurar o programa:

- compile-o com a opção "-g".
- rode-o de dentro do gdb.


4. Re: Falha de Segmentação

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 26/06/2013 - 07:55h

Boa Paulo!

Esse link é tutorial básico para usar o gdb, acho ele bem útil.

http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html


5. Re: Falha de Segmentação

Andrei Toledo
andrei1110

(usa Ubuntu)

Enviado em 29/06/2013 - 10:30h

Ah, desculpe a demora, eu tive que viajar, mas eu consegui resolver o problema, faltou conferir se uma das variáveis era nula, vou deixar aqui o anexo pro árvore que eu fiz funcionando certo pra caso alguém queira dar uma olhada.

http://nuvem.iuffs.com/public.php?service=files&t=77accc847bcddbf8712e44bfa3310e57

Qualquer coisa estamos aí, e desculpe a demora...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts