/*在单链表中找到第一个含item值的节点并删除此节点*/ void *slist_delete(slist_t *l,void *item) { list_node_t *cur,*prev; int (*comp)(const void *,const void *); comp=l->comp; if(l->head) { prev=NULL; cur=l->head; while(cur){ int cmp_res=comp(item,cur->item); if(cmp_res==0){ break; } else { prev=cur; cur=cur->next; } } if(cur==NULL){ //该键值不存在 return NULL; } else { if(prev==NULL) return slist_pop_front(l); else { prev->next=cur->next; void *res_item=cur->item; free(cur); l->n--; return res_item; } } } else { return NULL; } }
int main() { int data[LOOP]; int i, res; int* p; struct slist_t* sl; sl = slist_init(); assert(sl); for (i = 0; i < LOOP; ++ i) { data[i] = rand() % LOOP; res = slist_push_front(sl, &data[i]); assert(0 == res); res = slist_push_back(sl, &data[i]); assert(0 == res); } printf("list count=%d\n", slist_count(sl)); for (i = LOOP-1; i >= 0; -- i) { res = slist_find(sl, &data[i]); assert(0 == res); p = slist_pop_front(sl); assert(p == &data[i]); p = slist_pop_back(sl); assert(p == &data[i]); res = slist_find(sl, &data[i]); assert(res < 0); } printf("list count=%d\n", slist_count(sl)); slist_release(sl); sl = 0; return 0; }
static curlc_t* _curlp_client_alloc(curlp_t* cp) { if (!cp || !cp->free_list) return NULL; if (slist_size(cp->free_list) > 0) { curlc_t* cc = slist_pop_front(cp->free_list); return cc; } cp->size ++; curlc_t* cc = curlc_create(); if (cc) { hash_insert(cp->clients, cc); } return cc; }
struct curl_client_t* _curl_pool_client_alloc(curl_pool_t* cp) { struct curl_client_t* cc = NULL; if (!cp || !cp->free_list) { return NULL; } if (slist_count(cp->free_list) > 0) { cc = slist_pop_front(cp->free_list); return cc; } cp->size ++; cc = curl_client_init(); if (cc) { hash_insert(cp->clients, cc); } return cc; }
int test_base_slist(const char* param) { struct slist_t* sl = slist_create(); if (!sl) { fprintf(stderr, "slist create fail\n"); return -1; } rand_seed(time(NULL)); int loop = param ? atoi(param) : 32; int data[loop]; for (int i = 0; i < loop; ++ i) { data[i] = (int)(rand_gen()) % loop; int res = slist_push_front(sl, &data[i]); CHECK(sl, res == 0, "slist push front fail"); res = slist_push_back(sl, &data[i]); CHECK(sl, res == 0, "slist push back fail"); } CHECK(sl, slist_size(sl) == 2 * loop, "slist size fail"); for (int i = loop - 1; i >= 0; -- i) { int res = slist_find(sl, &data[i]); CHECK(sl, res == 0, "slist find fail"); void* p = slist_pop_front(sl); CHECK(sl, p == &data[i], "slist pop front fail"); p = slist_pop_back(sl); CHECK(sl, p == &data[i], "slist pop back fail"); res = slist_find(sl, &data[i]); CHECK(sl, res < 0, "slist find fail"); } CHECK(sl, slist_size(sl) == 0, "slist size fail"); slist_release(sl); return 0; }