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;
}
Beispiel #2
0
//向任意指定的位置插入新节点
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");
}
Beispiel #4
0
 message&
 message::push_head(const void* p, size_t size)
 {
     return push_head(element(p, size));
 }
Beispiel #5
0
 message&
 message::push_head(const std::string& data)
 {
     return push_head(element(data));
 }
Beispiel #6
0
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;
}