Struktur sortieren?
-
Wie könnte ich am besten diese Struktur nach den Namen sortieren bzw ist das möglich?
struct Kunde { char Name[30]; char wohnort[30]; long postleitzahl; long postfach; long telefonnummer; }; struct Kunde FirmaA[20];
also vorher z.B.
Schulze Berlin 11586 68742 123457
Meier Berlin 11587 69874 123456
Anton Cottbus 45785 15548 1234568nach sortieren:
Anton Cottbus 45785 15548 1234568
Meier Berlin 11587 69874 123456
Schulze Berlin 11586 68741 123457
-
-
Mit quicksort
-
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
-
#define KUNDEN 20 #include <stdio.h> #include <string.h> #include <stdlib.h> // Hier tut Kuhsort stekkn tun ! struct Kunde { char Name[30]; char wohnort[30]; long postleitzahl; long postfach; long telefonnummer; }; struct Kunde k[KUNDEN]; int compare( const struct Kunde *p1, const struct Kunde *p2 ) { return strcmp( p1->Name, p2->Name ); } void zeig() { int i; for ( i = 0; i < KUNDEN; i++ ) { if ( strlen( k[i].Name ) ) { printf("%-35s %s %ld %ld %ld\n", k[i].Name, k[i].wohnort, k[i].postleitzahl, k[i].postfach, k[i].telefonnummer ); } } } int main() { memset( k, 0, KUNDEN * sizeof( struct Kunde ) ); strcpy(k[5].Name, "Gundula Schnattermeier"); strcpy(k[8].Name, "Brunhilde Olsebolse"); strcpy(k[12].Name, "Proggingmanie Offline"); strcpy(k[3].Name, "Tri tra trullalla"); strcpy(k[18].Name, "Fallerie und hopsasa"); strcpy(k[6].Name, "Rock N Roll"); puts("****************************************************************\n"); puts("Unsorted:\n"); zeig(); qsort( k, KUNDEN, sizeof( struct Kunde ), compare ); puts("\n****************************************************************\n"); puts("Sorted:\n"); zeig(); puts("");puts("");puts(""); puts("HAVE A NICE DAY !!!"); puts("");puts("");puts(""); return 0; }
-
Aber dann werden doch nur die Namen sortiert und nicht die anderen Daten (wohnort, postleitzahl..) die zum Namen dazugehören oder? Also meine das die restlichen Daten nicht mit dem Namen verschoben werden.
-
vaderle schrieb:
Aber dann werden doch nur die Namen sortiert und nicht die anderen Daten (wohnort, postleitzahl..) die zum Namen dazugehören oder?
vaderle schrieb:
Wie könnte ich am besten diese Struktur nach den Namen sortieren bzw ist das möglich?...
Das ist richtig. Ist ja auch im Sinne der Erfinders oder ?
Name: A Tel.Nr: 567
Name: Z Tel.Nr: 123Sonst würde ja die Telefonnummer 123, die zu dem Namen Z gehört, auf einmal zum Namen A gehören.
Was du noch ergänzen kannst, ist z.B. das du bei Namensgleichheit weitere Sortierkriterien in der compare-Funktion dazufügst.
-
Ne so meinte ich das nicht. Meinte das eher so
vorher:
Meier 123
Hans 789
Schulze 456danach:
Hans 123
Meier 789
Schulze 456Also das zwar die Namensstelle sortiert wird aber die Daten die noch dazugehören nicht mit dem Namen verschoben werden
Ach so und was macht dieses:
memset( k, 0, KUNDEN * sizeof( struct Kunde ) );
-
Die Zugehörigkeit der Daten bleibt bei den Strukturvariablen erhalten, lediglich die Aressen werden umkopiert.
Vorher:
Gundula Schnattermeier 123
Brunhilde Olsebolse 456Nachher:
Brunhilde Olsebolse 456
Gundula Schnattermeier 123Die memset-Funktion initialisiert alle Strukturvariablen mit 0 damit da kein Schrott drin steht.
-
Ah ok. Muss wohl noch bischen testen da er die Strukturdaten nach dem sortieren in eine txt datei zeilenweise schreibt und derzeit nur 0en drin stehen wenn ich vor dem schreiben in die txt Datei sortiere.
Und ich bekomm noch die Meldung:[Warning] passing arg 4 of `qsort' from incompatible pointer type
EDIT: Hab den Fehler selber schon gesehen. size_t num war bei mir größer als es eigentlich ist
Danke nochmal
-
Bei mir meckert der Compiler nicht.
Möglicherweise hast du bei deinem eine andere Einstellung ?
( Aufrufkonvention )
-
qsort() erwartet ja auch eine Funktion, die zwei void* übernimmt und keine 'struct Kunde*'. Korrekt sieht die compare()-Funktion so aus:
int compare(const void* p1, const void* p2 ) { struct Kunde *k1=p1,*k2=p2; return strcmp( k1->Name, k2->Name ); }
-
Ich hab mal noch ne Frage die Bezug auf die Sortierfunktion nimmt.
Ich habe ja jetzt eine sortierte Struktur wie z.B.
Hans 123
Meier 789
Schulze 456Nun hab ich bei meinen Programm auch die Möglichkeit einen Namen (inkl seiner Daten) zu "löschen". Das hab ich bei mir so gemacht das er die Struktur verläuft und wenn er den Namen findet das macht:
for (schleifenzaehlersuche = 0; schleifenzaehlersuche < 20; schleifenzaehlersuche++) { if (strcmp(Kundenadressen[schleifenzaehlersuche].firmenname,Suchfirmenname) == 0) { printf("\nDaten der Person wurden geloescht\n"); strcpy(Kundenadressen[schleifenzaehlersuche].name, ""); strcpy(Kundenadressen[schleifenzaehlersuche].wohnort, ""); Kundenadressen[schleifenzaehlersuche].postleitzahl = 0; Kundenadressen[schleifenzaehlersuche].postfach = 0; Kundenadressen[schleifenzaehlersuche].telefonnummer = 0; sortieren(); //Sortieren break; } }
Nach dem der Kunde entfernt wurde soll also wieder sortiert werden so das der leere Bereich ganz unten steht. Bei mir macht er das auch wenn ich den letzten "lösche" (siehe Beispiel oben: Schulze). Wenn ich aber z.B. Meier "lösche" dann "löscht" er auch gleichzeitig Schulze. Weiss jemand ob das dann am sortieren liegt oder an der Art wie ich den Kunden entferne?
-
Hab mal einfach nicht das gemacht "" sondern was reingeschrieben "TEST" und dann klappt das komischweise mit dem entfernen. Kann mir das zwar nicht erklären aber es funktioniert.
-
Vermutlich liegt's an biedem - der leere String (und damit auch dein gelöschter Datensatz) landet afaik ganz vorne in der Sortierung.
-
HI !
Ich würde die Struktur "richtig" löschen, dann brauchst du dir keinen Kopf um leere Strukturen zu machen.
Im Übrigen würde ich eine Nummer ( IDs ) für jeden Kunden vergeben. So wie es die Datenbanken machen.
Sonst kommt es früher oder später zu Namenskonflikten, nämlich wenn du zwei Meier in der Kundendatei hast.
-
Habs jetzt so gemacht das ich alle Kunden unter der gelöschten eins nach oben geschoben habe und die gesamtkundengröße um 1 verringert. Klappt auch super
-