Segui il video qui sotto per vedere come installare il nostro sito come web app sulla tua schermata principale.
Nota: Questa funzionalità potrebbe non essere disponibile in alcuni browser.
Pubblicità
perche faccio rifermento alla ricerca che viene effettuataVoglio dire che non è definita come variabile nella funzione, cioè in questa funzione fai riferimento a cose non ancora implementate, quindi come faccio a dirti se va bene, implementala e vedi cosa ottieni.
perche faccio rifermento alla ricerca che viene effettuata
#ifndef funzioni_h
#define funzioni_h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20;
struct libri{
char titolo[50];
char autore[20];
int cod_id;
struct libri *next;
};
typedef struct libri* List;
int menu(void);
void gestioneErrore(void);
void ricerca (struct libri *l);
List initList(char titolo[50],char autore[20],int cod_id);
struct libri *leggiFile(FILE *fp, struct libri *lista);
//void scriviLista(struct libri *lista);
void scriviFile(FILE *fp, struct libri *lista);
struct libri *inserisciLista(struct libri *nodo, struct libri *lista);
struct libri *nuovoNodo(char *titolo, char *autore, int cod_id);
List insertTail(List L, char titolo[50], char autore[20], int cod_id);
static struct libri *rimuoviNodo(struct libri *lista, struct libri *nodo);
struct libri *rimuoviLibro(struct libri *lista);
void freeLista(struct libri *lista);
static void freeNodo(struct libri *nodo);
List insertHead(List L, char titolo[50] , char autore[50], int cod_id);
void printList(List L);
#include "funzioni.h"
int menu(){
int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
printf("* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ \nBenvenuto nel programma di gestione biblioteca\n* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ \n");
printf(" 1. Mostra archivio\n");
printf(" 2. Richiedi libro\n");
printf(" 3. Restituire libro\n");
printf(" 4. Esegui richiesta\n");
printf(" 5. Uscire\n");
printf("Inserisci scelta:");
scanf("%d",&scelta); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
while(scelta<0 || scelta>5) {
printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
printf("Scelta: ");
scanf("%d", &scelta);
return scelta;
}
return scelta;
}
struct libri *nuovoNodo(char *titolo ,char *autore, int cod_id)
{
struct libri *nodo;
nodo = (struct libri *) malloc(sizeof(struct libri));
if (nodo == NULL) return NULL;
strcpy(nodo->titolo, titolo);
strcpy(nodo->autore, autore);
nodo->cod_id =cod_id;
nodo->next = NULL;
return nodo;
}
struct libri *inserisciLista(struct libri *nodo, struct libri *lista)
{
if (lista==NULL) return nodo;
lista->next = inserisciLista(nodo, lista->next);
return lista;
}
void gestioneErrore()
{
printf("Errore\n");
exit(0);
}
struct libri *leggiFile(FILE *fp, struct libri *lista)
{
char titolo[50];
char autore[20];
int cod_id;
struct libri *nodo;
while(fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
nodo = nuovoNodo(titolo, autore, cod_id);
if (nodo == NULL)
gestioneErrore();
lista = inserisciLista(nodo, lista);
}
return lista;
}
void scriviFile(FILE *fp, struct libri *lista) {
while (lista!=NULL) {
fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
lista = lista->next;
}
}
//void scriviLista(struct libri *lista) {
// while (lista!=NULL) {
// printf("%s %s %d\n",lista->titolo,lista->autore,lista->cod_id);
// lista = lista->next;
// {
// printf("\n");
// }
// }
//}
void ricerca (struct libri *l){
int trovato = 0 ;
char titolo[30];
printf("\nInsersici il titolo del libro richiesto :");
scanf("%s", titolo);
while (l != NULL && trovato != 1) {
if(strcmp(l->titolo, titolo)==0) {
printf("\nIl libro richiesto e' presente nell'archivio ed le è stato donato in prestito\n");
trovato=1;
}
l = l->next;
}
if(trovato != 1)
printf("\nIl libro richiesto non e' presente nell'archivio. La invitiamo ad richiederlo nei prossimi giorni.\n");
}
List insertTail(List L, char titolo[50], char autore[20] ,int cod_id) {
if (L != NULL) {
L->next = insertTail(L->next, titolo, autore, cod_id);
}
else{
L = initList(titolo,autore,cod_id);
}
return L;
}
List initList(char titolo[50] ,char autore[20] ,int cod_id) {
List L = (List)malloc(sizeof(struct libri));
strcpy(L->titolo, titolo);
strcpy(L->autore, autore);
L->cod_id= cod_id;
L->next = NULL;
return L;
}
struct libri *rimuoviLibri(struct libri *lista)
{
if (lista==NULL) return lista;
if (ricerca == 1) {
lista = rimuoviNodo(lista, lista);
lista = rimuoviLibri(lista);
} else lista->next = rimuoviLibri(lista->next);
return lista;
}
static struct libri *rimuoviNodo(struct libri *lista, struct libri *nodo) {
struct libri *tmp;
if (lista == nodo) {
tmp = lista->next;
freeNodo(lista);
return tmp;
}
else lista->next = rimuoviNodo(lista->next,nodo);
return lista;
}
void freeLista(struct libri *lista)
{
if (lista != NULL) {
freeLista(lista->next);
freeNodo(lista);
}
}
static void freeNodo(struct libri *nodo)
{
free((void *) nodo);
}
List insertHead(List L, char titolo[50] , char autore[50], int cod_id) {
if (L != NULL) {
List G = (List )malloc(sizeof(struct libri));
strcpy(G->titolo, titolo);
strcpy(G->autore, autore);
G->cod_id=cod_id;
G->next = L;
return G;
}
return initList(titolo,autore,cod_id);
}
void printList(List L) {
if (L != NULL) {
printf("%s %s %d\t\n", L->titolo, L->autore, L->cod_id );
printList(L->next);
}
}
int main() {
int scelta;
FILE *fp;
struct libri *lista=NULL;
char titolo[50];
char autore[20];
int id = 0;
int n ;
char nome[255];
char cognome[255];
char matricola[9];
fp = fopen("Libri.txt","r");
if (fp == NULL) gestioneErrore();
lista = leggiFile(fp, lista);
fclose(fp);
while((scelta = menu())){
switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
case 1: /*stampa lista*/
// scriviLista(lista);
printList(lista);
break;
case 2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/
printf("Quanti libri vuoi richiedere?: ");
scanf("%d", &n);
printf("\nInserisci il nome dello studente : ");
scanf("%255s", nome);
printf("\nInserisci il cognome dello studente : ");
scanf("%255s", cognome);
printf("\nInserisci la matricola dello studente: ");
scanf("%9s", matricola);
printf("\nInserire titolo del libro: ");
scanf("%49s", titolo);
printf("\nInserire autore del libro:");
scanf("%19s", autore);
printf("\nInserire codice del libro ");
scanf("%d", &id);
printf("\nRichiesta effettuata con successo\n");
lista = insertHead(lista, titolo, autore, id);
break;
case 3: /* Case costruito per restituire un libro tramite codice*/
printf("Quanti libri vuoi restituire?: ");
scanf("%d", &n);
for (int i=0; i<n; i++) {
printf("Inserire titolo \n");
scanf("%49s", titolo);
printf("Inserire autore' \n");
scanf("%19s", autore);
printf("Inserire codice' \n");
scanf("%d", &id);
printf("\nLibro restituito con successo\n");
lista = insertTail(lista, titolo, autore, id);
}
break ;
case 4: /*esegui richiesta*/
ricerca(lista);
break ;
case 5: /*Se l'utente vuole uscire dalla biblioteca*/
printf("Grazie per aver scelto il servizio di gestione& della biblioteca, torna a trovarci!\n");
return 0;
break;
default: /*Se l'utente sbaglia ad inserire il numero*/
printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
break;
} /*Fine switch*/
} /*Fine do*/
return 0;
} /*Fine main*/
perche faccio rifermento alla ricerca che viene effettuata
--- i due messaggi sono stati uniti ---
ho implementato l'eliminazione ma non mi funziona, poi per esegui richiesta cioè accettare o rifiutare ho pensato di cercare se il libro è presente allora la richiesta è soddisfatta e viene poi eliminato il libro...pero nella funzione di ricerca non riesco ad aggiustarla per far ciò potresti aiutarmi?Codice:#ifndef funzioni_h #define funzioni_h #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 20; struct libri{ char titolo[50]; char autore[20]; int cod_id; struct libri *next; }; typedef struct libri* List; int menu(void); void gestioneErrore(void); void ricerca (struct libri *l); List initList(char titolo[50],char autore[20],int cod_id); struct libri *leggiFile(FILE *fp, struct libri *lista); //void scriviLista(struct libri *lista); void scriviFile(FILE *fp, struct libri *lista); struct libri *inserisciLista(struct libri *nodo, struct libri *lista); struct libri *nuovoNodo(char *titolo, char *autore, int cod_id); List insertTail(List L, char titolo[50], char autore[20], int cod_id); static struct libri *rimuoviNodo(struct libri *lista, struct libri *nodo); struct libri *rimuoviLibro(struct libri *lista); void freeLista(struct libri *lista); static void freeNodo(struct libri *nodo); List insertHead(List L, char titolo[50] , char autore[50], int cod_id); void printList(List L); #include "funzioni.h" int menu(){ int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/ printf("* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ \nBenvenuto nel programma di gestione biblioteca\n* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ \n"); printf(" 1. Mostra archivio\n"); printf(" 2. Richiedi libro\n"); printf(" 3. Restituire libro\n"); printf(" 4. Esegui richiesta\n"); printf(" 5. Uscire\n"); printf("Inserisci scelta:"); scanf("%d",&scelta); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/ while(scelta<0 || scelta>5) { printf("Questo tasto non consente di effetuare scelte! Riprova!\n"); printf("Scelta: "); scanf("%d", &scelta); return scelta; } return scelta; } struct libri *nuovoNodo(char *titolo ,char *autore, int cod_id) { struct libri *nodo; nodo = (struct libri *) malloc(sizeof(struct libri)); if (nodo == NULL) return NULL; strcpy(nodo->titolo, titolo); strcpy(nodo->autore, autore); nodo->cod_id =cod_id; nodo->next = NULL; return nodo; } struct libri *inserisciLista(struct libri *nodo, struct libri *lista) { if (lista==NULL) return nodo; lista->next = inserisciLista(nodo, lista->next); return lista; } void gestioneErrore() { printf("Errore\n"); exit(0); } struct libri *leggiFile(FILE *fp, struct libri *lista) { char titolo[50]; char autore[20]; int cod_id; struct libri *nodo; while(fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){ nodo = nuovoNodo(titolo, autore, cod_id); if (nodo == NULL) gestioneErrore(); lista = inserisciLista(nodo, lista); } return lista; } void scriviFile(FILE *fp, struct libri *lista) { while (lista!=NULL) { fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id); lista = lista->next; } } //void scriviLista(struct libri *lista) { // while (lista!=NULL) { // printf("%s %s %d\n",lista->titolo,lista->autore,lista->cod_id); // lista = lista->next; // { // printf("\n"); // } // } //} void ricerca (struct libri *l){ int trovato = 0 ; char titolo[30]; printf("\nInsersici il titolo del libro richiesto :"); scanf("%s", titolo); while (l != NULL && trovato != 1) { if(strcmp(l->titolo, titolo)==0) { printf("\nIl libro richiesto e' presente nell'archivio ed le è stato donato in prestito\n"); trovato=1; } l = l->next; } if(trovato != 1) printf("\nIl libro richiesto non e' presente nell'archivio. La invitiamo ad richiederlo nei prossimi giorni.\n"); } List insertTail(List L, char titolo[50], char autore[20] ,int cod_id) { if (L != NULL) { L->next = insertTail(L->next, titolo, autore, cod_id); } else{ L = initList(titolo,autore,cod_id); } return L; } List initList(char titolo[50] ,char autore[20] ,int cod_id) { List L = (List)malloc(sizeof(struct libri)); strcpy(L->titolo, titolo); strcpy(L->autore, autore); L->cod_id= cod_id; L->next = NULL; return L; } struct libri *rimuoviLibri(struct libri *lista) { if (lista==NULL) return lista; if (ricerca == 1) { lista = rimuoviNodo(lista, lista); lista = rimuoviLibri(lista); } else lista->next = rimuoviLibri(lista->next); return lista; } static struct libri *rimuoviNodo(struct libri *lista, struct libri *nodo) { struct libri *tmp; if (lista == nodo) { tmp = lista->next; freeNodo(lista); return tmp; } else lista->next = rimuoviNodo(lista->next,nodo); return lista; } void freeLista(struct libri *lista) { if (lista != NULL) { freeLista(lista->next); freeNodo(lista); } } static void freeNodo(struct libri *nodo) { free((void *) nodo); } List insertHead(List L, char titolo[50] , char autore[50], int cod_id) { if (L != NULL) { List G = (List )malloc(sizeof(struct libri)); strcpy(G->titolo, titolo); strcpy(G->autore, autore); G->cod_id=cod_id; G->next = L; return G; } return initList(titolo,autore,cod_id); } void printList(List L) { if (L != NULL) { printf("%s %s %d\t\n", L->titolo, L->autore, L->cod_id ); printList(L->next); } } int main() { int scelta; FILE *fp; struct libri *lista=NULL; char titolo[50]; char autore[20]; int id = 0; int n ; char nome[255]; char cognome[255]; char matricola[9]; fp = fopen("Libri.txt","r"); if (fp == NULL) gestioneErrore(); lista = leggiFile(fp, lista); fclose(fp); while((scelta = menu())){ switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */ { case 1: /*stampa lista*/ // scriviLista(lista); printList(lista); break; case 2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/ printf("Quanti libri vuoi richiedere?: "); scanf("%d", &n); printf("\nInserisci il nome dello studente : "); scanf("%255s", nome); printf("\nInserisci il cognome dello studente : "); scanf("%255s", cognome); printf("\nInserisci la matricola dello studente: "); scanf("%9s", matricola); printf("\nInserire titolo del libro: "); scanf("%49s", titolo); printf("\nInserire autore del libro:"); scanf("%19s", autore); printf("\nInserire codice del libro "); scanf("%d", &id); printf("\nRichiesta effettuata con successo\n"); lista = insertHead(lista, titolo, autore, id); break; case 3: /* Case costruito per restituire un libro tramite codice*/ printf("Quanti libri vuoi restituire?: "); scanf("%d", &n); for (int i=0; i<n; i++) { printf("Inserire titolo \n"); scanf("%49s", titolo); printf("Inserire autore' \n"); scanf("%19s", autore); printf("Inserire codice' \n"); scanf("%d", &id); printf("\nLibro restituito con successo\n"); lista = insertTail(lista, titolo, autore, id); } break ; case 4: /*esegui richiesta*/ ricerca(lista); break ; case 5: /*Se l'utente vuole uscire dalla biblioteca*/ printf("Grazie per aver scelto il servizio di gestione& della biblioteca, torna a trovarci!\n"); return 0; break; default: /*Se l'utente sbaglia ad inserire il numero*/ printf("Questo tasto non consente di effetuare scelte! Riprova!\n"); break; } /*Fine switch*/ } /*Fine do*/ return 0; } /*Fine main*/
ricerca non è una chiamata alla funzione di ricerca, il cui prototipo è void ricerca (struct libri *l). A parte che le funzioni si chiamano con le parentesi tonde, ma poi 'ricerca' è una procedura, cioè non restituisce alcun valore (il tipo di ritorno è void) quindi, ammesso che la chiamassi correttamente con ricerca(lista), non ha senso confrontare il valore restituito (che non c'è) con 1.struct libri *rimuoviLibri(struct libri *lista)
{
if (lista==NULL) return lista;
if (ricerca == 1) { // ricerca non è una chiamata a funzione né una variabile
lista = rimuoviNodo(lista, lista);
lista = rimuoviLibri(lista);
} else lista->next = rimuoviLibri(lista->next);
return lista;
}
A->B->C // situazione iniziale, voglio eliminare B
A->B->C // faccio puntare una variabile Temp a B, in modo da non perderne traccia quando scollego A
A->C // A non punta più a B ma a C
Libero la memoria di B (che ora è puntato da Temp)
Ehm, non capisco cosa vuoi dire con "come collego a questo il libro della richiesta precedente?". Non puoi postare la traccia precisa?ciao, scusa se ti disturbo di nuovo, ma non avevo capito bene la traccia per richiesta di un libro si intende che viene fatta la richiesta di avere un libro e poi nell'opzione successiva questa viene approvata....per essere approvata ho cercato se il libro e presente e poi devo eliminarlo ma come collego a questo il libro della richiesta precedente?
struct libri *rimuoviLib(struct libri *lista, char titolo, char autore, int cod_id) { struct libri *prev, *succ, *l;
l = lista; prev = NULL;
while(lista!=NULL) {
if (lista->titolo != titolo & lista->autore != autore & lista->cod_id != cod_id) {
succ = lista->next;
if (prev != NULL) {
prev->next = succ;
} else {
l = succ;
}
freeNodo(lista);
lista = succ;
} else {
prev = lista;
lista = lista->next;
}
}
return l;
}
c'è in realtà ho aperto il file con la richiesta poi ho letto il titolo e poi ho fatto la ricerca..ma mi da errore quando leggo il titolo...Si per l’eliminazione ho modificato facendo così
però mi elimina solo il titolo..perche?Codice:struct libri *rimuoviLib(struct libri *lista, char titolo, char autore, int cod_id) { struct libri *prev, *succ, *l; l = lista; prev = NULL; while(lista!=NULL) { if (lista->titolo != titolo & lista->autore != autore & lista->cod_id != cod_id) { succ = lista->next; if (prev != NULL) { prev->next = succ; } else { l = succ; } freeNodo(lista); lista = succ; } else { prev = lista; lista = lista->next; } } return l; }
in pratica io in una scelta faccio la richiesta di un libro poi nella scelta successiva questa richiesta devi accettarla o rifiutare
--- i due messaggi sono stati uniti ---
ciao, allora per la richiesta del libro ho inserito un nuovo file dove vado a scrivere i vari dati del libro e dell'utente ma come posso fare per prendere il titolo contenuto in esso e fare la ricerca nella lista che contiene i libri?
Si per l’eliminazione ho modificato facendo così
però mi elimina solo il titolo..perche?Codice:struct libri *rimuoviLib(struct libri *lista, char titolo, char autore, int cod_id) { struct libri *prev, *succ, *l; l = lista; prev = NULL; while(lista!=NULL) { if (lista->titolo != titolo & lista->autore != autore & lista->cod_id != cod_id) { succ = lista->next; if (prev != NULL) { prev->next = succ; } else { l = succ; } freeNodo(lista); lista = succ; } else { prev = lista; lista = lista->next; } } return l; }
in pratica io in una scelta faccio la richiesta di un libro poi nella scelta successiva questa richiesta devi accettarla o rifiutare
--- i due messaggi sono stati uniti ---
ciao, allora per la richiesta del libro ho inserito un nuovo file dove vado a scrivere i vari dati del libro e dell'utente ma come posso fare per prendere il titolo contenuto in esso e fare la ricerca nella lista che contiene i libri?
--- i due messaggi sono stati uniti ---
c'è in realtà ho aperto il file con la richiesta poi ho letto il titolo e poi ho fatto la ricerca..ma non trova il titolo del libro messo nel file della richiesta con i titoli dei libri nella richiesta...come risolvo ciò?
strcmp() non confrontando direttamente i nomi delle stringhe (che significa confrontare i loro indirizzi di memoria).non posso fare cosi?Ci sono diversi errori: titolo e autore dicharati come variabili char invece avrebbero dovuto essere array di char o puntatori a char (entrambi sono un modo per indicare le stringhe in C), poi il confronto tra stringhe si fa constrcmp()non confrontando direttamente i nomi delle stringhe (che significa confrontare i loro indirizzi di memoria).
Detto ciò, un algoritmo che puoi implementare è il seguente: se la lista è vuota, la restituisci; se il primo elemento (testa) è quello da eliminare, lo assegni a una variabile temporanea, sposti il suo puntatore avanti di uno (per far iniziare la lista dal secondo elemento), lo cancelli (agendo sulla variabile temporanea) e restituisci la nuova testa della lista. Altrimenti (l'elemento da eliminare non è il primo), ti servono due variabili d'appoggio, ad esempio prev e current. Fai un ciclo finché current != NULL, dove iteri lungo la lista assegnando di volta in volta current a prev e current->next a current. Se l'elemento puntato da current è quello da eliminare, assegni prev->next a current->next (come nell'esempio dei vagoni che ti ho fatto ieri), liberi la memoria del nodo current ed esci dal ciclo. Alla fine restituisci il puntatore lista originale (stavolta non vogliamo spostare la testa della lista).
List cancellalibri(List lis, char titolo)
{
if(!lis) return NULL;
if(lis->titolo == titolo)
{
List tmp = lis->next;
freeLista(lis);
return tmp;
}
lis->next = cancellalibri(lis->next, titolo);
return lis;
}
sisiSe ti va di usare un algoritmo ricorsivo, sì, ma voglio sperare che quello sia pseudocodice perché, come ti ho già detto più volte, è sbagliato usare un carattere per il titolo e confrontare stringhe mediante l'operatore ==.
quindi dovrei scrivere if(strcmp(lis->titolo, titolo)==0)
ma ancora non mi cancella il librosisi
--- i due messaggi sono stati uniti ---
quindi dovrei scrivere if(strcmp(lis->titolo, titolo)==0)
sisi
--- i due messaggi sono stati uniti ---
quindi dovrei scrivere if(strcmp(lis->titolo, titolo)==1)
--- i due messaggi sono stati uniti ---
ma ancora non mi cancella il libro
eh ma non elimina ancora il libro dalla lista
nel main ho creato un nuovo file contenente le richieste e poi ho cercato la parola e poi messo la funzione di cancellazione...perchè la richiesta fatta in precedenza viene accettata ed il libro viene dato in prestito quindi nella lista va eliminato ed ho fatto cosieh ma non elimina ancora il libro dalla lista
fd = fopen("Richieste.dat", "r");
fscanf(fp, "%s", titolo);
ricerca(lista);
printf("Inserisci elemento da cancellare: ");
scanf("%s", titolo);
lista = cancellalibri(lista, titolo[MAXTITOLO]);
scriviLista(lista);
fclose(fd);
lista = cancellalibri(lista, titolo[MAXTITOLO]);
Cos ho modificato:Scusa eh... vedo che stai facendo crossposting su altri forum, oltretutto mostrando anche di là il codice mal formattato e sbagliato, già corretto più volte da @fabio93.
Pare tu stia facendo le cose completamente a caso o quasi...
C:lista = cancellalibri(lista, titolo[MAXTITOLO]);
e questo ne è un altro esempio. Come hai modificato la funzione chiamata?
Questo è anche il modo sbagliato per passare un array di caratteri ad una funzione. Che libro di testo stai seguendo?
List cancellalibri(List lis, char titolo)
{
if(!lis) return NULL;
if(strcmp(lis->titolo ,titolo)==0)
{
List tmp = lis->next;
freeLista(lis);
return tmp;
}
lis->next = cancellalibri(lis->next, titolo);
return lis;
}
List cancellalibri(List lis, char titolo[MAXTITOLO])
{
if(!lis) return NULL;
if(strcmp(lis->titolo, titolo)==0)
{
List tmp = lis->next;
freeNodo(lis);
return tmp;
}
lis->next = cancellalibri(lis->next, titolo);
return lis;
}
lis = tmp;. 'Lis' è una variabile locale passata per valore alla funzione, quando chiami cancellalibri(lis->next, titolo), lis->next viene copiato in lis, ma quando modifichi lis nella chiamata ricorsiva, non viene modificato il valore originale. Essendo questa una funzione ricorsiva, dovevi restituire il valore di 'tmp', come avevi fatto nel codice postato più sù (non capisco perché hai fatto questa modifica).