摘要:鏈表數(shù)據(jù)結(jié)構(gòu)仿照源碼,寫個(gè)自己的鏈表中是鏈表內(nèi)存開始位置存放元素長(zhǎng)度下一個(gè)節(jié)點(diǎn)最后一個(gè)數(shù)據(jù)節(jié)點(diǎn)起始數(shù)據(jù)節(jié)點(diǎn)每一個(gè)元素的大小鏈表中,元素的最大存放個(gè)數(shù)申請(qǐng)的內(nèi)存,是否已經(jīng)分配滿,如果滿了,會(huì)申請(qǐng)新的大小的內(nèi)存然后用作里面鏈接起來編譯
nginx鏈表數(shù)據(jù)結(jié)構(gòu) 仿照nginx源碼,寫個(gè)自己的鏈表
#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; // 鏈表內(nèi)存開始位置.... int length; //存放元素長(zhǎng)度.... list_part_t* next; //下一個(gè)節(jié)點(diǎn).... }; struct list_s{ list_part_t* last; //最后一個(gè)數(shù)據(jù)節(jié)點(diǎn) .... list_part_t start; //起始數(shù)據(jù)節(jié)點(diǎn) ... size_t size; //每一個(gè)元素的大小 ... int max; //鏈表中,元素的最大存放個(gè)數(shù) ... }; 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) //申請(qǐng)的內(nèi)存,是否已經(jīng)分配滿,如果滿了,會(huì)申請(qǐng)新的大小的內(nèi)存.....................,然后用作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;j length;++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); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39156.html
摘要:上圖中,每個(gè)紅圈表示一個(gè)請(qǐng)求,每一層的請(qǐng)求分別是上一層請(qǐng)求的子請(qǐng)求。換而言之,父請(qǐng)求是依賴于子請(qǐng)求的。特別地,的子請(qǐng)求運(yùn)行時(shí),會(huì)阻塞父請(qǐng)求掛起其對(duì)應(yīng)的協(xié)程。 張超:又拍云系統(tǒng)開發(fā)高級(jí)工程師,負(fù)責(zé)又拍云 CDN 平臺(tái)相關(guān)組件的更新及維護(hù)。Github ID: tokers,活躍于 OpenResty 社區(qū)和 Nginx 郵件列表等開源社區(qū),專注于服務(wù)端技術(shù)的研究;曾為 ngx_lua 貢...
摘要:源代碼路徑版本主要作用分析提供了一種機(jī)制,幫助進(jìn)行資源管理內(nèi)存文件。用來標(biāo)記該使用時(shí)分配失敗次數(shù)。根據(jù)以上思路,可以很容易明白源碼里關(guān)于創(chuàng)建鏈表的代碼函數(shù)聲明說明輸入要分配的節(jié)點(diǎn)大小,返回一個(gè)的指針。 源代碼路徑 版本:1.8.0 srccoreNgx_palloc.h srccoreNgx_palloc.c 主要作用分析 提供了一種機(jī)制,幫助進(jìn)行資源管理(內(nèi)存、文件)。可以...
摘要:源文件路徑版本主要作用分析是提供的雙向鏈表。同時(shí),由于這種鏈表沒有節(jié)點(diǎn)成員變量,所以需要作為帶有節(jié)點(diǎn)變量的結(jié)構(gòu)體的成員變量存在,這種情況下,稱這種鏈表為寄宿鏈表,鏈表所在結(jié)構(gòu)體稱為宿主。和常規(guī)的雙向鏈表操作基本相同。 源文件路徑 版本:1.8.0 srccoreNgx_queue.h srccoreNgx_queue.c 主要作用分析 ngx_queue_t是Nginx提供的...
閱讀 2353·2021-11-15 11:37
閱讀 2627·2021-09-23 11:21
閱讀 2953·2021-09-07 10:11
閱讀 3165·2019-08-30 15:53
閱讀 2827·2019-08-29 15:13
閱讀 1608·2019-08-26 13:57
閱讀 1100·2019-08-26 12:23
閱讀 2441·2019-08-26 11:51