[C]Problema con la ricerca all'interno di una lista ordinata

di il
16 risposte

[C]Problema con la ricerca all'interno di una lista ordinata

Questo è il codice:

struct libri
{
char name[MAX_LEN_TITLE];
int next;
}
 
struct libri *start = 0;
char book[MAX_BOOKS][MAX_LEN_TITLE];
int s = 1;
 
for(a = start; a; a = a->next, s++)
    {
        int i = 0;
        for(; title[i] != a->title[i]; i++);
        if(title[i] == a->title[i])
        {
            int num = 1;
            for(; title[i + num] == a->title[i + num]; num++);
            if(num == strlen(title))
            {
                book[s] = a->title;
            }
            continue;
        }
    }

Il problema è il seguente: solo se i titoli dei libri nel database iniziano con la mia stringa di ricerca, la funzione li trova(es. Titolo: caccia nel bosco, Stringa di ricerca: cac).
Qualche suggerimento?

16 Risposte

  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Cose'è title? non compare come membro della struttura. Se è un char array (char []) la comparazione non funziona. Non puoi confrontare due presunte stringhe in quel modo. Ti serve strcmp, così stai comparando due puntatori.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Title è un parametro passato a questa funzione(quella postata è solo una parte) e a->title e un char array appartenente ad una struttura.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Non puoi usare la funzione strstr?
    http://www.cplusplus.com/reference/clibrary/cstring/strstr/

    Ti dice se una stringa + piccola compare in quella + grande. Invece di giocare coi indici la risolvi così.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Si, ma volevo solo capire che cosa sbagliavo nella funzione?
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Fai un programma completo almeno possiamo controllarlo. Così è come fare da debugger senza vedere lo stato delle variabili.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Questa è la funzione completa.
    
    struct libri
    {
    int code;
    char title[MAX_TITLE_LEN];
    char des[MAX_DES_LEN];
    struct libri *next;
    };
    
    struct libri *start = 0;
    
    struct libri ***search(const char title[])
    {
        struct libri **books = (struct libri**) malloc(sizeof(struct libri*));
        if(!books)
        {
            puts("Ricerca interrotta");
        }
        books[0] = start;
        struct libri ***point;
        struct libri *a = (struct libri*)malloc(sizeof(struct libri));
        if(!a)
        {
            puts("Ricerca interrotta");
        }
        int s = 1;
        for(a = start; a; a = a->next)
        {
            if(strstr(a->title, title))
            {
                books = (struct libri **) realloc(books, sizeof(struct comp*) * (s + 1));
                if(!books)
                {
                    puts("Ricerca non completata");
                    goto ret;
                }
                point = &books;
                (*point)[s] = a;
                s++;
            }
        }
        (*point)[0]->code = s - 1;
    ret:
        return point;
    }
    
    Ho risolto i problemi precedenti, ma ne restano due:
    - L'elemento 0 del vettore books è uguale all'elemento 1(notato durante l'esecuzione del programma)
    - Se avvio la ricerca in un database vuoto l'istruzione "(*point)[0]->code = s - 1;", restituisce errore.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_TITLE_LEN 50
    #define MAX_DES_LEN	150
    
    struct libri
    {
    	int code;
    	char title[MAX_TITLE_LEN];
    	char des[MAX_DES_LEN];
    	int next;
    };
    struct libri *start = 0;
    
    struct libri ***search(const char title[])
    {
    	struct libri **books = (struct libri**) malloc(sizeof(struct libri*));
    	if(!books)
    	{
    		puts("Ricerca interrotta");
    	}
    	books[0] = start;
    	struct libri ***point;
    	struct libri *a = (struct libri*)malloc(sizeof(struct libri));
    	if(!a)
    	{
    		puts("Ricerca interrotta");
    	}
    	int s = 1;
    	for(a = start; a; a = a->next)
    	{
    		if(strstr(a->title, title))
    		{
    			books = (struct libri **) realloc(books, sizeof(struct comp*) * (s + 1));
    			if(!books)
    			{
    				puts("Ricerca non completata");
    				goto ret;
    			}
    			point = &books;
    			(*point)[s] = a;
    			s++;
    		}
    	}
    	(*point)[0]->code = s - 1;
    ret:
    	return point;
    }
    
    int main()
    {
    	
    }
    
    correggi gli errori nel codice se vuoi che qualcuno ti trovi gli errori nella logica.
    lista errori:
    
    in.cpp(142): error C2440: '=' : cannot convert from 'int' to 'libri *'
    1>          Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    
    in.cpp(160): warning C4701: potentially uninitialized local variable 'point' used
    
    dove hai imparato a creare le strutture in questo modo?
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    A me non restituisce nessun errore durante la compilazione, solo quelli menzionati durante l'esecuzione.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    
     for(a = start; a; a = a->next)
    
    Ma se a è un puntatore a struct e next è un int come fa a non darti errore? che razza di compilatore usi. poi lo vedi anche tu che siccome point non è inizializzato puo sucedere che (*point)[0]->code = s - 1; non sia una locazione valida.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Avevo sbagliato a riportare il codice, comunque era intuibile che next fosse un puntatore alla struttura successiva della lista ordinata che compone il database libri(for(a = start; a; a = a->next)). point punta sempre al vettore books.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Ho risolto.
    Adesso però ho un altro problema.
    Se richiamo la funzione search dalla funzione main:
    
    struct libri ***books = ccompx(name);
    
    e provo ad accedere all'elemento code della struttura che si trova nella posizione 0 del vettore books, restituisce errore.
    
    printf("Numero libri trovati: %d", (*books)[0]->code);
    
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Segui il programma. Supponi che hai la lista vuota:
    
    struct libri *start = 0; //START PUNTA A NIENTE.
    
    struct libri ***search(const char title[])
    {
       struct libri **books = (struct libri**) malloc(sizeof(struct libri*));
       if(!books)
       {
          puts("Ricerca interrotta");
       }
       books[0] = start; // SE START PUNTA A NIENTE ANCHE BOOKS[0] PUNTERA A NIENTE.
       struct libri ***point;  // POINT PUNTA A NIENTE
       struct libri *a = (struct libri*)malloc(sizeof(struct libri));
       if(!a)
       {
          puts("Ricerca interrotta");
       }
       int s = 1;
       //START CONTINUA A PUNTARE A NIENTE IL CICLO FOR VIENE SALTATO
       for(a = start; a; a = a->next) 
       {
          if(strstr(a->title, title))
          {
             books = (struct libri **) realloc(books, sizeof(struct comp*) * (s + 1));
             if(!books)
             {
                puts("Ricerca non completata");
                goto ret;
             }
             point = &books;
             (*point)[s] = a;
             s++;
          }
       }
    // SE IL CICLO FOR VIENE SALTATO POINT NON PUNTERA MAI A BOOKS QUINDI IL CODICE SOTTO MANDA IN CRASH IL PROGRAMMA.
       (*point)[0]->code = s - 1;
    ret:
       return point;
    }
    
    leggi i commenti nel codice. Impara anche a fare da debugger come ho fatto io prima. Ecco che abbiamo trovato il perche il tuo codice va in crash.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    In realtà, solo se la funzione non trova alcuna corrispondenza l'istruzione "(*point)[0]->code = s - 1;" restituisce errore. Dato che tramite memory dump e printf ho verificato che books contiene le strutture dei libri il cui titolo ha una corrispondenza con la chiave di ricerca, il ciclo for non può essere saltato dal programma.
  • Re: [C]Problema con la ricerca all'interno di una lista ordinata

    Quello è il percorso con struttura vuota ed è lì che va in crash.
    Allora fai una bella cosa: Usa il debugger. Non avrai bisogno di eseguire ne dump e neanche printf.
    Non ho ancora capito che IDE e che sistema operativo usi ma cmq il tuo compilatore avrà un debugger da usare. Un altra cosa da tenere in mente: ogni malloc,realloc dev'essere associato con free così al termine del programma non avrai dei "memory leak".
Devi accedere o registrarti per scrivere nel forum
16 risposte