#include <cstring>

#define error NULL

struct ZaposlenaOsoba {
    char OIB[12];
    char prezime[35], ime[35];
    char datum[12], rad_mj[40]; };

struct lis {
    ZaposlenaOsoba vrij;
    lis *sljedeci; };
typedef lis *element;

typedef lis *lista;



element FirstL(lista L) {
    return L; }

element EndL(lista L) {
    element el = FirstL(L);
    while(el->sljedeci != NULL) {
        el=el->sljedeci; }
    return el; }

element NextL(element p, lista L) {
    if(p->sljedeci == NULL) {
        return error; }
    else {
        return p->sljedeci; } }

element PreviousL(element p, lista L) {
    element el = FirstL(L);
    if(el == p) {
        return error; }
    while(el->sljedeci != p) {
        el=el->sljedeci; }
    return el; }

element LocateL(ZaposlenaOsoba x, lista L) {
    for(element el=FirstL(L); el!=EndL(L); el=el->sljedeci) {
        if(strcmp(el->sljedeci->vrij.OIB, x.OIB) == 0 &&
                strcmp(el->sljedeci->vrij.prezime, x.prezime) == 0 &&
                strcmp(el->sljedeci->vrij.ime, x.ime) == 0 &&
                strcmp(el->sljedeci->vrij.datum, x.datum) == 0 &&
                strcmp(el->sljedeci->vrij.rad_mj, x.rad_mj) == 0) {
            return el; } }

    return EndL(L); }

bool InsertL(ZaposlenaOsoba x, element p, lista L) {
    element elZapNov = new lis;
    strcpy(elZapNov->vrij.OIB, x.OIB);
    strcpy(elZapNov->vrij.prezime, x.prezime);
    strcpy(elZapNov->vrij.ime, x.ime);
    strcpy(elZapNov->vrij.datum, x.datum);
    strcpy(elZapNov->vrij.rad_mj, x.rad_mj);
    elZapNov->sljedeci = p->sljedeci;
    p->sljedeci = elZapNov;
    return 1; }

bool DeleteL(element p, lista L) {
    element elZap = p->sljedeci;
    p->sljedeci = elZap->sljedeci;
    delete elZap;
    return 1; }

ZaposlenaOsoba RetreiveL(element p, lista L) {
    return p->sljedeci->vrij; }

void DeleteAllL(lista L) {
    for(element el=L; el != EndL(L); ) {
        DeleteL(el, L); } }

lista InitL(lista L) {
    L = new lis;
    L->sljedeci = NULL;
    return L; }