Sortier algorythmus für char[] wie weiter???



  • Ich hab folgenden sortier-algorythmus geschrieben jedoch funktioniert dieser nicht ganz so wie er soll, und zwar sollen die datensätze nach Autor sortiert werden (Autor mit A als erstes b als zweites usw.) wenn jetzt die Autoren gleich lauten dann soll nach Titel sortiert werden

    ich hab jedoch keine plan wie ???

    hier der Code

    struct DATE
    {
    	int tag;
    	int monat;
    	int jahr;
    };
    struct PERSON
    {
    	char vorname[15];
    	char nachname[15];
    	DATE gebdat;
    };
    struct BUCH
    {
    	char titel[25];
    	PERSON Autor;
    	char verlag[25];
    	char isbn[15];
    	float preis;
    	bool geloescht;
    };
    
    void sortieren(char dateiname[])
    { 
    	FILE *datei;
    	BUCH *b;
    	long datensaetze_in_datei, j=0, i=0;
    	char modus[] = "r+b";
    	int gleich;
    
    	datei = datei_oeffnen(dateiname, modus);
    	datensaetze_in_datei = datei_groesse_festlegen(datei);
    	b = (BUCH*)malloc(datensaetze_in_datei*GROESSE);
    	rewind(datei);
    	if(b)
    	{
    		rewind(datei);
    		fread(b,GROESSE,datensaetze_in_datei,datei);
    		while (j<datensaetze_in_datei-1)
    		{
    			i=j+1;
    			while (i<datensaetze_in_datei)
    			{
    				if (strcmp(b[j].Autor.vorname, b[i].Autor.vorname) && strcmp(b[j].Autor.nachname, b[i].Autor.nachname))
    				{
    					if(b[j].titel > b[i].titel)
    					{
    						tauschen(b[j], b[i]);
    					}
    				}
    				else
    				{
    					tauschen(b[j],b[i]);
    				}
    				i++;
    			}
    			j++;
    		}
    		rewind(datei);
    		if(!fwrite(b, GROESSE, datensaetze_in_datei, datei))
    	 	{
    			printf("Die Datensaetze konnte nicht in die Datei eingetragen werden\n");
    			getch();
    		}
    		else
    		{
    			printf("\nDie Datensaetze wurden erfolgreich in die Datei eingetragen!");
    			getch();
    		}
    		free(b);
    	}
    	else
    	{
    		if(datensaetze_in_datei == 0)
    		{
    			printf("\nEs sind keine Datensaetze vorhanden");
    		}
    		else
    		{
    			printf("\nEs ist nicht genügend Speicher vorhanden");
    		}
    	}
    	fclose(datei);
    }
    void tauschen(BUCH &b1,BUCH &b2)
    {
    	BUCH b;
    
    	b=b1;
    	b1=b2;
    	b2=b;
    }
    

    Also könnt ihr mir helfen, ich kenn mich mit quicksort und den ganzen kram nicht wirklich aus, und der sinn ist ja einen eigenen zu schreiben auch wenn er noch so primitiv ist, nur ich weiß nicht wie ich diesen schreiben soll.

    lg



  • int cmpbuch(BUCH* lhs, BUCH* rhs)
    {
        int c;
        if( c = strcmp( lhs->Autor.Nachname, rhs->Autor.Nachname ) ) return c;
        if( c = strcmp( lhs->Autor.vorname, rhs->Autor.Vorname ) ) return c;
        return strcmp( lhs->titel, rhs->titel );
    }
    

    anzuwenden wie ein ein normales strcmp.

    oder in c++

    bool operator<(BUCH& lhs, BUCH& rhs)
    {
        if( int c = strcmp( lhs.Autor.Nachname, rhs.Autor.Nachname ) ) return c < 0;
        if( int c = strcmp( lhs.Autor.vorname, rhs.Autor.Vorname ) ) return c < 0;
        return strcmp( lhs.titel, rhs.titel ) < 0;
    }
    bool operator>(BUCH& lhs, BUCH& rhs)
    {
        return rhs < lhs;
    }
    

    wobei du in c++ besser strings verwendest.



  • werd ich ausprobieren 🙂 danke


Anmelden zum Antworten