Jump to content
Miguel Correia

Segmentation Fault lista duplamente ligada.

Recommended Posts

Miguel Correia

Boas

Estava a fazer uns exercicios com Listas Duplamente ligadas e quando foi testar , estava-me a dar segmentation fault . Nao sei se é na Função Imprime , ou se é na funçao que adiciona os Inteiros .

Alguma sugestao ? sff

Em baixo envio o codigo

#include <stdio.h>
#include <stdlib.h>
typedef struct slist {
    int value;
    struct slist *next;
}Nodo, *LInt;
typedef struct node {
        int value;
        struct node *prev, *next;
    } Node, *DList;

/** a) DList addInt (DList l, int x) que acrescenta um elemento `a lista. **/
DList addInt (DList l, int x){
DList novo;
if (l==NULL) {
(l) = (Node*) malloc(sizeof(struct node));
(l)->value = x;
(l)->prev = NULL;
(l)->next = NULL;
}
else {
while((l)->prev != NULL){
l=(l)->prev;
}
(novo) = (Node*) malloc(sizeof(struct node));
(novo)->value =x;
(novo)->prev = NULL;
(l)->prev = (novo);
(novo)->next = l;
}
l=novo;
return l;
}
/* que procuram um elemento para a esquerda */
DList lookLeft (DList l, int x){
while(l!= NULL) {
l=l->prev;
if (l->prev->value == x) return l->prev;
else return NULL;
}
}
/* que procuram um elemento para a direita */
DList lookRight (DList l, int x){
while(l!= NULL) {
l=l->next;
if (l->next->value == x) return l->next;
else return NULL;
}
}
/* b) DList exists (DList l, int x) que determina se um elemento existe na lista;
no caso de existir deve retornar o endere ̧co da correspondente c ́elula; caso contr ́ario deve retornar NULL. */
DList exists (DList l, int x){
DList r;
if (l == NULL) return NULL;
else if(l!= NULL && l->prev == NULL && l->next == NULL && l->prev->value != x) return NULL;
else if(l!= NULL && l->prev == NULL && l->next == NULL && l->prev->value == x) return l;
else {
if (lookRight(l,x) == NULL) return lookLeft(l,x);
else return lookRight(l,x);

}
}
/* c) que remove um nodo da lista (libertando o correspon-dente espaco em memoria). */
DList removeD (DList l){
DList aux;
if(l == NULL) return NULL;
else if(l->prev == NULL){
aux = l;
l->next->prev = NULL;
free(aux);
}
else if (l->next == NULL){
aux = l;
l->prev->next = NULL;
free(aux);
}
else {
aux = l;
l->next->prev = l->prev;
l->prev->next = l->next;
free(aux);
return l;
}
}
/* d) que retorna o endereco do primeiro nodo da lista (NULL caso a lista seja vazia).*/
DList rewind1 (DList l){
if (l == NULL) return NULL;
else {
while (l!= NULL) l=l->prev;
}
return l;
}
/* e) que retorna o enderec ̧o do u ́ltimo nodo da lista (NULL caso a lista seja vazia).*/
DList forward (DList l){
if (l == NULL) return NULL;
else {
while (l->next!= NULL) l=l->next;
}
return l;
}
void init(DList *l){

*l = NULL;
}
void imprime(DList l){
l = rewind1(l);
while(l != NULL){
    printf("%d ", (l)->value);
    l=(l)->next;
}
putchar('\n');
}
int main () {
DList l;
init(&l);
l= addInt(l,4);
l= addInt(l,3);
l= addInt(l,2);
l= addInt(l,1);
imprime(l);
return 0;
}

Cumps

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

na função main : l é suposto apontar para o primeiro elemento da lista ou o último ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

primeiro

DList addInt (DList l, int x){
 DList novo;

 if (l==NULL) {
   // ...
 } else {
   /* ISTO NAO SERVE PARA NADA !!!
   while((l)->prev != NULL) {
     l=(l)->prev;
   }
   */

   (novo) = (Node*) malloc(sizeof(struct node)); // <--- tira o cast
   (novo)->value =x;
   (novo)->prev = NULL;

   (l)->prev = (novo);
   (novo)->next = l;
 }

 l=novo;

 return l;
}

int main () {
 DList l = NULL; // <-- SIMPLES
//   init(&l); <-------- ISTO É COMPLETAMENTE DSENECESSÀRIO

 l= addInt(l,4);
 l= addInt(l,3);
 l= addInt(l,2);
 l= addInt(l,1);

 imprime(l);

 return 0;
}

---------

agora o teu erro:

DList addInt (DList l, int x){
 DList novo;

 if (l==NULL) {
   // ...
 } else {
   // ...
 }

 l=novo; // QUE VALOR TEM "novo" QUANDO INSERES O PRIMEIRO ELEMENTO ?

 return l;
}

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Miguel Correia

O novo tem o valor do X que quero inserir . E ponho o l a apontar para esse elemento da lista .

Share this post


Link to post
Share on other sites
HappyHippyHippo

e lá está o pessoal a responder sem olhar para o código ...

volto a pergunta novamente a mesma coisa mas agora com o código todo

DList addInt (DList l, int x){
 DList novo;

 if (l==NULL) {
   (l) = (Node*) malloc(sizeof(struct node));
   (l)->value = x;
   (l)->prev = NULL;
   (l)->next = NULL;
 } else {
   // ...
 }

 l=novo; // QUE VALOR TEM "novo" QUANDO INSERES O PRIMEIRO ELEMENTO ?

 return l;
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Miguel Correia

Nao tem valor nenhum , é apenas declarado , tenho que o inicializar com o valor de x?

Share this post


Link to post
Share on other sites
mundo

O teu novo tem lixo. tens que alocar espaço para ele, depois testas se foi alocado, se sim, colocas o valor no novo, e atualizas os apontadores prev e next

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.