Ricerca da una lista e ordinamento della stessa

di il
3 risposte

Ricerca da una lista e ordinamento della stessa

Salve a tutti! Sto avendo problemi nella risoluzione di un esercizio riguardante una lista che ordini un insieme di libri per campi. Principalmente non riesco a capire come poter ordinare le varie strutture secondo quanto richiesto nel primo punto dell'esercizio ed infine, per quanto riguarda l'ultimo punto ("cercare un libro in relazione ad uno specifico campo"), non riesco a far funzionare la funzione search in list con titoli e/o autori qualora dovessero presentare spazi nei rispettivi campi. Posto il codice:
/*
Creare un programma che attraverso una struttura collegata, permetta di gestire le
informazioni riguardanti un insieme di libri. Per ogni libro si considerino le
informazioni: codice ISBN, titolo, autore.
Il programma consenta di :
•memorizzare i libri secondo l’ordine dato dal codice ISBN. (usare la qsort ?)
•Salvare i dati su un file    DONE
•Leggere da file i dati precedentemente immessi (stampare su schermo tutto quello scritto in file) DONE
•Cercare un libro in relazione ad uno specifico campo (dalle liste e non da file)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct libro {
	char isbn[17];
	char titolo[50];
	char autore[30];
	struct libro *next;
	};
typedef struct libro libro;
void print_list_infile(libro *head, FILE *fp);
libro *search_in_list1(libro *head, char isbn[]);
libro *search_in_list2(libro *head, char titolo[]);
libro *search_in_list3(libro *head, char autore[]);
libro *add_to_list(libro *head, char isbn[], char titolo[], char autore[]);
int main() {
	FILE *fp;
	int i;
	char titolozzo[50];
	char *s;
	char c, z;
	char temp_isbn[17];
	char temp_autore[30];
	char temp_titolo[50];
	s=temp_titolo;
	libro *head=NULL;
	libro *ps, *cs, *ds;
	strcpy(temp_isbn, "");
	while(1)
	{
		i=1;
		printf("Codice ISBN: ");
		scanf("%s", temp_isbn);
		if(strcmp(temp_isbn, "-1")==0)
			break;
		while((c=getchar())!='\n');
		printf("Titolo: ");
		scanf("%[^\n]s", temp_titolo);
		while((c=getchar())!='\n');
		printf("Autore: ");
		scanf("%[^\n]s", temp_autore);
		while((c=getchar())!='\n');
		i++;
		head=add_to_list(head, temp_isbn, temp_titolo, temp_autore);
	} /*chiude il while(1)*/

	qsort(head->isbn, i, 17, (int (*)(const void *, const void *))strcmp);
	fp=fopen("lista_libri.txt", "w");
	print_list_infile(head, fp);
	fclose(fp);
	fp=fopen("lista_libri.txt", "r");
	if(fp) {
		while((c = getc(fp)) != EOF)
			putchar(c);
		fclose(fp);
	}
	while(1) {
		printf("Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: ");
		scanf("%s", &z);
		switch(z) {
			case '1':
				scanf("%s", temp_isbn);
				ps=search_in_list1(head, temp_isbn);
				break;
			case '2':		
				//scanf("%s", temp_titolo);
				//scanf("%[^\n]s", temp_titolo);
				//while((c=getchar())!='\n');
		scanf("%[^\n]s", titolozzo);
		while((c=getchar())!='\n');
				cs=search_in_list2(head, titolozzo);
				break;
			case '3':		
				//scanf("%[^\n]s", temp_autore);
				//scanf("%s", temp_autore);
		fgets(temp_autore, 30, stdin);
		//while((c=getchar())!='\n');
				ds=search_in_list3(head, temp_autore);
				break;
			case '4':		
				return 0;
		} /*chiude il while interno*/
	} /*chiude il while(1)*/
	fclose(fp);
} /*chiude il main*/

libro *search_in_list1(libro *head, char isbn[]) {
	if(head==NULL)
		return NULL;
	while(head!=NULL)
	{
		if(strcmp(head->isbn, isbn)==0){
				printf("--%s  %s  %s--\n", head->isbn, head->titolo, head->autore);
			return head;}
		head=head->next;
	}
	return NULL;
}
libro *search_in_list2(libro *head, char titolo[]) {
	if(head==NULL)
		return NULL;
	while(head!=NULL)
	{
		if(strcmp(head->titolo, titolo)==0) {
				printf("--%s  %s  %s--\n", head->isbn, head->titolo, head->autore);
			return head; }
		head=head->next;
	}
	return NULL;
}
libro *search_in_list3(libro *head, char autore[]) {
	if(head==NULL)
		return NULL;
	while(head!=NULL)
	{
		if(strcmp(head->autore, autore)==0) {
				//fscanf(fp, "%s\n", autore);		
				printf("--%s  %s  %s--\n", head->isbn, head->titolo, head->autore);
			return head; }
		head=head->next;
	}
	return NULL;
}

