003
25.03.2004, 21:04 Uhr
(un)wissender
Niveauwart
|
Extrem gesaut, Kinder, bitte nicht nachmachen! C ist *schüttel*!
Ich verändere alles, aber du hast es ja nicht anders gewollt . Elegant wäre es, die aktuelle Größe über einen Rückgabewert zu übertragen, nicht über den Pointer, der dann die eigentlich Länge nicht mehr speichert, aber sei es drum, C-Leute stehen wohl auf sowas, immer Russisch-Roulette spielen .
C++: |
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>
void initialisieren(int *pwert, int *anzahl); void ausgabe(int *pwert, int *anzahl); void eliminieren(int *ptr, int *anzahl); int compare(const void *, const void *);
main() { int anzahl = 30; int werte[anzahl]; initialisieren(werte,&anzahl); ausgabe(werte,&anzahl); eliminieren(werte,&anzahl); /*<<< diese Funktion ist gesucht*/ ausgabe(werte,&anzahl); } void initialisieren(int *pwert, int *anzahl) { int *ptr; srand(time(NULL)); for(ptr=pwert;ptr<(pwert+*anzahl);ptr++) *ptr = rand()%10; }
void ausgabe(int *pwert, int *anzahl) { int *ptr; for(ptr=pwert;ptr<(pwert+*anzahl);ptr++) printf("%d ",*ptr);
printf("\n"); }
void eliminieren(int *ptr, int *anzahl) { int counter = 0, akt_value, * temp, counter2 = 0; temp = (int *)malloc(*anzahl * sizeof(int)); qsort(ptr, *anzahl, sizeof(int), &compare); do { temp[counter2++] = ptr[counter]; akt_value = ptr[counter]; while(++counter < *anzahl && akt_value == ptr[counter]); } while(counter < *anzahl); memcpy(ptr, temp, counter2 * sizeof(int)); *anzahl = counter2; free(temp); }
int compare(const void *one, const void *two) { int o1 = *((int *)one), o2 = *((int *)two); if(o1 < o2) return -1; if(o1 == o2) return 0; return 1; }
|
Bearbeitung: |
Ich hoffe, dass das valider C-Code ist, sehe gerade, dass ich das ganze als C++ kompiliert habe...
|
-- Wer früher stirbt ist länger tot. Dieser Post wurde am 25.03.2004 um 21:06 Uhr von (un)wissender editiert. |