[c]LISTE....URGENTE

Pubblicità

Trigun86

Utente Attivo
Messaggi
24
Reazioni
0
Punteggio
25
Dovrei portare questo esercizio a breve e necessito di una mano...


prendere in input da un file i dati relativi a degli scrittori inserirli in una lista e fare in modo
che il campo id sia incrementato ad ogni inserimento;
Scrivere una funzione per creare un nuovo elemento di tipo scrittore.
Mettere l'elemento creato nella lista creata nel main e passata alla funzione insieme al puntatore
alla lista e rispettare l'ordine del contatore.
Stampare nel file output il primo record della lista maggiore di 5.

Devo attenermi alle seguenti funzioni:

void crea(FILE *, data**);
void scrivi_file(head,out);

e alla seguente struttura:
typedef struct lista{
int id;
char nome[20];
char cognome[20];
int numero_opere;
next successivo;
}lista;

typedef struct lista *next;

all'interno del main il prof ha creato la testa della struttura:
lista *head;

ora quello che non capisco io è come creare la struttura usando quei due ** nella funzione...aiuto.. grazie 1000

---------- Post added at 18:35 ---------- Previous post was at 18:16 ----------

ho provato a buttare giu un po di codice:
Codice:
#include<stdio.h>
#include<stdlib.h>


typedef struct autore{
       int id;
       char nome[20];
       char cognome [20];
       int brani;
       struct autore *next;
       }autore;




void crea_l(FILE *,autore **);


int main(){


    autore *start;
    FILE *fp;
    
    fp=fopen("01_ex.txt","w");
    
    crea_l(fp,&start);
    fclose(fp);
system("PAUSE");
return 0;
}


