void AdaptiveHuffmanTree<type>::new_symbol(InternalSymbol symbol) { assert(list_head->symbol == NYT_SYMBOL); Node * symbol_node = get_node(symbol); push_head(symbol_node); Node * new_nyt_node = get_node(NYT_SYMBOL); push_head(new_nyt_node); Node * old_nyt_node = location[NYT_SYMBOL]; assert(old_nyt_node != nullptr && old_nyt_node->left == nullptr && old_nyt_node->right == nullptr); old_nyt_node->symbol = INTERNAL; new_nyt_node->parent = symbol_node->parent = old_nyt_node; old_nyt_node->left = new_nyt_node; old_nyt_node->right = symbol_node; location[symbol] = symbol_node; location[NYT_SYMBOL] = new_nyt_node; }
//向任意指定的位置插入新节点 void insert(List *plist, int data, int pos) { //1.判断坐标是否合法 if(pos < 0 || pos > size(plist)) { //printf("坐标不合法, 元素%d插入失败\n", data); //return; //pos = 0; //默认插入到链表的头节点位置 pos = size(plist); //默认插入到尾部 } //2.处理pos=0时的情况 if(0 == pos) { push_head(plist, data); return; } //3.处理pos=size(plist)时的情况 if(size(plist) == pos) { push_tail(plist, data); return; } //4.创建新节点 Node *pn = create_node(data); //5.处理pos=pos时的情况 Node *pt = plist->head; int i = 0; for(i = 1; i < pos; i++) { //将比pos = 1多出来的next跑光 pt = pt->next; } pn->next = pt->next; pt->next = pn; //6.节点个数加1 ++plist->cnt; }
static void test_vector_push_head_with_strings(void) { using string = mtr::string; using vector = mtr::vector<string>; const char str1[] = "Hello world"; const char str2[] = "Goodbye"; const char str3[] = "Cruel world"; vector v = vector(string(str1)); SHOULD_BE_EQ((int) v.length(), 1, "Length of vector"); auto x = v.push_head(string(str2)); SHOULD_BE_EQ((int) x.length(), 2, "Length of vector"); auto y = x.push_head(string(str3)); SHOULD_BE_EQ((int) y.length(), 3, "Length of vector"); auto it = y.iterator(); SHOULD_BE_EQ(it(), string(str3), "First string should be the first one appended to vector"); SHOULD_BE_EQ(it.next()(), string(str2), "Second string should be the second one appended to vector"); SHOULD_BE_EQ(it.next().next()(), string(str1), "Third string should be the third one appended to vector"); }
message& message::push_head(const void* p, size_t size) { return push_head(element(p, size)); }
message& message::push_head(const std::string& data) { return push_head(element(data)); }
int main() { //创建单链表, 并且初始化 List list; list.head = NULL; list.tail = NULL; list.cnt = 0; printf("%s\n", empty(&list) ? "空" : "没空"); printf("%s\n", full(&list) ? "满" : "没满"); printf("链表中有%d个元素\n", size(&list)); printf("----------------\n"); push_head(&list, 11); travel(&list); push_head(&list, 22); travel(&list); push_head(&list, 33); travel(&list); printf("链表中有%d个元素\n", size(&list)); printf("----------------\n"); push_tail(&list, 44); travel(&list); push_tail(&list, 55); travel(&list); push_tail(&list, 66); travel(&list); printf("链表中有%d个元素\n", size(&list)); printf("----------------\n"); insert(&list, 77, -2); printf("链表中有%d个元素\n", size(&list)); travel(&list); insert(&list, 88, 0); printf("链表中有%d个元素\n", size(&list)); travel(&list); insert(&list, 99, 5); printf("链表中有%d个元素\n", size(&list)); travel(&list); insert(&list, 100, 2); printf("链表中有%d个元素\n", size(&list)); travel(&list); printf("--------------------\n"); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); printf("--------------------\n"); pop_head(&list); printf("链表中有%d个元素\n", size(&list)); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); printf("--------------------\n"); pop_tail(&list); printf("链表中有%d个元素\n", size(&list)); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); printf("--------------------\n"); del(&list, -2); travel(&list); del(&list, 0); travel(&list); del(&list, 4); travel(&list); del(&list, 1); travel(&list); del(&list, 2); travel(&list); del(&list, 7); travel(&list); printf("--------------------\n"); reverse_list(&list); printf("链表中有%d个元素\n", size(&list)); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); travel(&list); printf("--------------------\n"); reverse_travel_list(&list); printf("=====清空========\n"); clear(&list); return 0; }