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