Domanda Risolto errore segmentazione liste

aiutoo

Utente Iron
24 Maggio 2021
4
2
0
5
Ultima modifica da un moderatore:
C:
#include <stdio.h>
#include <stdlib.h>
struct list{
    int val;
    struct list* next;
};
int liste_uguali(struct list* ,struct list* );
struct list* inserisciInCoda(struct list*, int);
void visualizza(struct list*);
int main(){
    int val;
    struct list* lista=NULL;
    struct list* lista2=NULL;
    
    printf("inserire valore");
    scanf("%d",&val);
    while(val!=-1){
        lista=inserisciInCoda(lista,val);
        printf("inserire valore");
        scanf("%d",&val);
    }
    printf("inserire valore 2");
    scanf("%d",&val);
    while(val!=-1){
        lista2=inserisciInCoda(lista2,val);
        printf("inserire valore 2");
        scanf("%d",&val);
    }
    visualizza(lista);
    visualizza(lista2);
    
    if(liste_uguali(lista,lista2)==1)
        printf("liste uguali");
    else
        printf("liste diverse");
    
}
struct list* inserisciInCoda(struct list* l, int num){
  struct list *prec;
  struct list *tmp;

  tmp = (struct list*) malloc(sizeof(struct list));
  if(tmp != NULL){
    tmp->next = NULL;
    tmp->val = num;
    if(l == NULL)
      l = tmp;
    else{
    
      for(prec=l;prec->next!=NULL;prec=prec->next);
      prec->next = tmp;
    }
  } else
      printf("Memoria esaurita!\n");
  return l;
}
int liste_uguali(struct list* L1,struct list* L2){
    if(L1->val==L2->val && L1==NULL && L2==NULL){
        return 1;
    }
    else
        if((L1==NULL && L2!=NULL) ||(L2==NULL && L1!=NULL) ||(L1==NULL && L2==NULL && L1->val!=L2->val ))
            return 0;
        else{
            L1=L1->next;
            L2=L2->next;
            return liste_uguali(L1,L2);
        }
}
void visualizza(struct list* l){
    while(l!=NULL){
        printf("%d",l->val);
        l=l->next;
    }
}

Messaggio unito automaticamente:

il problema è nella funzione liste uguali con i NULL ma non riesco a capire perchè
 
Come ti è stato suggerito, ricorda di usare il tag CODE la prossima volta.

Il problema a occhio mi sembra dovuto al controllo che fai: metti il controllo sul puntatore nullo prima della verifica del valore.
 
Come ti è stato suggerito, ricorda di usare il tag CODE la prossima volta.

Il problema a occhio mi sembra dovuto al controllo che fai: metti il controllo sul puntatore nullo prima della verifica del valore.
Grazie mille problema risolto. Avrei due informazioni da chiederti. 1in che senso usare il code?2 saresti cosi gentile da spiegarmi come mai va fatto prima il controllo sui valori e poi su null? Grazie ancora
 
Il tag CODE è un tag BBCode utilizzato per la formattazione del codice. Puoi consultare questo link per vedere come utilizzarlo.

Venendo alla seconda domanda: prima devi fare il controllo sul puntatore nullo e poi verifichi il valore; questo perchè se è NULL e tu prima di verificarlo accedi al valore, ottieni un errore (poichè non stai puntando a della memoria allocata).

Comunque questo dovrebbe essere corretto:

C:
int liste_uguali(struct list* L1,struct list* L2){
    if(L1==NULL || L2==NULL)
        return 0;
    else if(L1->next == NULL && L2->next == NULL && L1->val == L2->val)
        return 1;

    L1=L1->next;
    L2=L2->next;
    return liste_uguali(L1,L2);
}