devo fare questo esercizio:

Definire le strutture necessarie a ospitare le informazioni relative all'anagrafica di
studenti e insegnanti. È sufficiente una rappresentazione semplificata delle
informazioni che effettivamente si vorrebbe potere memorizzare.
Riutilizzare per quanto possibile membri comuni. Per esempio l’indirizzo, che
potrebbe essere composto dei membri via_corso_piazza, numero_civico,
cap, citta, nazione è comune sia agli studenti sia agli insegnanti.
Definire inoltre la struttura necessaria a descrivere i libri (titolo, autore/i, editore,
ISBN, argomento, anno di pubblicazione, indirizzo web, etc.).
Definire una struttura corso, contenente uno o più insegnanti, un numero variabile
di studenti, e uno o più libri di testo.
ATTENZIONE! È necessario definire tutti gli oggetti complessi. Per esempio
l'indirizzo, membro delle strutture studenti e insegnanti, è a sua volta una struttura.

Scrivere le funzioni per l'immissione delle informazioni relative a tutte le strutture (e
relativi membri) menzionate nell'esercizio precedente, e per la visualizzazione.
Sperimentare il passaggio delle strutture sia per valore sia per riferimento.


ho provato a fare cosi ma mi da errore


codice:
#include<stdio.h>
#include<string.h>


struct data_nascita{
       int giorno;
       char mese[10];
       int anno;
       };
       
struct indirizzo{
       char via[300];
       int numero;
       int CAP;
       char nazione[30];
       char citta[30];
       char provincia[2];
       };
       
struct studenti{
       char nome[20];
       char cognome [20];
       struct data_nascita d_t;
       struct indirizzo ind;
       int matricola;
       };
       
struct insegnanti{
       char nome[20];
       char cognome [20];
       struct data_nascita d_t;
       struct indirizzo ind;
       };
       
struct libri{
       char titolo[30];
       char autore[30];
       char editore[30];
       char ISBN[30];
       int anno_publicazione;
       };
       
struct corso{
       struct studenti std;
       struct insegnanti ins;
       struct libri lib;
       };
      
int ins (int);
void vis (struct corso *);
void vis_cor(void);

struct corso b[10];
int ind =0; 
main(){
      
      
       printf("1. inserisci\n 2.visualizza\n ");
       int scelta;
       scanf("%d",&scelta);
       switch (scelta){
          case 1: ind = ins(ind);
          break;
          case 2: vis_cor();
          break;
          }
       

       }
       
       
      int ins(int a){
            if(a>10){
            printf("non ce piu spazio");
             }
             printf("inserisci");
             printf("studenti");
             gets(b[a].std);
             printf("insegnanti");
             gets(b[a].ins);
             printf("libri");
             gets(b[a].lib);
             a++;
             return(a);
             }
        
        void vis(struct corso *p){
          printf("studente %s", p->std);
          printf("insegnante %s",p->ins) ;
          printf("libro %s", p->lib);
          }                  
               
        void vis_cor(void){
          int i;
          struct corso *ps = &b[0];
          for(i=0; i<ind;i++){
                   vis(ps++);
                   }
                   }