Skip to content
ListNodeRelative

ListNodeRelative

Description

Get the list node at signed offset ridx from base_node. Positive ridx walks forward through next pointers; negative walks backward through prev pointers. ridx == 0 returns base_node.

Parameters

Name Direction Description
base_node in Anchor node.
ridx in Signed relative offset.

Success

Returns the node at offset ridx.

Failure

Returns NULL when the offset walks past either end of the list.

Usage example (Cross-references)

Usage examples (Cross-references)
        GenericListNode *begin   = GENERIC_LIST_NODE(ListNodeBegin(&list));
        GenericListNode *end     = GENERIC_LIST_NODE(ListNodeEnd(&list));
        GenericListNode *same    = ListNodeRelative(ListNodeBegin(&list), 0);
        GenericListNode *rel_f2  = ListNodeRelative(ListNodeBegin(&list), 2);
        GenericListNode *rel_b2  = ListNodeRelative(ListNodeEnd(&list), -2);
        GenericListNode *end     = GENERIC_LIST_NODE(ListNodeEnd(&list));
        GenericListNode *same    = ListNodeRelative(ListNodeBegin(&list), 0);
        GenericListNode *rel_f2  = ListNodeRelative(ListNodeBegin(&list), 2);
        GenericListNode *rel_b2  = ListNodeRelative(ListNodeEnd(&list), -2);
        ListNode(int) *null_node = NULL;
        GenericListNode *same    = ListNodeRelative(ListNodeBegin(&list), 0);
        GenericListNode *rel_f2  = ListNodeRelative(ListNodeBegin(&list), 2);
        GenericListNode *rel_b2  = ListNodeRelative(ListNodeEnd(&list), -2);
        ListNode(int) *null_node = NULL;
        result = result && rel_f2 && ListNodeData(rel_f2) && (*(int *)ListNodeData(rel_f2) == 30);
        result = result && rel_b2 && ListNodeData(rel_b2) && (*(int *)ListNodeData(rel_b2) == 20);
        result = result && (ListNodeRelative(ListNodeBegin(&list), -1) == NULL);
        result = result && (ListNodeRelative(ListNodeEnd(&list), 1) == NULL);
        result = result && (ListNodeNext(null_node) == NULL);
        result = result && rel_b2 && ListNodeData(rel_b2) && (*(int *)ListNodeData(rel_b2) == 20);
        result = result && (ListNodeRelative(ListNodeBegin(&list), -1) == NULL);
        result = result && (ListNodeRelative(ListNodeEnd(&list), 1) == NULL);
        result = result && (ListNodeNext(null_node) == NULL);
        result = result && (ListNodePrev(null_node) == NULL);
    
    static bool test_list_node_relative_null_fails(void) {
        WriteFmt("Testing ListNodeRelative with NULL node\n");
    
        ListNodeRelative(NULL, 1);
        WriteFmt("Testing ListNodeRelative with NULL node\n");
    
        ListNodeRelative(NULL, 1);
        return false;
    }
Last updated on