PDA

Visualizza la versione completa : [C] Lista semplice


UltraBeginner
22-11-2006, 14:49
Ciao,
visti i grossi problemi sulle liste di liste, sto facendo esercizio sulla lista semplice...



#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void pulisci( char temp[20])
{
int i;
for(i=0;i<=19;i++)
{
temp[i]="";
}
}

typedef struct t_automobile //struttura accessori
{
char macchina[20];
struct t_automobile *next;
} Auto,*PointAuto;



int main()
{

int flag=0;
char temp[20]={"\0"};
PointAuto HeadAuto=NULL,CurrPtr=NULL,PrevPtr=NULL; // puntatori a struct automobile

HeadAuto=(PointAuto)malloc(sizeof(PointAuto)); // crea il primo elemento della lista;

CurrPtr=HeadAuto;

printf("Inserire l'automobile, F per finire:");
scanf("%s",temp);

while(strcmp(temp,"F")!=0) // ciclo per le auto
{
strcpy(CurrPtr->macchina,temp); // copia il nome dell auto nel campo macchina della struttura automobile

PrevPtr=CurrPtr;

CurrPtr=(PointAuto)malloc(sizeof(PointAuto)); //Crezione del nuovo elemento della lista macchine
PrevPtr->next=CurrPtr; // creo il link al prossimo elemento della lista
fflush(stdin);
pulisci(temp);
printf("Inserire l'automobile, F per finire:");
scanf("%s",temp);

}

PrevPtr->next=NULL;
CurrPtr=HeadAuto;
do
{
printf("%s->",CurrPtr->macchina);
CurrPtr=CurrPtr->next;
}while(CurrPtr!=NULL);

free(HeadAuto);
system("pause");
return 0;

in pratica se metto i dati troppo velocemente da tastiera il programma si blocca?
Sbaglio forse l assegnazione dei puntatori? O forse la scanf non e adatta per lo scopo?
Quando poi riesco a immettere i dati e a terminare l inserimento con F a volte durante la stampa si blocca....qualcuno mi dice se ci sono errori logici?
Grazie!
Saluti :ciauz: :ciauz:

Lak3d
22-11-2006, 17:28
a parte la mancata chiusura della main, funziona tutto perfettamente...

UltraBeginner
22-11-2006, 17:53
Gaurda LAked con DevC++ a volte si blocca...Tu che cosa hai usato per compilare?
cambiando la dichiarazione delle struct sono riuscito a fare anche la lista di liste...se ti interessa te la mando via privato....fammi sapere! :zizi: :zizi:

Cmq grazie! :)

Samuele_70
22-11-2006, 18:46
La funzione :
void pulisci( char temp[20])
inutile, eliminala.
Inoltre
temp[i]="";
sbagliato, scrivi :
temp[i]=0;
oppure
temp[i]='\0';
Anche l'inizializzazione di 'temp' (nel main) dovrebbe essere cos:
char temp[20]="";
:)

Samuele_70
22-11-2006, 19:13
L'errore che allocavi la memoria per ogni elemento non con la dimensione
della struttura, ma con la dimensione del suo puntatore.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct t_automobile //struttura accessori
{
char macchina[20];
struct t_automobile *next;
} *PointAuto;

int main()
{
int count=0;
char temp[20];
PointAuto HeadAuto, CurrPtr; // puntatori a struct automobile

HeadAuto = (PointAuto)malloc(sizeof(struct t_automobile)); // crea il primo elemento della lista;

CurrPtr = HeadAuto;

printf("Inserire l'automobile, F per finire.\n\nNome > ");
scanf("%s", temp);

while( strcmp( temp, "F") != 0 ) // ciclo per le auto
{
strcpy( CurrPtr->macchina, temp);
CurrPtr->next = (PointAuto)malloc(sizeof(struct t_automobile)); //Crezione del nuovo elemento della lista macchine
CurrPtr = CurrPtr->next;
fflush(stdin);
printf("Nome > ");
scanf("%s", temp);
}
CurrPtr->next = NULL;

CurrPtr = HeadAuto;

printf("Contenuto della lista:\n");
while(CurrPtr->next!=NULL)
{
printf("%2d) %s->\n", count++, CurrPtr->macchina);
CurrPtr = CurrPtr->next;
}

free(HeadAuto);
system("pause");
return 0;
}

Lak3d
22-11-2006, 19:40
lista di liste che roba ? ogni elemento della lista punta a un'altra lista? Oppure la lista con due puntatori e circolare?
Postalo che son curioso di capire cos'...



L'errore che allocavi la memoria per ogni elemento non con la dimensione
della struttura, ma con la dimensione del suo puntatore.

Urca, non l'avevo notato perch tutto funzionava... strano...

UltraBeginner
22-11-2006, 20:01
Originariamente inviato da Lak3d
lista di liste che roba ? ogni elemento della lista punta a un'altra lista? Oppure la lista con due puntatori e circolare?
Postalo che son curioso di capire cos'...

ogni elemento della lista punta a un'altra lista ESATTO! :)

Domani da lavoro posto il codice! :)




Urca, non l'avevo notato perch tutto funzionava... strano...

Saluti e grazie a tutti e due! :)

UltraBeginner
22-11-2006, 20:02
Originariamente inviato da Samuele_70
L'errore che allocavi la memoria per ogni elemento non con la dimensione
della struttura, ma con la dimensione del suo puntatore.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct t_automobile //struttura accessori
{
char macchina[20];
struct t_automobile *next;
} *PointAuto;

int main()
{
int count=0;
char temp[20];
PointAuto HeadAuto, CurrPtr; // puntatori a struct automobile

HeadAuto = (PointAuto)malloc(sizeof(struct t_automobile)); // crea il primo elemento della lista;

CurrPtr = HeadAuto;

printf("Inserire l'automobile, F per finire.\n\nNome > ");
scanf("%s", temp);

while( strcmp( temp, "F") != 0 ) // ciclo per le auto
{
strcpy( CurrPtr->macchina, temp);
CurrPtr->next = (PointAuto)malloc(sizeof(struct t_automobile)); //Crezione del nuovo elemento della lista macchine
CurrPtr = CurrPtr->next;
fflush(stdin);
printf("Nome > ");
scanf("%s", temp);
}
CurrPtr->next = NULL;

CurrPtr = HeadAuto;

printf("Contenuto della lista:\n");
while(CurrPtr->next!=NULL)
{
printf("%2d) %s->\n", count++, CurrPtr->macchina);
CurrPtr = CurrPtr->next;
}

free(HeadAuto);
system("pause");
return 0;
}


grazie millissime! non si finisce mai di imparare :)

lloyd27
22-11-2006, 20:42
a parte il solito discorso che le stringhe sarebbe corretto leggerle con un ciclo for al posto di usare %s..

UltraBeginner
23-11-2006, 09:28
Originariamente inviato da lloyd27
a parte il solito discorso che le stringhe sarebbe corretto leggerle con un ciclo for al posto di usare %s..

quoto! Ma ero proprio di fretta :D

Loading