PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C | Mit Insertion Sort eine Struktur sortieren.



Sector1379
07-12-2005, 21:59
Hallo

Ich stehe nun seit Stunden vor einem Problem. Ich soll per Insertion Sort eine Struktur sortieren. Die folgenden Aufbau hat:


struct liste{

char name[30],
vorname[30],
wohnort[30],
gebdat[30];

int matrikelnummer,
plz,
fachbereich;

}student[100];

Nun habe ich die Aufgabe eine Funktion zu schreiben die es möglich macht dem Benutzer wählen zu lassen nach welchen Kreterium er sortieren will.

zusätzlich muß ich diese Insertion Sort Funktion so abändern das es damit möglich ist die Struktur zu Sortieren.

Hier die Fuktion, ich habe aber schon ein paar Sachen eingebaut.
Aber leider ohne erfolg.

void insertionSort(int *studi, int anzahl) {

int i, x, j;

for (i = 1; i <= anzahl; i++) {

x = (int) studi;
j = i - 1;

while ((j >= 0) && (x < studi[j])) {

studi[j + 1] = studi[j];

j = j - 1;

}

studi[j + 1] = x;
}

return;
}

Und hier meine Auswahl Funktion so wie ich sie Aufbauen wollte:


void auswahl(int anzahl){

char wahl;

printf("\n Nach welchem Kreterium soll sortiert werden??\n");
printf("* (N)ame\n");
printf("* (V)orname\n");
printf("* (W)ohnort\n");
printf("* (G)eburtsdatum\n");
printf("* (M)atrikelnummer\n");
printf("* (P)ostleitzahl\n");
printf("* (F)achbereich\n");
printf("Bitte treffen sie Ihre Wahl:");
scanf("%s", &wahl);

switch(toupper(wahl)){

case 'N':
// insertionSort(&student->name,anzahl);
break;

case 'M':
insertionSort(&student->matrikelnummer,anzahl);
break;



}


}


Aber leider ist das auch nicht so ganz richtig was ich da an die Insertion Sort Funktion übergebe.

Hoffentlich kann mir jemand helfen, denn ich sehe zur Zeit den Wald vor lauter Bäumen nicht.

Gruß

Sector1379

RHBaum
08-12-2005, 13:16
Muss das C oder kann das C++ sein ?

Ups, steht ja C davor ^^

Deiner Sortfunktion uebergibst natuerlich den zeiger auf dein Array + Anzahl .
Und wenns geht irgend nen Index wonach sortiert werden soll ....

deine "Sortierfunktion" ist eigentlich immer gleich, das einzige was unterschiedlich ist, ist der vergleich zwischen 2 Objekten, und das musst geschickt abstrahieren, damit deine eigentliche Sortfunktion nur einmal schreiben brauchst ....

wie man das am besten unter C Macht ... k.A. unter C++ gibts da paar elegante sachen (funktoren).
Du kannst dir ne Vergleichfunktion schreiben, und nen Parameter mit uebergeben nach was verglichen wird, oder aber die vergleichfunktion mehrfach schreiben, und der sortierfunktion nen Funktionspointer mit uebergeben ....

int CompareStudents(const student * v1,const student * v2,char kriterium)
{
int ireturn = 0; /* -1 kleiner,0 gleich 1 groesser z.B. */
switch(kriterium)
{
case 'N':
ireturn = strncmp(v1.name,v2.name,30); /* weiss man ja das die 30 lang sind ^^ /*
break;
/* ... usw usf.
}
}


int insertionSort(student * Students, unsigned int anzahl, char kriterium)
{
int ireturn = 0;
if(anzahl) /* abfangen auf Null, sonst gibts aerger mitm compiler */
{
student * tempList = (student *) malloc(anzahl * sizeof(student)); /* temporaeres 2.tes array dynamisch erstellen, wo man reinsortieren kann ... */
memfill(tempList,0,anzahl * sizeof(student)); /* mit 0 initialisieren, ich bin halt paranoid ^^ */

/* todo - hier dein sortieralgorythmus implementieren , ich mach doch nich deine hausaufgaben ^^ */

memcpy(Students,tempList,anzahl * sizeof(student)); /* zum schluss alles ins alte array rueberkopieren und beten das kein fehler gemacht hast ^^ /*
free(tempList ); /* temp array loeschen */
}

return ireturn;
}

Vielleicht hilfts ja weiter .... so wuerd ich zumindest rangehen ^^


Ciao ....

Joghurt
08-12-2005, 15:57
@RHBaum


student * tempList = (student *) malloc(anzahl * sizeof(student)); /* temporaeres 2.tes array dynamisch erstellen, wo man reinsortieren kann ... */
memfill(tempList,0,anzahl * sizeof(student)); /* mit 0 initialisieren, ich bin halt paranoid ^^ */Dann kannst du auch gleich "calloc" statt "malloc" benutzen, das löscht den Speicher nämlich.

Sector1379
09-12-2005, 06:38
@RHBaum

Vielen vielen dank für deine Hilfe, ich habe heute Präsentation ich werde mal von mir hören lassen obs richtig war oder nicht. Ich habe noch ein paar Sachen aber anderes gemacht.


Also nochmals danke und ich Poste dann die Lösung heute Abend.

Gruß

Sector

RHBaum
09-12-2005, 08:15
>> Dann kannst du auch gleich "calloc" statt "malloc" benutzen, das löscht den Speicher nämlich.

Ich nehm an, Du meinst dass calloc den Allocierten speicher gleich mit 0-en initialisiert, wenn es den speicher gleich wieder loescht (freigibt) dan waer der Aufruf sinnlos ^^

Mit C kenn ich mich wie gesagt nich soo aus, also ich verwend in der Regel new und konstruktoren ^^
Bin ehrlich gesagt schon froh, das ich malloc kenne, beim malloc nich das casten aufn Typ vergesse und in letzter sekunde mich auch noch dran erinner, das den reinterpret_cast unter C nich so wirklich ne gute Idee ist ^^

Ciao ...