C++ liste

di il
12 risposte

C++ liste

Ciao a tutti
Ho scritto un programma che prende in input una lista di punti del piano e due interi m,q (che rappresentano la retta y=mx+q) e che dovrebbe spostare i punti che si trovano al di sotto della retta in una seconda lista, ma dopo la compilazione dà problemi di segmentazione.
Sapreste aiutarmi a capire come mai?
PNodo spezzasemipiani(PNodo *l,int m, int q){
PNodo tmp=*l, tmp2, H=NULL;
if(tmp==NULL)
return NULL;

while(tmp!=NULL && m*tmp->x+q<tmp->y){
    *l=tmp->next;
    if(H==NULL){
        H=tmp;
        H->next=NULL;
    }
    else{
        while(H->next!=NULL)
        H=H->next;
        H->next=tmp;
        H->next->next=NULL;
    }
    tmp=tmp->next;
}

//in questa prima metà ho controllato se i nodi a inizio lista andassero levati e li ho spostati in H, trattando con un if a parte il primo inserimento in H

if(tmp!=NULL){
while(tmp->next!=NULL){
    tmp2=tmp->next;
if(m*tmp2->x+q<tmp2->y){
    while(H->next!=NULL)
    H=H->next;
    H->next=tmp2;
    H->next->next=NULL;
    tmp->next=tmp2->next;
}
else tmp=tmp->next;
}}

//poi ho fatto scorrere due nodi lungo la lista per spostare i rimanenti 

return H;
}
P.S. il nodo è fatto cosi
struct nodo{
    int x;
    int y;
    struct nodo *next;
};

typedef struct nodo Nodo;
typedef Nodo * PNodo;
Grazie!

12 Risposte

  • Re: C++ liste

    Hai controllato in quale linea di codice succede? E cosa c'è scritto in quella linea?

    C'è un main con cui provare?
  • Re: C++ liste

    Non c'è una linea precisa perché viene compilato, ma deve esserci qualche errore di allocazione memoria perché eseguendolo dà segmentazione fault.
    Il main era questo:
    int main(){
        PNodo pstart=NULL;
        PNodo lista2;
        int m,q;
        pstart=crealista(pstart);
        stampalista(pstart);
        printf("\n\nInserire parametri retta\ncoefficiente angolare m = ");
        scanf("%d",&m);
        printf("q = ");
        scanf("%d",&q);
     
        lista2=spezzasemipiani(&pstart,m,q);
        printf("\npunti nel semipiano superiore:  ");
        stampalista(lista2);
        printf("\npunti nel semipiano inferiore:  ");
        stampalista(pstart);
        }
    dove vengono usate 2 funzioni crealista e stampalista che semplicemente generano una lista e la stampano a video
  • Re: C++ liste

    Posta anche crealista e (magari) stampalista
  • Re: C++ liste

    //funzione per inserimento nella lista, usata dentro crealista
    Void InserisciInCoda(PNodo *l, int x, int y) {
    Nodo *temp, *p;
    temp = (PNodo) malloc(sizeof(Nodo));
    temp->x = x;
        temp->y=y;
    temp->next = NULL;
    if (*l==NULL)
        *l= temp;
    else {
        p=*l;
        while(p->next!=NULL)
           p=p->next ;
        p->next=temp;
    }}
    
    PNodo crealista(PNodo inizio){
        int c=1;
        int x,y;
       
        while(c!=0){   
        printf("inserire punti? (1/0) ");
        scanf("%d",&c);
        if(c==1){
        printf("X= ");
        scanf("%d",&x);
        printf("Y= ");
        scanf("%d",&y);
        if(Ricerca(inizio,x,y)==0)
        InserisciInCoda(&inizio,x,y);}
        else{
            if(c!=0){
            printf("non valido, riprova\n");
           }
        };
        }
    return inizio;}
    
    void stampalista(PNodo p){
    while(p!=NULL){
        printf("(%d,%d) --> ",p->x,p->y);
        p=p->next;
    }
    printf("NULL");
    }
    //funzione di ricerca di elementi nella lista, usata dentro crealista
    int Ricerca(PNodo l, int x1, int x2){
        int r=1;
        while(l != NULL && (l->x!= x1 || l->y!=x2))
        l=l->next;
        
        if(l != NULL)
        return 1;
        else return 0;
        }
    ok ora è proprio tutto
  • Re: C++ liste

    A me non ha dato alcun segfault ma devo inserire esattamente i dati che hai inserito tu. Cosa hai usato?
  • Re: C++ liste

    Mi sono appena reso conto che dà problemi solo se inserisco anche numero negativi
  • Re: C++ liste

    Anche con numeri negativi non lo replico. Dimmi esattamente con quali valori hai il problema.
  • Re: C++ liste

    Ho inserito i punti (0,0), (-1,1), (2,3) e ho posto m=1, q=1
  • Re: C++ liste

    Facendo altre prove ho visto che il problema non sono i numeri negativi, ma l'inserimento nella seconda lista. Ovvero il programma mi funziona quando la seconda lista rimane vuota
  • Re: C++ liste

    Con questi valori il seg fault avviene nella linea

    while (H->next != NULL)

    della funzione spezzasemipiani a causa del fatto che H in quel momento è NULL
  • Re: C++ liste

    Ho capito, grazie mille!!
  • Re: C++ liste

    Ehm..
    ho modificato cosi
    PNodo spezzasemipiani(PNodo *l,int m, int q){
    PNodo tmp=*l, tmp2, H=NULL;
    if(tmp==NULL)
    return NULL;
    
    while(tmp!=NULL && m*tmp->x+q<tmp->y){
        *l=tmp->next;
        if(H==NULL){
            H=tmp;
            H->next=NULL;
        }
        else{
            while(H->next!=NULL){
            H=H->next;}
            H->next=tmp;
            tmp->next=NULL;
        }
        tmp=*l;
    }
    
    if(tmp!=NULL){
    while(tmp->next!=NULL){
        tmp2=tmp->next;
    if(m*tmp2->x+q<tmp2->y){
        tmp->next=tmp2->next;
        if(H==NULL){
            H=tmp2;
            H->next=NULL;
        }
        else{
            while(H->next!=NULL){
            H=H->next;}
            H->next=tmp2;
            tmp2->next=NULL;}
        
    }
    else tmp=tmp->next;
    }}
    return H;
    }
    ma con i valori (0,0) (1,1) (-1,1) (-2,1) (-3,1) e m=q=1 un nodo si perde.. ovvero l'output mi mette i primi due punti in un semipiano, gli ultimi due nell'altro ma di (-1,1) non c'è più traccia
Devi accedere o registrarti per scrivere nel forum
12 risposte