Domanda Richiamo di struttura in una funzione

SilayVG

Utente Iron
27 Giugno 2023
1
1
0
2
Salve a tutti!

Trovo un po' di difficoltà in questo passaggio:

Ho uno struct che ho precedentemente riempito in una funzione esterna al main, la funzione void "DatiCorsi" , e la voglio richiamare in un'altra funzione per stamparne i dati inseriti…

In particolare:

vorrei sapere come devo fare per richiamare lo struct, riempito nella funzione secondaria, nella nuova funzione "Lettura" in modo da stampare i dati inseriti, che cosa inserire nel main per fare questo…Qualcuno mi può spiegare i passaggi??

Grazie mille!!!


struct Elemento
{
char Docente[20];
char Corso[20];
char giorno1[5];
char giorno2[5];
char giorno3[5];

struct Elemento* prossimo;
};
typedef struct Elemento Lista;

void DatiCorsi(struct Elemento* e)
{
int risposta;
cout<<"Quanti corsi si vogliono inserire?"<<endl;
cin>>risposta;
Lista* lista= new Lista;
{
Lista* l=lista;
int i=1;
while(i<=risposta)
{

cout<<"Inserisci il Nome del docente"<<endl;
cin>>l->Docente;
cout<<"Inserisci il Nome del corso"<<endl;
cin>>l->Corso;
cout<<"Inserisci i giorni della settimana in cui si svolge il corso"<<endl<< "abbreviati delle prime 3 lettere:"<<endl;
cin>>l->giorno1;
cin>>l->giorno2;
cin>>l->giorno3;
i++;
if(i<=risposta)
{
l->prossimo = new Lista;
}
else
{
l->prossimo =NULL;
}
l = l->prossimo;

}
}
}

void Lettura()
{
Lista* l = lista;
while (l != NULL)
{
cout<<""<<endl;
cout <<"Nome del docente: " <<l->Docente<<endl;
cout<<"Nome del corso: " <<l->Corso<<endl;
cout<<"Giorni della settimana: "<<endl;
cout<<l->giorno1<<endl;
cout<<l->giorno2<<endl;
cout<<l->giorno3<<endl;
l = l->prossimo;
}
}

//Come devo procedere?Mi dà errore in questo punto...


int main()
{
struct Elemento s;
DatiCorsi (&s);

}
 
Hey ciao! Ci sono alcuni errori nel riempimento e nella lettura della lista, ti propongo una soluzione in C:
C:
#include <stdio.h>
#include <stdlib.h>
#define N_GIORNI 3

struct Elemento
{
    char Docente[20];
    char Corso[20];
    int giorno[N_GIORNI];
    struct Elemento* prossimo;
};

struct lista {
    struct Elemento* head;
};
typedef lista* lista_;
lista_ initialize() {
    lista_ l = (lista_)malloc(sizeof(struct lista));
    if (l) {
        l->head = NULL;
    }
    else
        printf("Errore nella creazione della lista");
    return l;
}
void push(lista_ list,Elemento * ele) {
    if (list) {
        ele->prossimo = list->head;
        list->head = ele;
    }
    else
        printf("Error!");
}
void pop(lista_ list) {

    while (list->head != NULL) {
        printf("Nome del docente: %s\n", list->head->Docente);
        printf("Nome del corso: %s\n", list->head->Corso);
        printf("Giorni della settimana: %d", list->head->giorno[0]);
        printf(" %d", list->head->giorno[1]);
        printf(" %d", list->head->giorno[2]);
        list->head = list->head->prossimo;
    }
}
void DatiCorsi(lista_ list)
{
    int corsi = 0;
    printf("Quanti corsi si vogliono inserire?");
    scanf("%d",&corsi);
        
    while(corsi!=0){
        Elemento* ele = (Elemento*)malloc(sizeof(Elemento));
            printf("\nInserisci il Nome del docente");
            scanf("%s", &ele->Docente);
            printf("\nInserisci il Nome del corso");
            scanf("%s",&ele->Corso);
            printf("\nInserisci i giorni della settimana in cui si svolge il corso abbreviati delle prime 3 lettere:");
            scanf("%d", &ele->giorno[0]);
            scanf("%d", &ele->giorno[1]);
            scanf("%d", &ele->giorno[2]);

            push(list, ele);
            corsi--;
            
    }
}


int main()
{
    lista_ list = initialize();
    DatiCorsi(list);
    pop(list);
}

Mi son permesso di modificare leggermente il codice, cercando di far rimanere lo scheletro e il nome delle variabili uguali. I giorni anizchè essere rappresentati da 3 variabili char (giorno1,giorno2,giorno3) sono inclusi nell'array int giorno[3]. Vedo che il tuo intento è quello di creare una lista concatenata formata dalla successione degli *elementi* rappresentati dalla struct Elemento. Le funzioni fondamentali (per la costruzione della pila) sono push e pop, che ti consentono di inserire o rimuovere l'elemento in testa alla lista. L'esempio che ti ho riportato è veramente basico e senza gestione degli errori, ma ho preferito non inserire cose in più rispetto al tuo codice in modo tale che tu possa fare dei paragoni guardandoli. Ho notato anche che utilizzi le struct ma usi cout e cin per stampare e leggere. Se utilizzi il C++ per programmare, questa lista che stai cercando di creare, puoi rappresentarla in una classe, ed è molto più facile ed intuitivo lavorarci su, rispetto ad una somma di struct in C. Prova il codice e fammi sapere come va, vedrò di farti aver anche una soluzione in C++ per la gestione della lista tramite le classi.