[C] Die Sortierung-Routine abgesegnet?

Cusco

Erfahrenes Mitglied
HI, ich habe eben ne Sortierungsroutine ohne Irgend eine Vorlage geschrieben, ich weiss nicht ein mal von Welcher Art die Sortierung ist, also wie sie heißen möge :-(
Sie Sortiert eine Datensatzliste (mit 3 String-Variablen pro Eintrag), nach dem Alphabet. Es ist eine Halbe Dynamische Liste oder sowas. Das ist so per malloc wird der Datensatz erstellt und die Adresse in Eine Pointerliste mit Maximal 10K Einträgen eingetragen. Diese Pointerliste wird dann umsortiert, je nachdem welche Daten sich im Block zu den jeweilgen Pointer in der Liste befindet.

Hier der Komplette Source:

Code:
#include<stdio.h>
#include<string.h>
#include<windows.h>

//Maximale Eintraganzahl
#define MAXEINTRAEGE (10000)
//Einträge die Hinzugefügt werden sollen
#define ADDANZAHL (2000)

#define DABes   Zaehler.daten->Beschreibung
#define DATitel Zaehler.daten->Titel
#define DADatei Zaehler.daten->Datei

struct Daten{
  TCHAR Datei[100];
  TCHAR Titel[200];
  TCHAR Beschreibung[300];};

struct Zaehler{
  int pos;
  int anzahl;
  struct Daten *daten;};
  
struct Zaehler Zaehler;
TCHAR *Liste[MAXEINTRAEGE];

int AddItem(const TCHAR *Datei,const TCHAR *Titel,const TCHAR *Beschreibung){
   struct Daten *adr;
   int ok;
   ok = FALSE;
   if (Zaehler.anzahl < MAXEINTRAEGE)
   {
      adr = (struct Daten *) malloc(sizeof(struct Daten));
      if (adr > 0)
      {
         memset(adr,0,sizeof(struct Daten));
	     Zaehler.anzahl++;
		 Zaehler.pos = Zaehler.anzahl;
		 Zaehler.daten = adr;
		 ok = TRUE;
		 Liste[Zaehler.anzahl] = (TCHAR *) adr;
		 
		 strcpy(DADatei,
		        Datei);
		 strcpy(DATitel,
		        Titel);
		 strcpy(DABes,
		        Beschreibung);
      }
   }
   return (ok);
}

int GotoItem(int nr){
   if ((nr <=  Zaehler.anzahl) && (nr >= 1))
   {
       Zaehler.pos = nr;
	   Zaehler.daten = (struct Daten *) Liste[nr];
       nr = TRUE;
   }
   else
   {nr = FALSE;}
   return(nr);
}

int NextItem(void){ 
   int nr=Zaehler.pos;
   nr++;
   return (GotoItem(nr));}

int PrevItem(void){ 
   int nr=Zaehler.pos;
   nr--;
   return (GotoItem(nr));}   
   
void PrintItem(void){
   printf("Titel       : '%s'\n"
          "Beschreibung: '%s'\n"
          "Datei       : '%s'\n"
          ,DATitel,DABes,DADatei);} 

// Hier die Sortierung-Routine
void sort(void){
   struct Daten *vgl1,*vgl2;
   int z;
   int Fertig;
   do{
     Fertig=TRUE;
	 for(z=Zaehler.anzahl;z>1;z--)
	 {
	    vgl1 = (struct Daten *) Liste[z];
		vgl2 = (struct Daten *) Liste[z-1];
		if (strcmp(vgl1->Titel,vgl2->Titel)<0)
		{
		   Liste[z]   = Liste[z-1];
		   Liste[z-1] = (TCHAR *) vgl1;
		   Fertig = FALSE;
		}
	 }
   } while(Fertig==FALSE);
}
   
int main(void){
  int z;
  TCHAR Titel[100];
  TCHAR Datei[100];
  TCHAR Bez[100];
  Zaehler.anzahl = 0;
  for(z=1;z<ADDANZAHL;z++){
      sprintf(Titel,"Titel %i Nr %i",z%30,z);
	  sprintf(Datei,"Datei Nr %i",z);
	  sprintf(Bez  ,"Bezeichnung Nr %i",z);
	  if (AddItem(Datei,Titel,Bez)==TRUE){
	      //printf("Eintrag %i hinzugefuegt!!\n",Zaehler.anzahl);
	  };
  }	  
  GotoItem(1);
  //do{PrintItem();}while(NextItem());
  printf("Sortierung gestartet ...\n");
  sort();
  printf("Sortiert\n");
  GotoItem(ADDANZAHL-100);
  do{PrintItem();}while(NextItem());
  return(0);}

Ich denke Eigentlich das die Sortiergeschwindigkeit für meine Zwecke austreichend ist, zumal später zu jeden Eintrag eine HTML-Datei gehören wird, die Ausgelesen werden muss, das wird wohl die meiste Zeit in Anspruch nehmen.

Aber überpfüft mal und gebt ggf. Ratschläge, dazu habe ich ja das Thema eröffnet :)
 
Hi!
Sortier-Routinen muss man heutzutage nicht selbst schreiben. Unter C gibt es bereits z.B. qsort (= quick sort).
Unter C++ und der Standard-Library wäre es noch einfacher. Da gibt es eine Reihe von Containern (sprich Vektoren, Listen, ...), die sich sortieren lassen. Auch das Hinzufügen wäre einfacher.
Schau mal in deiner Online-Hilfe nach.

Grüße
Onkel Schuppig
 
Zurück