2016-04-07 8 views
3

Für unser Praxisblatt müssen wir eine Struktur erstellen, die Flussdaten verwendet. Die Struktur ist:Verwenden von qsort() und Structs in C

struct river 
{ 
    char name[40]; //name of river max 40 char long 
    int length; 
    int drainage_area; 
} 

Und die Daten soll von der größten zur kleinsten Flusslänge organisiert werden unter Verwendung einer Datei mit dem Namen data.txt. Diese Datei hat die folgenden Informationen:

Nil 6650 334900

Amazon 6400 6915000

Yangtze 6300 1800000

Mississippi-Missouri 6275 2980000

Jenissei-Angara-Selenga 5539 2580000

Gelb 5464 745000

Ob-Irtysch 5410 2990000

Kongo-Chambeshi 4700 3680000

Ich weiß also, die Funktion qsort für die Verwendung von(), benötigen Sie eine Vergleichsfunktion. Allerdings bin ich mir nicht sicher, wie ich das machen soll, wenn eine Datei involviert ist. Ich habe folgendes für die Vergleichsfunktion (allgemeine Vergleichsfunktion):

int compare_rivers(void *r1, void *r2) 
{ 
    int *_r1 = (int *)r1; 
    int *_r2 = (int *)r2; 

    if(*_r1 > *_r2) 
    { 
     return -1; 
    } 
    if (*_r1 == *_r2) 
    { 
     return 0; 
    } 

    return 1; 
} 

Meine Frage ist: Wie implementieren die Funktion vergleichen und dann die Haupt? Ich weiß, wie man Dateien öffnet und liest, aber ist das anders als die Verwendung von Arrays?

Eine Erklärung wäre wirklich hilfreich! Ich frage nicht nach einem vollwertigen Code. Ich möchte nur eine Erklärung/ein Beispiel, wie ich das machen würde! Danke im Voraus!

Antwort

4

Sie müssen zuerst die Datei in den Speicher einlesen. Speichern Sie es als (unsortiertes) Array von Strukturen.

Wahrscheinlich möchten Sie dieses Array (?) Nicht sortieren, weil es "große Daten" enthält. Ok in diesem Fall ist es wirklich nicht, aber nach allem, was ich weiß, könnte es der Zweck der Aufgabe sein, dies zu erkennen. qsort wird viele Daten mischen, wenn Sie ganze Strukturen sortieren.

So können Sie parallel zu diesem Array ein Array von Strukturzeigern erstellen, die jeweils auf ein Strukturelement des unsortierten Arrays zeigen.

Wenden Sie qsort auf dieses Array von Zeigern. Die Vergleichsfunktion sollte die Form haben

int (*compar)(const void* obj1, const void* obj2) 

Aber beachten Sie, dass seit Sie ein Array von Zeigern sind Sortier-, qsort werden Sie tatsächlich die Adresse auf einen Zeiger übergeben.Sie müssen also etwas tun wie:

const struct river* r1 = *(const struct river**)obj1; 

Dann vergleichen Sie den Inhalt in einer sinnvollen Weise.

2

Wenn Sie die Datei im Speicher als ein Array von Struct River halten, erhält die Vergleichsfunktion zwei struct Flusszeiger als Parameter. Also, werfe diese zuerst und mache dann deine Vergleichslogik.

struct river rivers[10]; // filled with the file 

qsort(rivers, 10, sizeof *rivers, compare_rivers); 

    int compare_rivers(const void *r1, const void *r2) 
    { 
     const struct river*_r1 = (const struct river *)r1; 
     const struct river*_r2 = (const struct river*)r2; 

     // do compare logic 
    }