tList* SortList(tList* pList, int(*fcmp)(void*pItList,void*pItNew)) //sortiert die übergebene Liste pList mit der angegeben Funktion fcmp{ tList *neueliste, *pItAktuell, *pItNew; //neueliste ist die neue sortierte Liste, pItAktuell das aktuelle Element der momentanen Liste pList und pItNew eine Kopie dieses Elements für die neue sortierte Liste neueliste = CreateList(); //neue Liste erstellen pItAktuell = GetFirst(pList); //erstes Element der aktuellen Liste holen while(hasnext(pList)) //solange noch Elemente in der Liste sind... { pItAktuell = (tList*)GetNext( pList ); //..nehmen wir uns das nächste pItNew = (tList*) malloc(sizeof(struct Liste)); //..legen speicher für die Kopie davon an pItNew->ArtBest = pItAktuell->ArtBest; //..Kopieren alle Daten pItNew->ArtNr = pItAktuell->ArtNr; //.. - " - pItNew->ArtBez = (char*) malloc(strlen(pItAktuell->ArtBez)+1); //.. - " - memcpy(pItNew->ArtBez, pItAktuell->ArtBez, strlen(pItAktuell->ArtBez)+1); //.. - " - addItemToList(neueliste, pItNew, fcmp); //und fügen die Kopie schließlich in die neue Liste ein. Sortiert nach der angegebenen Sortierfunktion fcmp } //löschen der alten Liste stück für stück GetFirst(pList); GetNext( pList); while(hasnext(pList)) { RemoveItem(pList); } DeleteList(pList); //am ende noch die alte Liste an sich Löschen return GetFirst(neueliste);}int suchen_bez (void* pItList, void*pItNew) //sucht die richtige Stelle zum sortierten Einfügen nach der Bezeichnung{ tList *neues; //einzufügendes Element tList *pList; //Liste in der es einzufügen ist int ret=DAVOR; //Art des Einfügens, standardmäßig vor dem gefundenen Element if (pItList == NULL || pItNew == NULL) //Fehlerabfrage { return FAIL; } neues = (tList*) pItNew; //casten des 2. Argumentes auf den richtigen Typ (das einzufügende Element) pList = (tList*) pItList; //casten das 1. Argumentes auf den richtigen Typ (die Liste) if (neues->ArtBez == NULL) //Fehlerabfrage ob im einzufügenden Element eine Bezeichnung vergeben ist { return FAIL; } while(pList->aktuell->erstes == FALSE) //läuft die liste durch so lange das aktuelle nicht das erste ist { pList->aktuell = pList->aktuell->next; } //hier ist also das aktuelle element das erste (vielleicht sollte man einfach GetFirst() benutzen...) while(strcmp(((tList*)(pList->aktuell->element))->ArtBez, neues->ArtBez) <= 0) //solange die bezeichnung des aktuellen elementes "kleiner" als die bezeichnung des einzufügenden elementes ist { if(pList->aktuell->next->erstes) { ret = DANACH; //ist das nachste element das erste, dann fugen wir danach ein und brechen ab. Das neue Element wird als unser letztes Element. break; } pList->aktuell = pList->aktuell->next; //sonst setzen wir unsere suche fort } //an dieser Stelle zeigt nun das aktuelle Element auf das erste element das "größer" als unser neues Element ist, oder im Fall das es kein größeres gibt auf dsa Letzte in der Liste. //Genau so wird auch die Ruckgabe gehandelt, im ersten Fall wird davor eingefügt, im 2. Fall danach. return ret;}