UdpClient* Client::udpClientById(int udpClientId) { UdpClients::iterator i = std::find_if(udpClients.begin(), udpClients.end(), compare_fun(&UdpClient::getId, udpClientId)); return (i != udpClients.end()) ? *i : 0; }
mybtree* huffman_tree(frequency **f, int len, int (*compare_fun)(void*, void*)) { // let f be a min heap int i = 0; mybtree **heap = (mybtree**)malloc(len * sizeof(mybtree*)); for(i = 0; i < len; i++) heap[i] = mybtree_new(f[i]); int son = 0; int parent = 0; mybtree *temp; for(i = 0; i < len; i++){ son = i; parent = (son - 1) / 2; while(parent >= 0 && compare_fun(heap[son]->value, heap[parent]->value) < 0){ SWAP(heap[son], heap[parent], temp); son = parent; parent = (son - 1) / 2; } } // get min 2 value and create a tree // left 0, right 1, and right smaller than left mybtree *root = heap[0]; frequency *fre; son = 1; parent = 0; while(len > 1){ fre = (frequency*)malloc(sizeof(frequency)); fre->symbol = NULL; fre->weight = 0; root = mybtree_new(fre); for(i = 0; i < 2; i++){ SWAP(heap[0], heap[len - 1], temp); len--; if(i == 0) root->right = heap[len]; else root->left = heap[len]; fre->weight += ((frequency*)heap[len]->value)->weight; // re-heap parent = 0; son = parent * 2 + 1; while(son < len){ if(son < len - 1 && compare_fun(heap[son]->value, heap[son + 1]->value) > 0) son++; if(compare_fun(heap[parent]->value, heap[son]->value) < 0) break; SWAP(heap[parent], heap[son], temp); parent = son; son = parent * 2 + 1; } } heap[len] = root; len++; son = len - 1; parent = (son - 1) / 2; while(parent >= 0 && compare_fun(heap[son]->value, heap[parent]->value) < 0){ SWAP(heap[son], heap[parent], temp); son = parent; parent = (son - 1) / 2; } } root = heap[0]; free(heap); return root; }