xbubbax
16-04-2008, 22:18
Questo programma fonde in un'unica lista circolare, due liste circolari ordinate. Chiaramente la lista circolare risultante dovrà essere anch'essa ordinata.
Mi da un problema, cioè se ad esempio trova il primo numero della lista L1 minore o uguale del primo di L2 il primo numero di L2 verrà saltato e viceversa.
Non ho proprio idea di come correggere questo bug se cosi si puo chiamare
Help!
#include <stdio.h>
#include <stdlib.h>
#include "funzioni_liste_circolari.h"
listaPtr Ordinamento(listaPtr L1, listaPtr L2)
{
listaPtr L3=NULL;
listaPtr testa1=L1;
listaPtr testa2=L2;
listaPtr testa,curr,nuovo;
if(L1==NULL && L2==NULL){return NULL;}
if(L1==NULL){return L2;}
if(L2==NULL){return L1;}
if(L1->data<=L2->data)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L1->data;
nuovo->next=NULL;
testa=nuovo;
curr=nuovo;
L1=L1->next;
L2=L2->next;
}else
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L2->data;
nuovo->next=NULL;
testa=nuovo;
curr=nuovo;
L2=L2->next;
L1=L1->next;
}
while(L1!=testa1 && L2 !=testa2)
{
if(L1->data<=L2->data)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L1->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L1=L1->next;
}else
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L2->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L2=L2->next;
}
}
if(L1==testa1)
{
while(L2!=testa2)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L2->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L2=L2->next;
}
}
if(L2==testa2)
{
while(L1!=testa1)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L1->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L1=L1->next;
}
}
curr->next=testa;
return testa;
}
int main(void)
{
listaPtr L1=NULL;
listaPtr L2=NULL;
listaPtr L3=NULL;
L1=Crea(5);
printf("\n");
L2=Crea(5);
printf("\n");
L3=Ordinamento(L1,L2);
Stampa(L3);
}
Mi da un problema, cioè se ad esempio trova il primo numero della lista L1 minore o uguale del primo di L2 il primo numero di L2 verrà saltato e viceversa.
Non ho proprio idea di come correggere questo bug se cosi si puo chiamare
Help!
#include <stdio.h>
#include <stdlib.h>
#include "funzioni_liste_circolari.h"
listaPtr Ordinamento(listaPtr L1, listaPtr L2)
{
listaPtr L3=NULL;
listaPtr testa1=L1;
listaPtr testa2=L2;
listaPtr testa,curr,nuovo;
if(L1==NULL && L2==NULL){return NULL;}
if(L1==NULL){return L2;}
if(L2==NULL){return L1;}
if(L1->data<=L2->data)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L1->data;
nuovo->next=NULL;
testa=nuovo;
curr=nuovo;
L1=L1->next;
L2=L2->next;
}else
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L2->data;
nuovo->next=NULL;
testa=nuovo;
curr=nuovo;
L2=L2->next;
L1=L1->next;
}
while(L1!=testa1 && L2 !=testa2)
{
if(L1->data<=L2->data)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L1->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L1=L1->next;
}else
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L2->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L2=L2->next;
}
}
if(L1==testa1)
{
while(L2!=testa2)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L2->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L2=L2->next;
}
}
if(L2==testa2)
{
while(L1!=testa1)
{
nuovo=(listaPtr)malloc(sizeof(nodo));
nuovo->data=L1->data;
curr->next=nuovo;
curr=nuovo;
curr->next=NULL;
L1=L1->next;
}
}
curr->next=testa;
return testa;
}
int main(void)
{
listaPtr L1=NULL;
listaPtr L2=NULL;
listaPtr L3=NULL;
L1=Crea(5);
printf("\n");
L2=Crea(5);
printf("\n");
L3=Ordinamento(L1,L2);
Stampa(L3);
}