#include #include 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; iid_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; iid_len; i++) { if (self->id[i] == pID) self->id[i] = qID; } self->count--; return C_ERR_OK; }