void node_insert_ordered(List *list, int expire_time, int name){ if (list->first_node->expire_time < expire_time){ list_insert_begin(list, expire_time, name); } else if(list->first_node->expire_time > expire_time && list->first_node->next == NULL){ node_insert_after(list->first_node, expire_time, name); } else{ Node *node = list->first_node->next; Node *prev_node = list->first_node; while (node != NULL){ if(node->expire_time < expire_time){ node_insert_after(prev_node, expire_time, name); break; } prev_node = node; node = node->next; } if(node == NULL){ node_insert_after(prev_node, expire_time, name); } } }
int main() { struct node* head = head_init(); int i; for(i=0; i<5; i++) { node_add(head, i); } printf_list(head); node_del(head, 3); printf_list(head); node_insert_after(head,2,6); printf_list(head); node_insert_before(&head,0,5); printf_list(head); node_insert_before(&head,6,8); printf_list(head); node_reverse(&head); printf_list(head); node_reverse_by_test(&head); printf_list(head); struct node* p = search_mid_node(head); printf("mid=%d\n", p->data); /* delete head emlement */ Remove_head(&head); printf_list(head); for(i=7; i<10; i++) { node_add(head, i); } printf_list(head); p = search_mid_node(head); printf("mid=%d\n", p->data); return 0; }
/** * Inserts the node at index of a linked list */ bool node_insert_middle(Node **head, void *new_data, int index) { bool result = false; if (head && *head && index >= 0) { Node *temp = *head, *prev_temp = NULL; int i = 0; while (i < index && temp) { i++; prev_temp = temp; temp = temp->next; } //Found the index will be insert if (temp && i == index) { if (prev_temp == NULL) { // Insert at begin of linked list node_insert_first(head, new_data); } else { node_insert_after(prev_temp, new_data); } result = true; } } return result; }
static void split_node(struct btree_s *tree, struct bnode_s *node, int child_pos) { struct bnode_s *nnode = alloc_node(tree->max_key_nr, tree->max_child_nr); struct bnode_s *onode = node->child[child_pos]; #define COPY(dst, src, pos, len) \ do { \ int i; \ for (i = 0; i < len; i++) { \ dst[i] = src[pos+i]; \ } \ } while (0) /* 拷贝一半的节点到新的节点, 先算出要拷贝的位置与个数 */ int key_begin_pos = tree->min_key_nr+1; int key_copy_nr = tree->min_key_nr; int child_begin_pos = LEFT_CHILD_OF_KEY(key_begin_pos); int child_copy_nr = key_copy_nr + 1; COPY(nnode->key, onode->key, key_begin_pos, key_copy_nr); COPY(nnode->child, onode->child, child_begin_pos, child_copy_nr); nnode->nkeys = tree->min_key_nr; nnode->leaf = onode->leaf; /* 向父节点插入新的节点与孩子 */ int key = onode->key[tree->min_key_nr]; key_insert_before(node, RIGHT_KEY_OF_CHILD(child_pos), key); node_insert_after(node, child_pos, nnode); node->nkeys++; /* 调整原来的节点 */ onode->nkeys = tree->min_key_nr; }
void list_insert_front (linked_list_t list, node_t node) { node_insert_after (list->data, node); list->count++; }