Ciao,
ecco una versione più corretta del codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct listNode{
char data;
struct listNode *nextPtr;
};
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
void insert(ListNodePtr *l, char c)
{
ListNodePtr newPtr = NULL;
newPtr = (ListNodePtr) malloc(sizeof(ListNode));
if(newPtr != NULL)
{
newPtr->data = c;
newPtr->nextPtr = *l;
*l = newPtr;
}
else
printf("memoria non disponibile..\n");
}
void stampa(ListNodePtr l)
{
/* tengo traccia del primo elemento della lista */
char primo_elemento = l->data;
if(l == NULL)
printf("la lista è vuota..\n");
else
{
do
{
printf("%c ",l->data);
l = l->nextPtr;
}
/* finche' non ritrovo il primo elemento */
while(l->data != primo_elemento);
}
printf("\n\n");
}
/*
void add(ListNodePtr *l, char c){
ListNodePtr tempPtr, newPtr;
tempPtr = *l;
newPtr = (ListNodePtr) malloc(sizeof(ListNode));
if(newPtr != NULL){
newPtr->data = c;
newPtr->nextPtr = NULL;
while(tempPtr->nextPtr != NULL)
tempPtr->nextPtr = newPtr;
}
else printf("memoria non disponibile..\n\n");
}
*/
void inizializza(ListNodePtr *l){//a: 97; z: 122; 0: 48; 9: 57
char c;
for(c='9'; c >= '0'; c--) insert(l,c);
for(c='z'; c >='a'; c--) insert(l,c);
/* collego la coda alla testa */
ListNodePtr tempPtr = *l;
while(tempPtr->nextPtr != NULL)
tempPtr = tempPtr->nextPtr;
tempPtr->nextPtr = *l;
}
int main(void){
ListNodePtr l = NULL;
inizializza(&l);
stampa(l);
return 0;
}
Ho fatto qualche modifica alla funzione di stampa, anche se l'errore principale era nella funzione inizializza. Infatti tu prendevi un riferimento alla lista, facendo
ListNodePtr tempPtr = *l;
POI facevi delle chiamate alla funzione insert
che andava a modificare la lista. In seguito utilizzavi il riferimento "l", che però non era più quello di prima. Riordinando le righe di codice si ottiene il comportamento atteso.
Diciamo che probabilmente la cosa più semplice era creare un metodo "chiudi_lista" a cui passare un puntatore alla lista e che si occupasse di collegare la coda alla testa per chiudere il cerchio.
Per quanto riguarda la funzione add, mi sono limitato a commentarla. Ti faccio però notare che scrivere
if(newPtr != NULL){
newPtr->data = c;
newPtr->nextPtr = NULL;
while(tempPtr->nextPtr != NULL)
tempPtr->nextPtr = newPtr;
}
non ha senso, visto quel while non fa nulla: passa da un nodo al successivo... e poi?
Se hai altri dubbi, chiedi pure.
Ciao.