Linguaggio c funzione di cancellazione

di il
11 risposte

Linguaggio c funzione di cancellazione

Salve in un programma che prevede la lista semplice composta da nome, data e codice. Dovrei cancellare solo la Data lasciando nome e codice. ed inoltre dovrei cancellare anche le date precedenti a quella inserita anche in questo caso lasciando nome e codice.
esempio ho i seguenti dati:
elisa 08_06_2015 444
luigi 07_06_2015 445
michele 09_06_2015 446
se io inserisco che voglio eliminare la data 08_06_2015
a questo punto dovrebbe rimanermi la seguente
elisa 444
luigi 445
michele 09_06_2015 446

qualcuno potrebbe aiutarmi per favore?

11 Risposte

  • Re: Linguaggio c funzione di cancellazione

    Dovresti fare una scansione della lista e modificare il campo data.

    E' importante sapere qual è l'implementazione della lista ovvero se il campo data è un puntatore a void, quindi questo va messo a NULL, oppure se è una stringa, quindi questo campo deve essere inizializzato con un valore fittizio ad esempio 00_00_0000.
  • Re: Linguaggio c funzione di cancellazione

    A questa soluzione avevo già pensato ma in verità non va bene perchè non devo modificare la data ma liberare la memoria allocata questa è la struttura
    typedef struct s_studente{
    char nome[128], data[11], codice[10];
    }t_studente;
    typedef struct s_elem_studente{
    t_studente dato;
    struct s_elem_studente * succ;
    }t_elem_studente;
    typedef t_elem_studente*t_lista_studente;
    //Inserimento
    t_lista_studente Inserimento_studente(t_lista_studente *l, t_studente x){
    t_lista_studente aux;
    aux = (t_elem_studente*)malloc(sizeof(t_elem_studente));
    if (aux == NULL){
    return NULL;
    }
    aux->dato = x;
    aux->succ = *l;
    (*l) = aux;
    return aux;
    }
    //Inserimento ordinato
    t_lista_studente Inserimento_ordinato(t_lista_studente *l, t_studente x){
    t_lista_studente aux;
    if (*l == NULL){
    aux = Inserimento_studente(l, x);
    return aux;
    }
    if (strcmp((*l)->dato.nome, x.nome)>0){
    aux = Inserimento_studente(l, x);
    return aux;
    }
    if (strcmp((*l)->dato.nome, x.nome)<0){
    aux = Inserimento_ordinato(&(*l)->succ, x);
    return aux;
    }
    }
    //Funzione di ricerca
    t_lista_studente ricerca_studente(t_lista_studente l, char*nome){
    t_lista_studente aux = l;
    while (aux != NULL && !(strcmp(aux->dato.nome, nome)>0)){
    if (strcmp(aux->dato.nome, nome) == 0){
    return aux;
    }aux = aux->succ;
    }return NULL;
    }
    //Funzione di ricerca codice
    t_lista_studente ricerca_codice(t_lista_studente l, char*cod){
    t_lista_studente aux = l;
    while (aux != NULL){
    if (strcmp(aux->dato.codice, cod) == 0){
    return aux;
    }aux = aux->succ;
    }return NULL;
    }
    //Funzione di stampa
    t_lista_studente stampa_struttura(t_lista_studente l){
    t_lista_studente aux = l;
    while (aux != NULL){
    printf("%s %s %s\n", aux->dato.nome, aux->dato.data, aux->dato.codice);
    aux = aux->succ;
    }return aux;
    }
    int scelta = 0;

    t_lista_studente studenti = NULL;
    t_studente studente;
    t_lista_studente a;
    do{
    printf("Cosa desideri fare\n");
    printf("Digita:\n");
    printf("1 Stampa struttura dati\n");
    printf("2 Inserisci una nuova prenotazione\n");
    printf("3 Cancellazione di tutte le prenotazioni precedenti ad una data fornita dall'utente eliminando solo la data e lasciando l'utente/utenti\n");
    scanf("%d", &scelta);
    switch (scelta){
    case 1:
    stampa_struttura(studenti);
    break;
    case 2:
    Leggielemcodice(&studente);
    a = ricerca_codice(studenti, studente.codice);
    if (a == NULL){
    printf("Inserisci nome studente");
    scanf("%s", studente.nome);
    printf("Inserisci data");
    scanf("%s", studente.data);
    a = Inserimento_ordinato(&studenti, studente);
    printf("prenotazione inserita con successo");
    }
    else {
    printf("codice già presente in lista");
    }
    break;
    case 3:
    break;
    } while (scelta != 0);
    }



    mi serve la funzione che faccia il punto 3 e ovviamente il case 3 annesso.
  • Re: Linguaggio c funzione di cancellazione

    Per favore, modifica il codice mettendo i tag code e indentandelo il codice. Mi è altrimenti difficile leggerlo.
  • Re: Linguaggio c funzione di cancellazione

    Non sto capendo cosa vuoi dire devi semplicemente copiare il codice ed incollarlo in un qualunque compilatore le parti commentate tipo i titoli te le commenterà da solo l'unica cosa da implementare è la funzione di cancellazione per come richiesta nel punto 3 dello switch interno al main.
  • Re: Linguaggio c funzione di cancellazione

    [/code] senza il / iniziale
    codice
    [/code/] senza il / finale
    
       tag code
    
  • Re: Linguaggio c funzione di cancellazione

    Scusami sono nuova del forum e non sto capendo cosa vuoi dire per altro quello è tutto codice dunque cosa dovrei tag??????
  • Re: Linguaggio c funzione di cancellazione

    
    Devi scrivere così il codice:
       indentandolo!
    
  • Re: Linguaggio c funzione di cancellazione

    typedef struct s_studente{
    char nome[128], data[11], codice[10];
    }t_studente;
    typedef struct s_elem_studente{
    t_studente dato;
    struct s_elem_studente * succ;
    }t_elem_studente;
    typedef t_elem_studente*t_lista_studente;
    //Inserimento
    t_lista_studente Inserimento_studente(t_lista_studente *l, t_studente x){
    t_lista_studente aux;
    aux = (t_elem_studente*)malloc(sizeof(t_elem_studente));
    if (aux == NULL){
    return NULL;
    }
    aux->dato = x;
    aux->succ = *l;
    (*l) = aux;
    return aux;
    }
    //Inserimento ordinato
    t_lista_studente Inserimento_ordinato(t_lista_studente *l, t_studente x){
    t_lista_studente aux;
    if (*l == NULL){
    aux = Inserimento_studente(l, x);
    return aux;
    }
    if (strcmp((*l)->dato.nome, x.nome)>0){
    aux = Inserimento_studente(l, x);
    return aux;
    }
    if (strcmp((*l)->dato.nome, x.nome)<0){
    aux = Inserimento_ordinato(&(*l)->succ, x);
    return aux;
    }
    }
    //Funzione di ricerca
    t_lista_studente ricerca_studente(t_lista_studente l, char*nome){
    t_lista_studente aux = l;
    while (aux != NULL && !(strcmp(aux->dato.nome, nome)>0)){
    if (strcmp(aux->dato.nome, nome) == 0){
    return aux;
    }aux = aux->succ;
    }return NULL;
    }
    //Funzione di ricerca codice
    t_lista_studente ricerca_codice(t_lista_studente l, char*cod){
    t_lista_studente aux = l;
    while (aux != NULL){
    if (strcmp(aux->dato.codice, cod) == 0){
    return aux;
    }aux = aux->succ;
    }return NULL;
    }
    //Funzione di stampa
    t_lista_studente stampa_struttura(t_lista_studente l){
    t_lista_studente aux = l;
    while (aux != NULL){
    printf("%s %s %s\n", aux->dato.nome, aux->dato.data, aux->dato.codice);
    aux = aux->succ;
    }return aux;
    }
    int scelta = 0;
    
    t_lista_studente studenti = NULL;
    t_studente studente;
    t_lista_studente a;
    do{
    printf("Cosa desideri fare\n");
    printf("Digita:\n");
    printf("1 Stampa struttura dati\n");
    printf("2 Inserisci una nuova prenotazione\n");
    printf("3 Cancellazione di tutte le prenotazioni precedenti ad una data fornita dall'utente eliminando solo la data e lasciando l'utente/utenti\n");
    scanf("%d", &scelta);
    switch (scelta){
    case 1:
    stampa_struttura(studenti);
    break;
    case 2:
    Leggielemcodice(&studente);
    a = ricerca_codice(studenti, studente.codice);
    if (a == NULL){
    printf("Inserisci nome studente");
    scanf("%s", studente.nome);
    printf("Inserisci data");
    scanf("%s", studente.data);
    a = Inserimento_ordinato(&studenti, studente);
    printf("prenotazione inserita con successo");
    }
    else {
    printf("codice già presente in lista");
    }
    break;
    case 3:
    break;
    } while (scelta != 0);
    }
  • Re: Linguaggio c funzione di cancellazione

    Posso apprezzare lo sforzo, però se non riusciamo a mettere i tag code e indentare il codice nel forum, come pretendiamo di saper programmare? Programmare è anche essere ordinati. E il codice scritto così non ha nè testa nè coda!

    Tornando alla domanda del thread, vuoi liberare la memoria relativa alla data. Ma dove allochi tu la data? Non allochi da nessuna parte, tu hai una lista di noti statici. Quindi così come hai scritto la lista non è possibile rimuovere la data se non mettendoci un valore fittizio.

    Se vuoi allocare dinamicamente e avere la possibilità di liberare la memoria della data, allora la struct del nodo della lista deve essere questo:
    
    typedef struct s_studente{
       char nome[128], 
       char *data, 
       codice[10];
    }t_studente;
    
    Quando inserisci una data, devi allocare con una malloc, quando la vuoi cancellare, devi fare una free e mettere il puntatore a NULL.
  • Re: Linguaggio c funzione di cancellazione

    @SVNiko, ti stai concentrendo su un aspetto marginale ed errato del problema!
    Lo hai gia' fatto notare!

    Chiunque abbia scritto quel codice, lo ha scritto senza avere la minima idea di quello che ha scritto!

    Sembra piu' il porting in C di qualcosa scritto in Java o C#!

    C'e' troppo codice!
    Quando mai uno scrive tutto quel codice senza fare qualche prova di esecuzione!

    Infine, per cancellare il campo data, non serve convertirlo in char*!


    @elyprinci, devi ricominciare da zero, una funzione alla volta, e provarla!

    Siamo qui' per darti una mano, metterti sulla corretta via, ma il lavoro lo devi fare tu.
    Sei tu che devi capire come funziona.

    Non e' difficile!
    Sembra difficile
    E' solo come la prima volta
  • Re: Linguaggio c funzione di cancellazione

    migliorabile ha scritto:


    Infine, per cancellare il campo data, non serve convertirlo in char*!

    SVNiko ha scritto:


    E' importante sapere qual è l'implementazione della lista ovvero se il campo data è un puntatore a void, quindi questo va messo a NULL, oppure se è una stringa, quindi questo campo deve essere inizializzato con un valore fittizio ad esempio 00_00_0000.

    elyprinci ha scritto:


    a questa soluzione avevo già pensato ma in verità non va bene perchè non devo modificare la data ma liberare la memoria allocata questa è la struttura
    Avevo capito che voleva liberare la memoria del campo data, data è dichiarata nella struct come char data[11], così non puoi liberare memoria, penso condividerari.

    Se mi sfugge qualcosa fammelo notare sottolineando come faresti.
Devi accedere o registrarti per scrivere nel forum
11 risposte