libro *add_to_list(libro *head, char isbn[], char titolo[], char autore[])
	{
		libro *p, *t;
		p=(libro *)malloc(sizeof(libro));
		strcpy(p->isbn, isbn);
		strcpy(p->titolo, titolo);
		strcpy(p->autore, autore);
		p->next=NULL;
		t=head; //puntatore temporaneo è t
		if(head==NULL)
			return p;
		while(t->next!=NULL)
			t=t->next;
		t->next=p;
		return head;
	}

void print_list_infile(libro *head, FILE *fp) {
	int i=1;
	while(head!=NULL)
	{
		fprintf(fp, "%d) %s  %s  %s\n", i++, head->isbn, head->titolo, head->autore);
		head=head->next;
	}
}
Nel codice trovetere sicuramente cose in più inutilizzate, risultato di tante prove non andate a buon fine

3 Risposte

  • Re: Ricerca da una lista e ordinamento della stessa

    Esponi meglio il problema, cosa va e cosa non va cosa devi fare ed il codice che porta all'errore senza troppi sfronzoli in mezzo.
  • Re: Ricerca da una lista e ordinamento della stessa

    Allora innanzitutto per quanto riguarda la ricerca
    	while(1) {
    		printf("Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: ");
    		scanf("%s", &z);
    		switch(z) {
    			case '1':
    				scanf("%s", temp_isbn);
    				ps=search_in_list1(head, temp_isbn);
    				break;
    			case '2':		
    				//scanf("%s", temp_titolo);
    				//scanf("%[^\n]s", temp_titolo);
    				//while((c=getchar())!='\n');
    		scanf("%[^ ]s", titolozzo);
    		while((c=getchar())!='\n');
    				cs=search_in_list2(head, titolozzo);
    				break;
    			case '3':		
    				//scanf("%[^\n]s", temp_autore);
    				//scanf("%s", temp_autore);
    		fgets(temp_autore, 30, stdin);
    		//while((c=getchar())!='\n');
    				ds=search_in_list3(head, temp_autore);
    				break;
    			case '4':		
    				return 0;
    riesco a mandare a buon fine soltanto il case 1 ed il quarto, penso che ciò sia dovuto al fatto che il programma da me scritto non legge bene gli spazi e di conseguenza la stringa non viene trovata.
    Ecco cosa mi stampa sul terminale:
    Codice ISBN: 123
    Titolo: hit the lights
    Autore: mario marcelli
    Codice ISBN: 1234
    Titolo: tavola periodica
    Autore: professor blah
    Codice ISBN: -1
    1) 123  hit the lights  mario marcelli
    2) 1234  tavola periodica  professor blah
    Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: 1
    123
    --123  hit the lights  mario marcelli--
    Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: 1
    1234
    --1234  tavola periodica  professor blah--
    Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: 2
    Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: 2
    Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: 3
    Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: 3
    Digitare 1 per ISBN, 2 per TITOLO, 3 per AUTORE, 4 per USCIRE: 4
    
    Per quanto riguarda il quicksort sono molto confuso a riguardo...
  • Re: Ricerca da una lista e ordinamento della stessa

    Risolto il problema del sorting attraverso queste due funzioni:
    libro *add_in_order(libro* head, char isbn[], char titolo[], char autore[])
    	{
    		libro *p, *temp_p, *prev_p;
    		p=(libro *)malloc(sizeof(libro));
    		assert(p!=NULL);
    		strcpy(p->isbn, isbn);
    		strcpy(p->titolo, titolo);
    		strcpy(p->autore, autore);
    		p->next=NULL;
    		if(head==NULL)
    			return p;
    		if(strcmp(isbn, head->isbn)<0)
    		{
    			p->next=head;
    			return p;
    		}
    		prev_p=head;
    		temp_p=head;
    		while(temp_p->next!=NULL && strcmp(isbn, temp_p->isbn)>0)
    		{
    			prev_p=temp_p;
    			temp_p=temp_p->next;
    		}
    		if(temp_p->next==NULL && strcmp(isbn, temp_p->isbn)>0)
    		insert(temp_p, NULL, p);
    		else
    		insert(prev_p ,temp_p, p);
    		return head;
    	}
    
    void insert(libro *a, libro *b, libro *c){
    	if(a->next!=b){
    		printf("Error\n");
    		return;
    	}
    	a->next=c;
    	c->next=b;
    	return;
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte