[C] Lista di Lista

Messaggioda peppuccio92 » 07/12/2017, 20:25

Salve a tutti ragazzi sto cercando di fare un programma che fa inserire dei numeri interi in una lista, dopo l'inserimento chiede se si vuole creare una sottolista. Se si, bisogna scegliere in quale elemento della lista si vuole creare la sottolista, viene cercato questo elemento e se esiste fa inserire i dati.

Per quanto riguarda la prima parte fino alla creazione, inserimento, ricerca dell'elemento nella lista, sono riuscito a fare tutto. Il problema è l'inserimento nella sotto lista. Vi allego il codice della sola struttura che ho creato:
Codice:
struct nodo
{
    int dato;
    struct nodo *next;
    struct sotto_nodo
    {
        int dato1;
        struct sotto_nodo *next1;
    };
};

//VARI TYPEDEF

typedef struct nodo Nodo;
typedef struct sotto_nodo Sotto_Nodo;
typedef Nodo *NodoPtr;
typedef Sotto_Nodo *Sotto_NodoPtr;


La funzioni per la creazione e per l'inserimento nella lista sono le seguenti
CREAZIONE :

Codice:
NodoPtr crea_lista_principale (int elemento1)   
{
    NodoPtr head_p = malloc(sizeof(Nodo));       
    head_p -> dato = elemento1;                 
    head_p -> next = NULL;                       
    return head_p;                               
};


INSERIMENTO:
Codice:
void inserimento_lista_principale(NodoPtr *testa1, int elemento_p)
{
    NodoPtr nuovoPtr1 = malloc(sizeof(Nodo));     
    nuovoPtr1 -> dato = elemento_p;           
    nuovoPtr1 -> next = *testa1;                 
    *testa1 = nuovoPtr1;                         
};


Queste due funzioni vanno bene, perchè le ho provate utlizzando un'altra funzione che mi stampa la lista.
Il problema è che non capisco bene come fare a creare la funzione per l'inserimento degli altri interi in una sottolista.

Facendo una funzione simile a quella di inserimento che ho allegato sopra quello che succede è che gli elementi vengono memorizzati nella sotto lista relativa all'ultimo elemento inserito e non in quella relativa all'elemento che ho scelto.

Non so se sono stato abbastanza chiaro ma quello che voglio riuscire a fare alla fine di tutto ciò è un compito d'esame, che attraverso una
struttura cliente permette di inserire i dati di un cliente e per ogni cliente bisogna fare una sottolista che permette di inserire tutti i movimenti bancari di questo cliente. Per fare ciò però sto cercando di fare questo esercizio più semplice che mi permette di creare una lista di lista


Grazie a tutti in anticipo
peppuccio92
Junior Member
Junior Member
 
Messaggio: 94 di 234
Iscritto il: 13/12/2012, 20:51

Re: [C] Lista di Lista

Messaggioda peppuccio92 » 09/12/2017, 00:33

Up
peppuccio92
Junior Member
Junior Member
 
Messaggio: 95 di 234
Iscritto il: 13/12/2012, 20:51

Re: [C] Lista di Lista

Messaggioda peppuccio92 » 11/12/2017, 02:22

Up
peppuccio92
Junior Member
Junior Member
 
Messaggio: 96 di 234
Iscritto il: 13/12/2012, 20:51

Re: [C] Lista di Lista

Messaggioda apatriarca » 11/12/2017, 12:12

