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. |