LA LISTA NUMERO 2 E' INFINITA DURANTE LA STAMPA

di il
1 risposte

LA LISTA NUMERO 2 E' INFINITA DURANTE LA STAMPA

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

1 Risposte

  • Re: LA LISTA NUMERO 2 E' INFINITA DURANTE LA STAMPA

    Ma l'inserimento deve essere in testa o in coda?
    Se ho una lista:
    L-->n1-->n2-->n3-->null
    Voglio inserire in testa un nodo n0:
    - creo il nuovo nodo n0
    - gli assegno il valore val
    - Lo faccio puntare a n1
    - Faccio puntare L a n0

    Se invece voglio inserire in coda, faccio puntare n3 al nuovo nodo, mentre quest'ultimo punterà a null.

    Fatti prima una funzione separata per l'inserimento e quando ti sarai accertato che venga stampata correttamente, prosegui con un resto.
Devi accedere o registrarti per scrivere nel forum
1 risposte