46 lines
1.1 KiB
C
46 lines
1.1 KiB
C
#include <c_QuickFindUF.h>
|
|
#include <c_Memory.h>
|
|
|
|
|
|
c_err_t c_QuickFindUF_Init(c_QuickFindUF_t* self, c_size_t n) {
|
|
if (!self || n==0) return C_ERR_PARAM;
|
|
self->count = n;
|
|
self->id_len = n;
|
|
self->id = C_ALLOC(sizeof(c_size_t) * n);
|
|
if (!self->id) {
|
|
return C_ERR_NOMEM;
|
|
}
|
|
for (c_size_t i=0; i<self->id_len; i++) {
|
|
self->id[i] = i;
|
|
}
|
|
return C_ERR_OK;
|
|
}
|
|
|
|
void c_QuickFindUF_Destroy(c_QuickFindUF_t* self) {
|
|
C_FREE(self->id);
|
|
self->count = 0;
|
|
self->id_len = 0;
|
|
}
|
|
|
|
c_size_t c_QuickFindUF_Find(c_QuickFindUF_t* self, c_size_t index) {
|
|
if (!self || self->id==NULL || index>=self->id_len) {
|
|
return (c_size_t)-1;
|
|
}
|
|
return self->id[index];
|
|
}
|
|
|
|
c_err_t c_QuickFindUF_Union(c_QuickFindUF_t* self, c_size_t p, c_size_t q) {
|
|
if (self == NULL || self->id == NULL) return C_ERR_PARAM;
|
|
if (p >= self->id_len || q >= self->id_len) return C_ERR_PARAM;
|
|
|
|
c_size_t pID = self->id[p];
|
|
c_size_t qID = self->id[q];
|
|
if (pID==qID) return C_ERR_OK;
|
|
for (c_size_t i=0; i<self->id_len; i++) {
|
|
if (self->id[i] == pID) self->id[i] = qID;
|
|
}
|
|
self->count--;
|
|
return C_ERR_OK;
|
|
}
|
|
|