C语言面向对象编程(五):单链表实现(二)

2014-11-23 20:15:39 · 作者: · 浏览: 55
if(pos < list->size) { int i = 0; struct slist_node * p = list->head; struct slist_node * prev = list->head; for(; i < pos; i++) { prev = p; p = p->next; } if(p == list->head) { /* replace at head */ node->next = list->head->next; list->head = node; } else { prev->next = node; node->next = p->next; } if(node->next == 0) list->tail = node; if(list->free_node) list->free_node(p); else free(p); } return list; } static struct slist_node * _find_by_key(struct single_list *list, void * key) { if(list->key_hit_test) { struct slist_node * p = list->head; while(p) { if(list->key_hit_test(p, key) == 0) return p; p = p->next; } } return 0; } static struct slist_node *_first_of(struct single_list* list) { return list->head; } static struct slist_node *_last_of(struct single_list* list) { return list->tail; } static struct slist_node *_node_at(struct single_list * list, int pos) { if(pos < list->size) { int i = 0; struct slist_node * p = list->head; for(; i < pos; i++) { p = p->next; } return p; } return 0; } static struct slist_node * _take_at(struct single_list * list, int pos) { if(pos < list->size) { int i = 0; struct slist_node * p = list->head; struct slist_node * prev = p; for(; i < pos ; i++) { prev = p; p = p->next; } if(p == list->head) { list->head = p->next; if(list->head == 0) list->tail = 0; } else if(p == list->tail) { list->tail = prev; prev->next = 0; } else { prev->next = p->next; } list->size--; p->next = 0; return p; } return 0; } static struct slist_node * _take_by_key(struct single_list * list, void *key) { if(list->key_hit_test) { struct slist_node * p = list->head; struct slist_node * prev = p; while(p) { if(list->key_hit_test(p, key) == 0) break; prev = p; p = p->next; } if(p) { if(p == list->head) { list->head = p->next; if(list->head == 0) list->tail = 0; } else if(p == list->
tail) { list->tail = prev; prev->next = 0; } else { prev->next = p->next; } list->size--; p->next = 0; return p; } } return 0; } static struct single_list *_remove_node(struct single_list * list, struct slist_node * node) { struct slist_node * p = list->head; struct slist_node * prev = p; while(p) { if(p == node) break; prev = p; p = p->next; } if(p) { if(p == list->head) { list->head = list->head->next; if(list->head == 0) list->tail = 0; } else if(p == list->tail) { prev->next = 0; list->tail = prev; } else { prev->next = p->next; } if(list->free_node) list->free_node(p); else free(p); list->size--; } return list; } static struct single_list *_remove_at(struct single_list *list, int pos) { if(pos < list->size) { int i = 0; struct slist_node * p = list->head; struct slist_node * prev = p; for(; i < pos ; i++) { prev = p; p = p->next; } if(p == list->head) { list->head = p->next; if(list->head == 0) list->tail = 0; } else if(p == list->tail) { list->tail = prev; prev->next = 0; } else { prev->next = p->next; } if(list->free_node) list->free_node(p); else free(p); list->size--; } return list; } static struct single_list *_remove_by_key(struct single_list *list, void *key) { if(list->key_hit_test) { struct slist_node * p = list->head; struct slist_node * prev = p; while(p) { if(list->key_hit_test(p, key) == 0) break; prev = p; p = p->next; } if(p) { if(p == list->head) { list->head = list->head->next; if(list->head == 0) list->tail = 0; } else if(p == list->tail) { prev->next = 0; list->tail = prev; } else { prev->next = p->next; } if(list->free_node) list->free_node(p); else free(p); list->size--; }