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.

codice:
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;
}

La lista è cosi definita

codice:
struct nodo{
    int x;
    int y;
    struct nodo *next;
};

typedef struct nodo Nodo;
typedef Nodo * PNodo;
Il Programma non funziona bene. Utilizzando i punti (0,0) (1,1)(-1,1) (-1,2)(-1,2) e m=q=1, il punto (-1,1) non risulta più in nessuna delle due liste.
Sapreste aiutarmi? Grazie mille

Metto il resto del codice se a qualcuno servisse

codice:
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);
    }
e le funzioni che ho usato

inserimento di un elemento nella lista, usata dentro crealista:
codice:
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;
}}

codice:
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;}
codice:
void stampalista(PNodo p){
while(p!=NULL){
    printf("(%d,%d) --> ",p->x,p->y);
    p=p->next;
}
printf("NULL");
}
ricerca un elemento nella lista, usata dentro crealista
codice:
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;
}