Пример #1
0
/** get item and remove it from any position
 */
void* list_remove (linked_list* _this, int position) {
    // list is empty
    if (_this->size == 0) {
        //NODE_DBG("LinkedList#_remove: The list is empty.");
        return NULL;
    } else if (position >= _this->size) {
        // out of bound
        //NODE_DBG("LinkedList#_remove: Index out of bound");
        return NULL;
    }

    // remove from head
    if (position == 0) {
        return list_remove_first(_this);
    } else if (position+1 == _this->size) {
        // remove from tail
        return list_remove_last(_this);
    } else {
       node* n = _this->head;
       node* prev;
       node* next;
        int i = 0;
        void* item;
        // loop until position
        while (i < position) {
            n = n->next;
            i++;
        }
        item = n->item;
        // remove node from list
        prev = n->prev;
        next = n->next;
        prev->next = next;
        next->prev = prev;
        os_free(n);
        _this->size--;
        return item ;
    }
}
Пример #2
0
int main()
{
    list* list1 = list_create();
    list* list2 = list_create();
    list* list3 = list_create();

    int data[] = {1, 2, 3, 4, 5};
    char* strings[] = {"a", "b", "c", "d", "e", "f"};

    int data_size = 5;
    for(int i = 0; i < data_size; i++) {
        list_append(list1, &data[i]);
    }

    int string_size = 6;
    for(int i = 0; i < string_size; i++) {
        list_append(list2, strings[i]);
    }

    iterator* iter1 = iter_create(list1);

    printf("Data List Print Test....\n");

    printf("Data List: ");
    while(!iter_at_end(iter1)) {
        node* n = iter_get(iter1);
        int* val = n->data;
        printf("%d ", *val);
        iter_advance(iter1);
    }
    printf("\n");

    printf("Removing 2nd Element From Data\n");
    iter1 = iter_create(list1);
    iter_advance(iter1);
    iter_remove(iter1);

    printf("Data List: ");
    while(!iter_at_end(iter1)) {
        node* n = iter_get(iter1);
        int* val = n->data;
        printf("%d ", *val);
        iter_advance(iter1);
    }
    printf("\n");

    printf("\n");
    printf("String List Print Test.......\n");

    iterator* iter2 = iter_create(list2);

    printf("Strings List: ");
    while(!iter_at_end(iter2)) {
        node* n = iter_get(iter2);
        char* val = n->data;
        printf("%s ", val);
        iter_advance(iter2);
    }
    printf("\n");

    list_remove_last(list2);

    iter2 = iter_create(list2);
    printf("Removing Last Element from String List\n");
    printf("Strings List: ");
    while(!iter_at_end(iter2)) {
        node* n = iter_get(iter2);
        char* val = n->data;
        printf("%s ", val);
        iter_advance(iter2);
    }
    printf("\n");

    printf("\n");
    printf("Done Printing\n");

    return 0;
}
Пример #3
0
void test_list(void)
{
    int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    list me = list_init(sizeof(int));
    assert(me);
    assert(list_size(me) == 0);
    assert(list_is_empty(me));
    for (int i = 0; i < 10; i++) {
        list_add_first(me, &val[i]);
        assert(list_size(me) == i + 1);
        int get = 0;
        list_get_first(&get, me);
        assert(get == val[i]);
    }
    assert(list_size(me) == 10);
    assert(!list_is_empty(me));
    int get_arr[10] = {0};
    list_copy_to_array(get_arr, me);
    for (int i = 0; i < 10; i++) {
        int get = 0;
        list_get_at(&get, me, i);
        assert(get == val[9 - i]);
        assert(get_arr[i] == val[9 - i]);
    }
    for (int i = 0; i < 7; i++) {
        list_remove_last(me);
    }
    int trimmed[5] = {0};
    list_copy_to_array(trimmed, me);
    assert(list_size(me) == 3);
    for (int i = 0; i < 3; i++) {
        assert(10 - i == trimmed[i]);
    }
    int add = 3;
    list_add_last(me, &add);
    add = -1;
    list_add_at(me, 1, &add);
    add = -2;
    list_add_last(me, &add);
    assert(list_size(me) == 6);
    int get = 0xdeadbeef;
    list_get_first(&get, me);
    assert(get == 10);
    get = 0xdeadbeef;
    list_get_at(&get, me, 0);
    assert(get == 10);
    list_get_at(&get, me, 1);
    assert(get == -1);
    list_get_at(&get, me, 2);
    assert(get == 9);
    list_get_at(&get, me, 3);
    assert(get == 8);
    list_get_at(&get, me, 4);
    assert(get == 3);
    list_get_at(&get, me, 5);
    assert(get == -2);
    get = 0xdeadbeef;
    list_get_last(&get, me);
    assert(get == -2);
    list_remove_first(me);
    list_remove_at(me, 2);
    list_remove_last(me);
    assert(list_size(me) == 3);
    get = 345;
    list_get_first(&get, me);
    assert(get == -1);
    list_get_at(&get, me, 1);
    assert(get == 9);
    list_get_last(&get, me);
    assert(get == 3);
    int set = 12;
    list_set_first(me, &set);
    set = 13;
    list_set_at(me, 1, &set);
    set = 14;
    list_set_last(me, &set);
    int arr[3] = {0};
    list_copy_to_array(arr, me);
    assert(arr[0] == 12);
    assert(arr[1] == 13);
    assert(arr[2] == 14);
    set = -5;
    list_set_at(me, 0, &set);
    set = -6;
    list_set_at(me, 1, &set);
    set = -7;
    list_set_at(me, 2, &set);
    list_copy_to_array(arr, me);
    assert(arr[0] == -5);
    assert(arr[1] == -6);
    assert(arr[2] == -7);
    assert(list_set_at(me, 4, &set) == -EINVAL);
    assert(list_get_at(&set, me, 4) == -EINVAL);
    assert(list_remove_at(me, 4) == -EINVAL);
    assert(list_add_at(me, 5, &set) == -EINVAL);
    assert(list_set_at(me, -1, &set) == -EINVAL);
    assert(list_get_at(&set, me, -1) == -EINVAL);
    assert(list_remove_at(me, -1) == -EINVAL);
    assert(list_add_at(me, -1, &set) == -EINVAL);
    list_clear(me);
    assert(list_size(me) == 0);
    assert(list_is_empty(me));
    assert(list_remove_first(me) == -EINVAL);
    assert(list_remove_last(me) == -EINVAL);
    me = list_destroy(me);
    assert(!me);
}
Пример #4
0
Файл: hlist.c Проект: hailongz/c
hany list_pop(hlist_t list,InvokeTickDeclare){
    hany v = list_last(list, InvokeTickArg);
    list_remove_last(list, InvokeTickArg);
    return v;
}
Пример #5
0
void
slipS_collapse(slip_Stack* stack){
	void* p = list_remove_last(GET_LIST_NODE(stack->block_head));
	free(p);
	stack->stack_size -= BLOCK_SIZE;
}  /* 塌缩栈, 减少一个Block, 建议在空余空间大于BLOCK_SIZE*2的时候塌缩 */