Buongirno; devo risolvere un esercizio il cui testo è il seguente:
Esercizio 2
Siano date le seguenti definizioni globali di due liste monodirezionali:
struct el {int val; struct el *next;};
struct el *LIS1, *LIS2;
Realizzare una funzione C chiamata TRASP che riceve come parametri due liste monodirezionali lista1 e lista2. Lista1
può trovarsi in un qualsiasi stato, mentre la lista2 deve essere vuota. Nel caso di lista2 non vuota o di altri errori la
funzione ritorna il codice 0 come parametro e termina immediatamente la propria esecuzione. La funzione scandisce
gli elementi della lista1, copiando in lista2 gli elementi il cui valore è maggiore del valore dell’elemento che segue.
La copia consiste nel creare un nuovo elemento dinamico in cui è inserito il valore dell’elemento copiato della lista1
e infine nell’inserire tale nuovo elemento nella lista2, nella posizione mostrata nel seguente esempio. Alla fine ritorna,
sempre come parametri, la lista2 modificata e il codice 1. NOTA: un punto aggiuntivo è assegnato se la soluzione
minimizza le operazioni da eseguire per inserire i nuovi elementi in lista2.
Esempio. Lista1 in ingresso contenente i seguenti valori: 12 ? 7 ? -5 ? 30 ? 37 ? 65 ? -999
genera la seguente lista2 di uscita: 12 ? 7 ? 65
Io ho scritto il seguente codice:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
struct el { int val; struct el *next; };
int TRASP(struct el *LIS1,struct el **LIS2)
{
struct el *LIS22, *INIZ2;
LIS22=*LIS2;
if(LIS22!=NULL)
{
return 0;
}
while(LIS1->next!=NULL)
{
if((LIS1->val) > (LIS1->next->val))
{
if(LIS22==NULL)
{
LIS22=(struct el *) malloc (sizeof (struct el) );
INIZ2=LIS22;
}
LIS22->val=LIS1->val;
LIS22->next=(struct el *) malloc(sizeof (struct el) );
LIS22=LIS22->next;
}
LIS1=LIS1->next;
}
free(LIS22);
LIS22=NULL;
*LIS2=INIZ2;
return 1;
}
//PER TEST: Stampa una lista
void stampalista(struct el *l)
{
while(l != NULL) {printf("%d -> ", l -> val);
l = l -> next;}
printf("NULL\n");
}
int main()
{
struct el *LIS1, *LIS2,*INIZIOLIS1;
//creo LIS1 per la prova di trasp
LIS1=malloc(sizeof(struct el *));
INIZIOLIS1=LIS1;
LIS1->val=5;
LIS1->next=malloc(sizeof(struct el *));
LIS1=LIS1->next;
LIS1->val=1;
LIS1->next=malloc(sizeof(struct el *));
LIS1=LIS1->next;
LIS1->val=2;
LIS1->next=malloc(sizeof(struct el *));
LIS1=LIS1->next;
LIS1->val=5;
LIS1->next=malloc(sizeof(struct el *));
LIS1=LIS1->next;
LIS1->val=4;
LIS1->next=malloc(sizeof(struct el *));
LIS1=LIS1->next;
LIS1->val=3;
LIS1->next=malloc(sizeof(struct el *));
LIS1=LIS1->next;
LIS1->val=4;
LIS1->next=NULL;
LIS1=INIZIOLIS1;
//FINE CREAZIONE LIS1
//STAMPO L1
stampalista(LIS1);
//CREO LIS2
LIS2=NULL;
//FINE CREAZIONE LIS2
//INVOCO TRASP
printf("\n%d\n",TRASP(LIS1,&LIS2));
//STAMPO L1
stampalista(LIS1);
puts("");
//STAMPO LA NUOVA L2
stampalista(LIS2);
puts("");
return 0;
}
ALLA STAMPA DELLA LIS2 VENGONO STAMPATI IN MODO CORRETTO 5->5->4 ; IL PROBLEMA E' CHE POI STAMPA INFINITI NUMERI, HO CONTROLLATO CON IL DEBUG E I WATCHES E HO NOTATO CHE LA LIS2 UTILIZZATA DA STAMPALISTA NON HA NULL DOPO IL 4 E NON RIESCO A CAPIRE PERCHE'; spero che qualcuno possa aiutarmi.
Grazie