PDA

Visualizza la versione completa : [C] Problema compilazione liste di stringhe


TheJoeseph
30-07-2014, 22:28
Salve ragazzi, ho un problema nel stampare a video questo codice:

#include <stdio.h>#include <stdlib.h>
#include <string.h>
#define SIZE 80
struct element {
char name[SIZE];
char surname[SIZE];
int matnumber;
struct element *next;
};


void menu();


void list(struct element *list_head);
struct element *insert(struct element *list_head);
//struct element *sortbyname(struct element *list_head);
//struct element *sortbymatnumber(struct element *list_head);


int main () {
struct element *list_start=NULL;
int comando;


do{
menu();
printf("\nComando: ");
scanf("%d",&comando);
switch(comando) {
case 1: {
list_start=insert(list_start);
break;
}
/* case 2: {
list_start=sortbyname(list_start);

break;
}
case 3: {
list_start=sortbymatnumber(list_start);
break;
}*/
case 4: {
list(list_start);
break;
}
}


return 0;

} while(true);
}


struct element *insert(struct element *list_head){
struct element *newnode, *temp;
int x;
temp=list_head;
if (list_head!=NULL)
while(temp->next!=NULL)
temp=temp->next;

do {
newnode=(struct element*)malloc(sizeof(struct element));
/*if (newnode==NULL){
printf("ERROR");
EXIT(FAILURE_EXIT);
}*/

if(list_head==NULL) {
printf("Inserire nome:\n ");
fgets(newnode->name,SIZE,stdin);
printf("\nInserire cognome: ");
fgets(newnode->surname,SIZE,stdin);
printf("Inserire Numero matricola'");
scanf("%d",&newnode->matnumber);
newnode->next=NULL;
list_head=newnode;
temp=temp->next;

} else {
printf("Inserire nome:\n ");
fgets(newnode->name,SIZE,stdin);
printf("\nInserire cognome: ");
fgets(newnode->surname,SIZE,stdin);
printf("Inserire Numero matricola'");
scanf("%d",&newnode->matnumber);
newnode->next=NULL;
temp->next=newnode;
temp=temp->next;

}
printf("Vuoi registrare un altro studente? (premere 1 per risposta affermativa)");
scanf("%d",&x);

} while (x==1);


return list_head;


}


void menu(){
printf("|||||||||||||||||||||");
printf("\n1)Registrare studente");
printf("\n4)Visualizza lista");
printf("|||||||||||||||||||||");
}
void list (struct element *list_head) {
struct element *list_pointer =list_head;
printf("\nNOME \t COgnome \t N.Matricola ");

while(list_pointer != NULL){
printf("%s \t %s \t %d\n", list_pointer->name,list_pointer->surname,list_pointer->matnumber);

list_pointer = list_pointer->next;
}
printf("\nEND") ;
}




Non mi fa inserire il nome ma solo il cognome e il numero di matricola ma subito dopo i blocca.... come posso uscirne fuori?
grazie in anticipo.

torn24
31-07-2014, 13:06
Correzioni al sorgente , non so se è il miglior modo per imparare , ma io faccio prima , e mi diverto , sta
a te capire , anche perchè magari posso farti un esempio , ma poi non riuscirei a spiegarlo bene a parole :)





#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 80
struct element {
char name[SIZE];
char surname[SIZE];
int matnumber;
struct element *next;
};




void menu();




void list(struct element *list_head);
struct element *insert(struct element *list_head);
//struct element *sortbyname(struct element *list_head);
//struct element *sortbymatnumber(struct element *list_head);




int main () {
struct element *list_start=NULL;
int comando;


do{
menu();
printf("\nComando: ");

scanf("%d",&comando);
while(getchar()!='\n');// Nel menu usi scanf() che lascia '\n' nel buffer fgets() legge '\n' e termina
switch(comando) {
case 1: {
list_start=insert(list_start);
break;
}
/* case 2: {
list_start=sortbyname(list_start);

break;
}
case 3: {
list_start=sortbymatnumber(list_start);
break;
}*/
case 4: {
list(list_start);
break;
}
}


// return 0; RETURN ESCE DAL MAIN dopo eseguito lo switch

} while(1);
}




struct element *insert(struct element *list_head){
struct element *newnode, *temp;
int x;
temp=list_head;
if (list_head!=NULL)
while(temp->next!=NULL)
temp=temp->next;

do {
newnode=(struct element*)malloc(sizeof(struct element));
/*if (newnode==NULL){
printf("ERROR");
EXIT(FAILURE_EXIT);
}*/

if(list_head==NULL) {
printf("Inserire nome:\n ");
fgets(newnode->name,SIZE,stdin);
printf("\nInserire cognome: ");
fgets(newnode->surname,SIZE,stdin);
printf("Inserire Numero matricola'");
scanf("%d",&newnode->matnumber);
while(getchar()!='\n');
newnode->next=NULL;
list_head=newnode;
temp=list_head; //temp=temp->next; Se la lista è vuota temp è NULL quindi fai un operazione
//non valida , se la lista è vuota temp è uguale alla testa appena creata primo nodo

} else {
printf("Inserire nome:\n ");
while(getchar()!='\n');
fgets(newnode->name,SIZE,stdin);
printf("\nInserire cognome: ");
fgets(newnode->surname,SIZE,stdin);
printf("Inserire Numero matricola'");
scanf("%d",&newnode->matnumber);
while(getchar()!='\n');
newnode->next=NULL;
temp->next=newnode;
temp=temp->next;

}
printf("Vuoi registrare un altro studente? (premere 1 per risposta affermativa)");
scanf("%d",&x);

} while (x==1);


return list_head;


}




void menu(){
printf("|||||||||||||||||||||");
printf("\n1)Registrare studente");
printf("\n4)Visualizza lista");
printf("|||||||||||||||||||||");
}
void list (struct element *list_head) {
/*nome e cognome sono stati acquisiti con fgets
quindi nella stringa nome e nella stringa cognome è presente il carattere '\n'
newline , perchè fgets lo considera un carattere valido e lo aggiunge alla stringa
se vuoi stampare correttamente i dati nella funzione inserimento devi toglire il
\n in questo modo

newnode->name[strlen(newnode->name)-1]=0; */
struct element *list_pointer =list_head;
printf("NOME COgnome N.Matricola \n");

while(list_pointer != NULL){
printf("%s %s %d\n", list_pointer->name,list_pointer->surname,list_pointer->matnumber);

list_pointer = list_pointer->next;
}
printf("\nEND\n") ;
}

TheJoeseph
31-07-2014, 13:37
Grazie Torn24, ti sei spiegato molto bene, tutto funzionante! ;)

Loading