Тема: Розробити програму яку забезпечує опрацювання структур даних
Розробити програму яку забезпечує опрацювання структур даних. 
Забезпечити виконання таких операцій: 
• додавання нового елементу; 
• пошук елементу за значенням полів; 
• послідовний перегляд елементів; 
• модифікація значень полів елемену; 
• видалення елементу; 
• сортування за значеннями полів. 
 Структура:    Книга (назва, автор, видавництво, рік, кількість сторінок). 
ось що поки вийшло
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<fcntl.h>
#include <stdlib.h>
#define maxCountOfRecord 20
typedef struct library{
    char surname[10];
    char title[15];
    char publish[15];
    int  pnum;
    int year;
}lb;
int main(void) {
    int count;
    int i = 0;
    int flag = 1;
    while(flag){
        lb lib[maxCountOfRecord];
        info(2);
        count = rDB(&lib);
        lib[count].pnum=0;
        lb selected[maxCountOfRecord];
        int mod = getch()-48;
        switch(mod){
        case 1:
            display(&lib, count, 1);
            break;
        case 2:
            count = search(massage1(), &lib, &selected, count);
            display(&selected, count, 1);
            break;
        case 3:
            newRecord();
            break;
        case 9: system("@cls||clear"); break;
        case 0: flag = 0; break;
        }
    }
}
void display(lb lib[], int count, int mod){
    info(1);
    int i = 0;
    int flag= 1;
    while(flag){
        printf("\n   %s %s %s %d %d", lib[i].surname, lib[i].title, lib[i].publish, lib[i].pnum, lib[i].year);
        int next;
        switch(mod){
            case 1:{
                next = getch()-48;
                switch(next){
                    case 0: flag = 0;break;
                    case 1: if (i>0)i--;
                            else error(1);
                            break;
                            case 2: if((i+1)<count)
                                i++;
                            else
                                error(2);
                            break;
                    case 3: system("@cls||clear");
                        display(lib, count, 0);
                        flag = 0;break;
                    case 4: flag = 0;
                        changeRecord(&lib[i], lib);
                        break;
                    case 5: flag = 0;
                        deleteRecord(lib,i);
                        break;
                    case 9: info(1); i = 0; break;
                    default:error(0);break;
                }
                break;}
            default:    if((i+1)<count)i++;
                        else flag = 0;
                        break;
        }
    }
    printf("\n");
}
int rDB(lb **p){
    lb l[maxCountOfRecord];
    int i = 0;
    FILE *f2 = fopen("d1.txt","rb");
    long count= filelength(fileno(f2));
    count /=sizeof(lb);
    while(i<count){
        lb fp1;
        fread(&*(p+8*i), sizeof(lb), 1, f2);
        i++;
    }
    fclose(f2);
    return count;
}
int search(int mod, lb lib[], lb result[],int size){
    int count = 0;
    int i =0;
    char l[15] = "";
    char *key= &l;
    massage2(key);
    switch(mod){
        case 1:
            while (i<size){
                if (!strcmp(lib[i].surname, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        case 2:
            while (i<size){
                if (!strcmp(lib[i].title, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        case 3:
            while (i<size){
                char j[15];
                char *pnum = &j;
                itoa(lib[i].pnum, pnum, 10);
                if (!strcmp(pnum, key)){
                    result[count] = lib[i];
                    count++;
                }
                i++;
            }
            break;
        default: error(0); break;
    }
    return count;
}
void inputRecord(lb *library){
    printf("\nEnter surname\n");
    scanf("%s", &library->surname);
    printf("Enter title\n");
    scanf("%s", &library->title);
    printf("Enter publish\n");
    scanf("%d", &library->publish);
    printf("Enter pnum\n");
    scanf("%d", &library->pnum);
    printf("Enter year\n");
    scanf("%d", &library->year);
}
void newRecord(){
    lb library;
    inputRecord(&library);
    writeRecord(&library,1);
}
void writeRecord(lb *library, int mod){
    FILE *f2;
    if(mod==0)f2 = fopen("d1.txt","wb");
    else{
    f2 = fopen("d1.txt","ab");
    fwrite(library, sizeof(lb),1, f2);}
    fflush(f2);
    fclose(f2);
}
void changeRecord(lb *library, lb lib[]){
    modify(library, lib, -1);
}
void deleteRecord(lb lib[], int deleted){
    lb library;
    modify(&library, lib, deleted);
}
void modify(lb *library, lb lib[], int deleted){
    if(!(deleted+1))
    inputRecord(library);
    int size=0;
    while(lib[size].pnum>0){
        size++;
    }
    int i=0;
    writeRecord(&lib[0],0);
    while(i<size){
        if(!(i==deleted))
        writeRecord(&lib[i],1);
        i++;
    }
}
void error(int mod){
    switch(mod){
    case 0:printf("Input correct data\n");break;
    case 1:printf("It's a first record\n"); break;
    case 2:printf("It's a last record\n"); break;
    }
}
int massage1(){
    puts("\nChoose search mode");
    int mod = getch()-48;
    return mod;
}
void massage2(char *key){
    puts("Input key");
    char line;
    scanf("%s", &line);
    strcpy(key, &line);
}
void info(int mod){
    switch(mod){
    case 1: printf("\nPress 1 to previous record, 2 - next, 3 - get all, 0 - exit, 9 - info\n   4 - to modify, 5 - to delete\n"); break;
    case 2: printf("Press 1 to get records, 2 to search, 3 - new record, 9 - clean, 0 - exit\n"); break;
    }
}проблема в тому, шо не можу толком зробити сортування і до того ж програма може видавати якісь неточності або помилки вже під час її запуску, тобто вже під час пошуку елементу чи його модифікації