Non sono convinto che la lista sia la struttura dati migliore per questo esercizio (ma suppongo che sia l'unica che ti sia stata insegnata). Senza vedere come usi tali funzioni nel tuo programma non vedo tuttavia come potremmo aiutarti. C'è chiaramente un qualche bug nella funzione che hai scritto per inserire i valori nella sottolista, ma senza vederla non è facile capire quale possa essere.

Nota comunque che i valori dentro una lista possono assumere qualsiasi forma, anche quella di una struttura. Non è necessario avere una struttra dati che rappresenti una lista di lista. Puoi infatti avere una lista i cui valori sono strutture in cui uno dei membri è un'altra lista. Questa struttura potrebbe semplificarti un po' il programma perché le due liste sono a questo punto delle liste normali e il codice per gestirle è sempre lo stesso.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4911 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Lista di Lista

Messaggioda peppuccio92 » 15/12/2017, 13:06

Ok posto il codice che ho rifatto molto più semplice e leggibile e che fa automaticamente l'inserimento di interi nella lista principale e di caratteri nella sottolista dell'intero 5, il problema è che la stampa non avviene correttamente e non riesco a capire perchè.
Ho messo dei printf qua e la per capire se l'inserimento avviene correttamente e sembra proprio di si.
Spero possiate aiutarmi, grazie in anticipo

Codice:
#include <stdio.h>
#include <stdlib.h>

/***** S T R U T T U R E ******/
struct sotto_nodo
{
    char carattere;
    struct sotto_nodo *nextPtr1;
};

struct nodo
{
    int intero;
    struct nodo *nextPtr;               //puntatore al nodo successivo
    struct sotto_nodo *sottonodoPtr;   //puntatore al tipo struct sotto_nodo di nome sottonodoPtr

};

/****** T Y P E D E F ******/

typedef struct sotto_nodo SottoNodo;
typedef struct nodo Nodo;

typedef SottoNodo *SottoNodoPtr;
typedef Nodo *NodoPtr;

/****** P R O T O T I P I    D I     F U N Z IO N E ******/

void menu();
NodoPtr crea_lista(int elemento1);
void inserisci_lista (NodoPtr *head, int elementi);
SottoNodoPtr trova (NodoPtr head, int elemento);
void inserisci_sottolista (SottoNodoPtr *head1, char caratteri);
void stampa(NodoPtr testalistaPtr);

/****** M A I N ******/

int main (void)
{
    NodoPtr testaPtr = NULL;
    SottoNodoPtr testaPtr1 = NULL;

    menu();
    int scelta;
    do {

        printf("Fai una scelta: ");
        fflush(stdin);
        scanf("%d", &scelta);
        switch (scelta)
        {
            case 1:
                {
                int i;
                char j;
                int elem1 = 0 ;

                testaPtr = crea_lista(elem1);
                for (i = 1; i < 10;  i++)
                {
                    inserisci_lista(&testaPtr, i);
                    printf("inserito %d in lista principale\n", testaPtr->intero);
                }

                testaPtr1 = trova(testaPtr, 5);
                printf("\ntrovato l'elemento cercato\n\n");

                for (j = 'a' ; j < 'l'; j++)
                {

                    inserisci_sottolista(&testaPtr1, j);
                    printf("inserito %c in lista secondaria\n", testaPtr1->carattere);
                }
            }
            break;

            case 2:
                stampa(testaPtr);
            break;
        }
    }
    while (scelta != 3);
}


/****** I M P L E M E N T A Z I O N E   F U N Z I O N I ******/


void menu()
{
    printf("1. Inserire elementi nella lista principale e nella sottolista\n");
    printf("2. Stampare elementi\n");
    printf("3. Termina programma\n");
};

NodoPtr crea_lista (int elemento1)
{
NodoPtr headPtr = malloc(sizeof(Nodo));

headPtr->intero = elemento1;
headPtr->nextPtr = NULL;
headPtr->sottonodoPtr = NULL;

return headPtr;
};

void inserisci_lista (NodoPtr *head, int elementi)
{
    NodoPtr newPtr = malloc(sizeof(Nodo));
    newPtr->intero=elementi;
    newPtr->nextPtr = *head;
    *head = newPtr;
};

SottoNodoPtr trova (NodoPtr head, int elemento)
{
    while (head->intero != elemento && head != NULL)
    {
        head = head->nextPtr;
    }
    if (head->intero == elemento)
        return head->sottonodoPtr;
    else
        return NULL;
};

void inserisci_sottolista (SottoNodoPtr *head1, char caratteri)
{
   SottoNodoPtr newPtr = malloc(sizeof(SottoNodo));
   newPtr->carattere = caratteri;
   newPtr->nextPtr1 = *head1;
   *head1 = newPtr;
};

void stampa(NodoPtr testalista)
{
    printf("head -> ");
    NodoPtr copia_testalista = testalista;
    while (testalista != NULL)
    {
        printf("%d -> ", testalista->intero);
        testalista = testalista->nextPtr;
    }
    printf("NULL\n");

    SottoNodoPtr SubPtr = copia_testalista->sottonodoPtr;

    while (copia_testalista != NULL)
    {
    printf("headsub -> (%d) -> ", copia_testalista->intero);
    while (SubPtr != NULL)
    {
        printf("%d -> ", SubPtr->carattere);
        SubPtr = SubPtr->nextPtr1;
    }
    printf("NULL\n");
    copia_testalista = copia_testalista->nextPtr;
    }
};



peppuccio92
Junior Member
Junior Member
 
Messaggio: 97 di 234
Iscritto il: 13/12/2012, 20:51

Re: [C] Lista di Lista

Messaggioda apatriarca » 16/12/2017, 17:08

Alcune osservazioni:
1. Nella funziona trova la condizione del ciclo è scritta al contrario. Devi infatti verificare che qualcosa non sia nullo PRIMA di utilizzarlo. Quindi avrebbe dovuto essere:
Codice:
while (head != NULL && head->intero != elemento)

Lo stesso discorso vale nella selezione successiva. Siccome head potrebbe essere nullo dovresti verificare che non lo sia piuttosto che verificare l'altra condizione di terminazione (cioè quella in cui l'intero sia quello cercato).
2. Nella funzione di stampa la seguente riga deve essere inserita all'interno del ciclo o SubPtr non verrà inizializzato correttamente all'interno del ciclo.
Codice:
SottoNodoPtr SubPtr = copia_testalista->sottonodoPtr;
apatriarca
Moderatore
Moderatore
 
Messaggio: 4912 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Lista di Lista

Messaggioda peppuccio92 » 18/12/2017, 07:41

Grazie mille per i consigli e per il tempo dedicato. Ho modificato le righe di codice che mi hai elencato, ma il problema persiste, la stampa della sottolista rimane sempre vuota.
peppuccio92
Junior Member
Junior Member
 
Messaggio: 98 di 234
Iscritto il: 13/12/2012, 20:51


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite