Appunto che sei alle prime armi perchè complicarsi la vita quando è possibile farne due versione iterativi con un for e un while semplici semplici?

Credo siano di facile intuizione e modificabili se ci vuoi aggiungere qualcosa o riscriverli in altra maniera.

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

struct libro{
char titolo[30];
char nome_autori[20];
int prezzo_di_prestito;
int status; /* status è un campo di array che indica se il libro è presente (1) oppure è in prestito (0)*/
int codice_identificativo;
};
typedef struct libro Libro;


int main ()
{
    short int i, trovato=0, codice, max;

    Libro libreria[20] =
    {
        {"Il signore degli anelli","xxx",5,1,1},
        {"Harry Potter","yyyy",7,1,2},
        {"La bibbia","zzzz",8,0,3},
        {"Piccole donne","gggg",6,0,4},
        {"Guarnizione","sss",1,0,5},
        {"Il nome della rosa","sss",10,1,6},
        {"Via col vento","rrrrr",3,1,7},
        {"Odissea","lllldd",40,1,8},
        {"Cuore","ddsds",12,1,9},
        {"Malavoglia","wewe",4,0,10},
        {"Siddharta","eee",2,1,11},
        {"Lolita","ioio",12,0,12},
        {"Amabili resti","eeewew",35,1,13},
        {"Sulla strada","sss",1,1,14},
        {"Possession","asas",25,1,15},
        {"Germinale","gigi",10,0,16},
        {"Il piccolo principe","ddd",24,1,17},
        {"Un uomo","xdxd",14,1,18},
        {"Amleto","mkmkmk",23,0,19}
    };

    printf("Inserisci il codice = ");
    scanf("%hd", &codice);
    i=0;
    while(trovato != 1 && i<20)
    {
        if(codice == libreria[i].codice_identificativo)
        {
            printf("%s", libreria[i].titolo);
            trovato = 1;
        }
        i++;
    }

    max = 0;
    for(i=1;i<20;i++)
    {
        if(libreria[i].prezzo_di_prestito > libreria[max].prezzo_di_prestito)
        {
            max = i;
        }
    }
    printf("\n\nIl libro col prezzo massimo e' %s", libreria[max].titolo);

    return 0;
}