void crea_l(FILE *fp,autore **p){
    autore nuovo,corr,prec;
     char n[10];
     int i;
     printf("nome: ");
     scanf("%s",n);
     nuovo=malloc(sizeof(autore));
     if(nuovo!=NULL){
                     for(i=0;i<3;i++){
                     nuovo->id=i;
                     nuovo->nome=n;
                     nuovo->next=NULL;
                     
                     prec=NULL;
                     corr=*p;
                     
while(prec!=NULL){
                 prec=corr;
                 corr=corr->next;
                 }
if(prec == NULL){
        nuovo->next=*p;
        *p=nuovo;
        }
else{
     prec->next=nuovo;
     nuovo->next=corr;
     }
     }
     }


41 C:\Users\Daniele\Desktop\prova esame2.c invalid type argument of `unary *' 
42 C:\Users\Daniele\Desktop\prova esame2.c invalid operands to binary != 
44 C:\Users\Daniele\Desktop\prova esame2.c invalid type argument of `->' 
55 C:\Users\Daniele\Desktop\prova esame2.c invalid operands to binary == 

mi da i seguenti errori...potreste aiutarmi, cortesemente???
 
Ho riscritto il programma questa volta sembra andar un pò meglio ma mi da un problema...quando inserisco piu di 2 autori si chiude il terminal, ma nella compilazione non mi da nessun errore.. se qualcuno di buona volontà più aiutarmi li ringrazio ho un esame a breve..

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


typedef struct autore{
       int id;
       char nome[20];
       
       struct autore *next;
       }autore;


typedef struct autore a;
typedef a *nodo;
void crea_l(FILE *,autore **);


void stampa(nodo );
int main(){
int scelta=0;
    autore *start=NULL;
    FILE *fp;
    
    fp=fopen("01_ex.txt","w");
   while(!scelta){
    crea_l(fp,&start);
    printf("FINE? 1=SI 0=N0");
    scanf("%d",&scelta);
}
   
    fclose(fp);
   stampa(start);
system("PAUSE");
return 0;
}


void crea_l(FILE *fp,autore **p){
   nodo nuovo,corr,prec;
     char n[10];
     int num;
     int scelta=0;
     printf("Id: ");
     scanf("%d",&num);
     printf("nome: ");
     scanf("%s",n);
     
     
   
    nuovo=(struct autore *) malloc(sizeof(struct autore*));
    
     if(nuovo!=NULL){
                   
                      nuovo->id=num;
                      strcpy(nuovo->nome,n);
                      
                      nuovo->next=NULL;
                     
                     prec=NULL;
                     corr=*p;
                     
                     
while(corr!=NULL && num> corr->id){
                 prec=corr;
                 corr=corr->next;
                 }
if(prec == NULL){
        nuovo->next=*p;
        *p=nuovo;
        }
else{
     prec->next=nuovo;
     nuovo->next=corr;
     }
     }
     }
     
void stampa(nodo p){
     
     if(p!= NULL){
     printf("%d\n",p->id);
     printf("%s\n\n",p->nome);
     
     stampa(p->next);
                                }
                               
                                }
 
ho quasi finito ultimo problema la lettura dal file..il programma funziona solo che quando legge il file dopo aver letto tutto si blocca chiudendosi
Codice:
#include<stdio.h>
#include<stdlib.h>


typedef struct autore{
       int id;
       char nome[20];
       char cognome[20];
       int brani;
       struct autore *next;
       }autore;


typedef struct autore a;
typedef a *nodo;
void crea_l(FILE *,autore **);
int stampaINfile(FILE *fpOUT,autore *);


void stampa(nodo );


int main(){


        int scelta;
        autore *start=NULL;
        FILE *fpIN, *fpOUT;
     
     fpIN=fopen("ex02.txt","w");     // creo il file con le liste inserite dall'utente e incremento l'id
     crea_l(fpIN,&start);
     fclose(fpIN);
   
   
     printf("La lista.\n");
     stampa(start);     
  
     fpOUT=fopen("ex02.txt","r"); 
     stampaINfile(fpOUT,start);   
     
                         
     printf("FINE.\n");
                                           
 
system("PAUSE");
return 0;
}


void crea_l(FILE *fp,autore **p){
     nodo nuovo,corr,prec;
     char n[10];
     char c[10];
     int num,brani,scelta;
     int cont=1;
    
    while(scelta!=1){
     printf("nome: ");
     scanf("%s",n);
     printf("cognome: ");
     scanf("%s",c);
     printf("Brani: ");
     scanf("%d",&brani);
     
   
    nuovo=malloc(sizeof(struct autore));
    
     if(nuovo!=NULL){
                   
                      nuovo->id=cont++;
                      strcpy(nuovo->nome,n);
                      strcpy(nuovo->cognome,c);
                      nuovo->brani=brani;
                      nuovo->next=NULL;
                     
                      prec=NULL;
                      corr=*p;
                     
                     
while(corr!=NULL && cont > corr->id){
                 prec=corr;
                 corr=corr->next;
                 }
if(prec == NULL){
        nuovo->next=*p;
        *p=nuovo;
        }
else{
     prec->next=nuovo;
     nuovo->next=corr;
     }
      fprintf(fp,"**Autore**\n");
      fprintf(fp,"Id:%d\n",nuovo->id);
      fprintf(fp,"Nome:%s\n",nuovo->nome);
      fprintf(fp,"Cognome:%s\n",nuovo->cognome);
      fprintf(fp,"Brani:%d\n\n",nuovo->brani);
     }
     printf("\nFINE? 1=SI 0=N0  ");
                scanf("%d",&scelta);
                printf("\n");
                }
      
      
      }
     
void stampa(nodo p){
     
     if(p!= NULL){
     printf("\n*** Autore ***\n");
     printf("Id: %d\n",p->id);
     printf("Nome: %s\n",p->nome);
     printf("Cognome: %s\n",p->cognome);
     printf("Brani: %d\n\n",p->brani);
     stampa(p->next);
                                }
                               
                                }
                                
int stampaINfile(FILE *fpOUT,nodo p){
    int scan=0; 
    printf("STAMPA DA FILE\n");
   
   while(!feof(fpOUT)){
      fscanf(fpOUT,"%d",&p);
      printf("Id: %d\nNome: %s\nCognome: %s\nNumero brani: %d\n\n",p->id,p->nome,p->cognome,p->brani);
    
}


    
   fclose(fpOUT);   
   return 0;
}
 
Pubblicità
Pubblicità
Indietro
Top