pepperamy
15-12-2017, 15:22
Salve a tutti ragazzi, ho iniziato da qualche mese a studiare il linguaggio C ed è anche il mio primo linguaggio di programmazione. Ho qualche problema con le liste di liste. Sto cercando di fare un programma (in questo momento fa tutto l'inserimento in lista e in sottolista automaticamente con dei cicli for) che mi permette di inserire degli elementi in una lista e in una sottolista di un elemento scelto.
Il codice che ho scritto è il seguente e quello che dovrebbe fare è: inserire gli interi da 1 a 9 in una lista principale con inserimento in testa, e questo lo fa, poi dovrebbe inserire i caratteri da "a" a "k" nella sottolista dell'intero 5, e anche questo sembra che lo faccia, e lo fa attraverso la funzione trova che mi cerca l'elemento 5 e mi restituisce il puntatore al nodo. Poi attraverso la funzione inserimento_sottolista alla quale passo il puntatore restituito dalla funzione trova e i caratteri che voglio inserire il secondo ciclo for mi fa l'inserimento nella sottolista . Ho messo dei printf qua a la per cercare di capire dove fosse il problema, ma non sono ancora riuscito a trovarlo.
Il problema che mi viene dato è che quando faccio la stampa degli elementi, la stampa della sottolista è sbagliata, perchè in corrispondenza dell'elemento 5 ci dovrebbe essere la sottolista con i caratteri invece c'è NULL.
ecco il 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("%c -> ", SubPtr->carattere);
SubPtr = SubPtr->nextPtr1;
}
printf("NULL\n");
copia_testalista = copia_testalista->nextPtr;
}
};
Il codice che ho scritto è il seguente e quello che dovrebbe fare è: inserire gli interi da 1 a 9 in una lista principale con inserimento in testa, e questo lo fa, poi dovrebbe inserire i caratteri da "a" a "k" nella sottolista dell'intero 5, e anche questo sembra che lo faccia, e lo fa attraverso la funzione trova che mi cerca l'elemento 5 e mi restituisce il puntatore al nodo. Poi attraverso la funzione inserimento_sottolista alla quale passo il puntatore restituito dalla funzione trova e i caratteri che voglio inserire il secondo ciclo for mi fa l'inserimento nella sottolista . Ho messo dei printf qua a la per cercare di capire dove fosse il problema, ma non sono ancora riuscito a trovarlo.
Il problema che mi viene dato è che quando faccio la stampa degli elementi, la stampa della sottolista è sbagliata, perchè in corrispondenza dell'elemento 5 ci dovrebbe essere la sottolista con i caratteri invece c'è NULL.
ecco il 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("%c -> ", SubPtr->carattere);
SubPtr = SubPtr->nextPtr1;
}
printf("NULL\n");
copia_testalista = copia_testalista->nextPtr;
}
};