Saya mencoba membuat fungsi pengurutan gelembung universal. Ini memungkinkan pengguna untuk menulis fungsi perbandingan dan pertukarannya sendiri. Saya menerapkan fungsi pertukaran dan perbandingan untuk tipe int, tetapi ketika saya menjalankan kode untuk array berikutnya: {3, 5, 8, 9, 1, 2, 4, 7, 6, 0} , saya mendapatkan: 0 0 84214528 2312 1 2 4 7 6 0. Mengapa hal ini terjadi?
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
int compInt(void *a, void *b) // FUNCTION FOR COMPARE INT
{
if (*(int*)(a) > *(int*)(b)) { return false; } // IF FIRST INT > SECOND INT (WRONG ORDER) RETURN FALSE
return true; // RIGHT ORDER -> RETURN TRUE
}
Saya pikir masalahnya ada di swapInt.
void swapInt(void *a, void *b) // FUNCTION FOR SWAP INT
{
int aux; // TEMPORARY VARIABLE, IT STORAGES VALUE OF *(int*)(a)
aux = *(int*)(a);
*(int*)(a) = *(int*)(b); // a value is now equal to b value
*(int*)(b) = aux; // b has value of aux
}
void bubbleSort(void *address, int len, int (*comp)(void *a, void *b), void (*swap)(void *a, void *b)) // bubble sort function allow to user to write it's compare and swap function
{
int newlen;
while (len != 0) {
newlen = 0;
for (int i = 1; i < len; i++) {
if (!comp(address + i - 1, address + i)) {
swap(address + i - 1, address + i);
newlen = i;
}
}
len = newlen;
}
}
int main()
{
int array[] = {3, 5, 8, 9, 1, 2, 4, 7, 6, 0}; // CREATE AN ARRAY OF INT
int len = 10; // DECLARE IT LEN
void *address; // VOID POINTER TO ARRAY
address = array;
bubbleSort(address, len, &compInt, &swapInt); // SORT IT
for (int i = 0; i < len; ++i) {
printf("%d ", array[i]); // PRINT IT
}
return 0;
}
Terimakasih atas bantuannya!
address + i
denganaddress + i * elementSize
, jika tidak, alamat yang Anda dapatkan akan mengarah ke tengah elemen array. - person mephi42   schedule 02.09.2014true
danfalse
, lebih baik sertakan<stdbool.h>
dan gunakanbool
. - person ikh   schedule 02.09.2014size_t
. - person mephi42   schedule 02.09.2014