Pár poznámok: miešaš C s C++ - vyber si jedno z toho a používaj to, čo si si vybral.
- Includuješ štandardné hlavičkové súbory, ktoré majú príponu .h súčasne s takými, ktoré ju nemajú. Súbory s .h sú ok pre C, ale ak chceš mať program v C++, uprednostni radšej cstdlib, string a cstdio (alebo ešte lepšie, použi C++ prístup, ktorý tieto knižnice nepotrebuje). Ak chceš robiť v C, tak nepoužívaj iostream a namiesto cout použi printf.
- Deklaruješ char[] pre reťazce - ok pre C, string pre C++.
- Compare funkcie s parametrom void* - V C nepotrebuješ pretypovať premenné typu void*, C to robí implicitne. V C++ máš niekoľko možností pretypovania (static_cast, const_cast, reinterpret_cast, dynamic_cast). C-štýl pretypovania funguje aj v C++, ale je menej bezpečný (s C++-štýlom sa počas kompilácie robí aj typová kontrola). Ak chceš písať v C kompilovanom C++ (áno, aj taký štýl existuje), tak sú tie pretypovania ok.
- qsort - Pre C ok, pre C++ si pozri #include <algorithm> a std::sort - bude to typovo bezpečnejšie.
- Iterovanie cez záznamy - Ak by si použil C++ a vektor, mohlo by to vyzerať takto: for (auto &zaznam : zaznamy) { ... }
- compareByName: "if (pa->jmeno < pb->jmeno) diff = -1; else if (pa->jmeno > pb->jmeno) diff = +1; else diff = 0;" sa dá nahradiť "diff = pa->jmeno - pb->jmeno" (komparátor nepotrebuje vrátiť -1/1/0, ale stači mu výsledok <0/>0/=0)
Edit: Ak chceš vyvíjať natívne aplikácie, pozrel by som si na tvojom mieste Rust - pracuje sa s ním oveľa lepšie a vlastnosťami je na tom podobne ako C/C++.