?
Ahja.
ist Deine "liste" global definiert?
Bemühe doch mal einen Debugger, um die Zeile festzustellen, die nicht behagt.
Wenngleich man schon einen leisen Verdacht hegen darf, wenn man sich den Quellcode so ansieht...
Ein free() auf einen Pointer, für den kein Speicher alloziert wurde, wird zum Knall führen. Abgesehen davon, dass Du vogelwild mit typedefs, structs, globals und unübersichtlichen if-Kaskaden um dich schmeißt, würdest Du auch bei zufriedenstellender Funktionalität eine miese Bewertung für den Code bekommen.