首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线程池 - 链表

2012-09-20 
线程池 -- 链表(1)constant.h文件用来存放全局的宏定义和方法?#include linked_list.h#include stdio.h

线程池 -- 链表

(1)constant.h文件

用来存放全局的宏定义和方法

?

#include "linked_list.h"#include <stdio.h>#define DUG_LINKED_LIST  0//链表中的节点typedef struct element_t element_t;struct element_t{element_t *next;element_t *pre;void *data;};element_t * element_create(void *data){element_t *e=malloc_thing(element_t);e->next=NULL;e->pre=NULL;e->data=data;return e;}void element_destroy(element_t *e){    free(e);}//私有链表的结构typedef struct private_linked_list_t private_linked_list_t;struct private_linked_list_t{                  linked_list_t public; //对外接口  element_t *first;     //首元素  element_t *last;     //尾元素                  u_int32_t count;     //元素个数};static element_t* remove_element(private_linked_list_t *this,element_t *e){element_t *next, *previous;next = e->next;previous = e->pre;free(e);if (next){next->pre = previous;}else{this->last = previous;}if (previous){previous->next = next;}else{this->first = next;}if (--this->count == 0){this->first = NULL;this->last = NULL;}return next;}static void insert_first(private_linked_list_t *this,void *item){         element_t *e=element_create(item);         if(this->count==0)         {   this->first=e;   this->last=e;         }  else  {         element_t *old=this->first;         e->next=old;         old->pre=e;  this->first=e;  }  this->count++;}static void insert_last(private_linked_list_t *this,void *item){         element_t *e=element_create(item);         if(this->count==0)         {   this->first=e;   this->last=e;         }  else  {         element_t *old=this->last;         e->pre=old;         old->next=e;  this->last=e;  }  this->count++;}static void * find_first(private_linked_list_t *this){       if(this->count==0)       {               return NULL;       } else {        return this->first->data; }}static void * find_last(private_linked_list_t *this){        if(this->count==0)       {               return NULL;       } else {        return this->last->data; }}static void * find_at(private_linked_list_t *this,linked_list_match_t match,void *item,void *p1,void *p2,void *p3){       element_t *e=this->first;       while(e)       {               if((match&&match(e->data,p1,p2,p3))||(!match&&e->data==item))               {                       return e->data;               }        e=e->next;       }       return NULL;}static  status_t  remove_first(private_linked_list_t *this,void **item){        if(this->count==0)        {                *item=NULL;                return NOT_FOUND;        } else {        *item=this->first->data; remove_element(this, this->first);return SUCCESS; } } static status_t remove_last(private_linked_list_t *this,void **item){         if(this->count==0)        {                *item=NULL;                return NOT_FOUND;        } else {        *item=this->last->data; remove_element(this, this->last);return SUCCESS; }} static status_t remove_at(private_linked_list_t *this,linked_list_match_t match,void **item,void *p1,void *p2,void *p3){       element_t *e=this->first; *item=NULL;       while(e)       {               if((match&&match(e->data,p1,p2,p3))||(!match&&e->data== *item))               {                       #if  DUG_LINKED_LIST == 1    printf("linked_list_t => revove_at : find the element");  #endif                       *item=e->data;                       remove_element(this, e);                       return SUCCESS;               }        e=e->next;       }#if  DUG_LINKED_LIST == 1printf("linked_list_t => revove_at : not  find the element");#endif       return NOT_FOUND;}u_int32_t get_count(private_linked_list_t *this){          return this->count;}void destroy(private_linked_list_t *this){          void *item;  #if  DUG_LINKED_LIST == 1printf("linked_list_t => destroy\n");  #endif   while(remove_last(this, &item)==SUCCESS);      free(this);}linked_list_t * linked_list_create(){private_linked_list_t *this=malloc_thing(private_linked_list_t);this->public.insert_first=(void (*)(linked_list_t *,void *))insert_first;this->public.insert_last=(void (*)(linked_list_t *,void *))insert_last;                this->public.find_first=(void * (*)(linked_list_t *))find_first;this->public.find_last=(void * (*)(linked_list_t *))find_last;this->public.find_at=(void * (*)(linked_list_t *,linked_list_match_t,void *,...))find_at;                this->public.remove_first=( status_t  (*)(linked_list_t *,void **))remove_first;this->public.remove_last=( status_t  (*)(linked_list_t *,void **))remove_last;this->public.remove_at=( status_t  (*)(linked_list_t *,linked_list_match_t,void **,...))remove_at;                this->public.get_count=(u_int32_t (*)(linked_list_t *))get_count;                this->public.destroy=(void (*)(linked_list_t *))destroy;                this->count=0;this->first=NULL;this->last=NULL;return &this->public;}

?

热点排行