摘要:链表数据结构仿照源码,写个自己的链表中是链表内存开始位置存放元素长度下一个节点最后一个数据节点起始数据节点每一个元素的大小链表中,元素的最大存放个数申请的内存,是否已经分配满,如果满了,会申请新的大小的内存然后用作里面链接起来编译
nginx链表数据结构 仿照nginx源码,写个自己的链表
</>复制代码
#include "stdio.h"
#include
typedef unsigned char u_char;//windows 中 是 byte
typedef struct list_part_s list_part_t;
typedef struct list_s list_t;
struct list_part_s{
void * startpos; // 链表内存开始位置....
int length; //存放元素长度....
list_part_t* next; //下一个节点....
};
struct list_s{
list_part_t* last; //最后一个数据节点 ....
list_part_t start; //起始数据节点 ...
size_t size; //每一个元素的大小 ...
int max; //链表中,元素的最大存放个数 ...
};
list_t * list_create(int length,int size)
{
list_t* l;
l = (list_t* )malloc(sizeof(list_t));
if (l == NULL)return NULL;
l->start.startpos = malloc(length * size);
if (l->start.startpos == NULL)return NULL;
l->start.next = NULL;
l->start.length = 0;
l->last = &l->start;
l->size = size;
l->max = length;
return l;
}
void* list_push(list_t * l)
{
list_part_t* part;
u_char * m;
part = l->last;
if (part->length == l->max) //申请的内存,是否已经分配满,如果满了,会申请新的大小的内存.....................,然后用作next里面链接起来
{
part = malloc(sizeof(list_part_t));
if (part == NULL) return NULL;
part->startpos = malloc(l->max * l->size);
if (part->startpos == NULL)return NULL;
part->length = 0;
part->next = NULL;
l->last->next = part;
l->last = part;
}
m = (char *)part->startpos + l->size * part->length;
++(part->length);
return m;
}
void dump(list_t* l)
{
int tmp=0;
list_part_t* parttmp= & (l->start);
printf("--->list=%x
",l);
printf("---> .start=%x
",l->start);
printf("---> .last=%x
",l->last);
printf("---> .max=%x
",l->max);
printf("---> .size=%x
",l->size);
int i = 0;
do{
++i;
printf("==>part[%d]=%x
",i,parttmp);
printf("==>length=%d
",parttmp->length);
printf("==>startpos=%x
",parttmp->startpos);
printf("==>next=%x
",parttmp->next);
for(int j=0;jlength;++j){
memcpy(&tmp,(u_char*)parttmp->startpos + j*l->size,sizeof(int));
printf(" element:%x=%d~",(u_char*)parttmp->startpos + j*l->size,tmp);
}
printf("
");
}while( parttmp = parttmp->next );
}
int main(int argc,char ** argv)
{
list_t * list = list_create(10,sizeof(int));
int* tmp=0;
for(int i=245 ; i < 300; ++i)
{
tmp = list_push(list);
*tmp = i;
}
dump(list);
}
编译
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39156.html
摘要:上图中,每个红圈表示一个请求,每一层的请求分别是上一层请求的子请求。换而言之,父请求是依赖于子请求的。特别地,的子请求运行时,会阻塞父请求挂起其对应的协程。 张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护。Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的研究;曾为 ngx_lua 贡...
摘要:源代码路径版本主要作用分析提供了一种机制,帮助进行资源管理内存文件。用来标记该使用时分配失败次数。根据以上思路,可以很容易明白源码里关于创建链表的代码函数声明说明输入要分配的节点大小,返回一个的指针。 源代码路径 版本:1.8.0 srccoreNgx_palloc.h srccoreNgx_palloc.c 主要作用分析 提供了一种机制,帮助进行资源管理(内存、文件)。可以...
摘要:源文件路径版本主要作用分析是提供的双向链表。同时,由于这种链表没有节点成员变量,所以需要作为带有节点变量的结构体的成员变量存在,这种情况下,称这种链表为寄宿链表,链表所在结构体称为宿主。和常规的双向链表操作基本相同。 源文件路径 版本:1.8.0 srccoreNgx_queue.h srccoreNgx_queue.c 主要作用分析 ngx_queue_t是Nginx提供的...
阅读 2797·2021-11-15 11:37
阅读 2940·2021-09-23 11:21
阅读 3075·2021-09-07 10:11
阅读 3244·2019-08-30 15:53
阅读 2903·2019-08-29 15:13
阅读 1673·2019-08-26 13:57
阅读 1177·2019-08-26 12:23
阅读 2509·2019-08-26 11:51