/* remove (*node_p) from (*list_p) */ void remove_List (List* list_p, Node* node_p) { Node *p; if (!(*list_p -> head -> key > *node_p -> key) || (*list_p -> tail -> key < *node_p -> key)){ p = search_List(list_p, *node_p -> key); if (p && p -> key == node_p -> key){ if ((p -> key == list_p -> head -> key) || (p -> key == list_p -> tail -> key) || p -> key == list_p -> mid -> key){ if (p -> key == list_p -> head -> key){ list_p -> head = list_p -> head -> next; p -> next -> prev = NULL; } if (p -> key == list_p -> tail -> key){ list_p -> tail = list_p -> tail -> prev; p -> prev -> next = NULL; } } else{ p -> prev -> next = p -> next; p -> next -> prev = p -> prev; free(p -> key); free(p); } list_p -> len --; /*if (list_p -> len % 2 == 1){ if (*list_p -> mid -> key > *node_p -> key) list_p -> mid = list_p -> mid -> next; } if (list_p -> len % 2 == 0){ if (*list_p -> mid -> key < *node_p -> key) list_p -> mid = list_p -> mid -> prev; }*/ } } }
/* returns node which has keyval */ Node *getNode_List (List *list_p, int keyval) { Node *p; if ( list_p -> head != 0 && list_p -> tail != 0){ if (!((*list_p -> head -> key > keyval) || (*list_p -> tail -> key < keyval))){ if (*list_p -> head -> key == keyval || *list_p -> tail -> key == keyval){ if (*list_p -> head -> key == keyval){ return list_p -> head;} else return list_p -> tail; } else{ p = search_List(list_p, keyval); if (keyval == *p -> key) return p; else if (keyval == *p -> next -> key) return p -> next; else return 0; } } } return 0; }
/* change key of (*node_p) into (keyval) */ void setKey_List (List* list_p, Node* node_p, int keyval) { Node *p; if (!(*list_p -> head -> key > *node_p -> key) || (*list_p -> tail -> key < *node_p -> key)){ p = search_List(list_p, *node_p -> key); if (p -> key == node_p -> key){ remove_List(list_p, node_p); *p -> key = keyval; insert_List(list_p, p-> key, p -> item); } } }
int main() { Link Head; Head=creat_List(Head); if(search_List(8, Head)) { printf("searchtime= %d", searchtime); } else printf("NO FIND!!"); if(Head!=NULL) free_List(Head); reuturn 0; }
/* create and insert a node having (*key_p) and (*item_p) to (*list_p) */ void insert_List (List* list_p, int* key_p, void* item_p) { Node *node; Node *p; if (list_p -> len == 0){ node = new_Node(NULL,NULL,key_p,item_p); list_p -> head = node; list_p -> tail = node; list_p -> mid = node; } else{ if ((*list_p -> head -> key > *key_p) || (*list_p -> tail -> key < *key_p)){ if (*list_p -> head -> key > *key_p){ node = new_Node(NULL, list_p -> head, key_p, item_p); list_p -> head -> prev = node; list_p -> head = node; } else{ node = new_Node(list_p -> tail, NULL, key_p, item_p); list_p -> tail -> next = node; list_p -> tail = node; } } else{ if (!(*list_p -> mid -> key < *key_p && *list_p -> mid -> next -> key > *key_p)){ p = search_List(list_p, *key_p); node = new_Node(p, p -> next, key_p, item_p); node -> next -> prev = node; node -> prev -> next = node; } else{ node = new_Node(list_p -> mid, list_p -> mid -> next, key_p, item_p); node -> next -> prev = node; node -> prev -> next = node; } } } list_p -> len ++; if (list_p -> len%2 == 1){ if (*list_p -> mid -> key < *key_p) list_p -> mid = list_p -> mid -> next; } else{ if (*list_p -> mid -> key > *key_p) list_p -> mid = list_p -> mid -> prev; } }