日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

结构体的两种声明方式:堆上和栈上以及在双链表的应用

發(fā)布時(shí)間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构体的两种声明方式:堆上和栈上以及在双链表的应用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在看《算法精解:C語(yǔ)言描述》的雙鏈表chtbl和redis的雙鏈表adlist.c發(fā)現(xiàn)代碼思路基本是一致的。

但是,對(duì)于鏈表的初始化卻不一樣


1.《算法精解:C語(yǔ)言描述》風(fēng)格

/*****************************************************************************
*                                                                            *
*  Define a structure for doubly-linked list elements.                       *
*                                                                            *
*****************************************************************************/typedef struct DListElmt_ {void               *data;
struct DListElmt_  *prev;
struct DListElmt_  *next;} DListElmt;/*****************************************************************************
*                                                                            *
*  Define a structure for doubly-linked lists.                               *
*                                                                            *
*****************************************************************************/typedef struct DList_ {int                size;int                (*match)(const void *key1, const void *key2);
void               (*destroy)(void *data);DListElmt          *head;
DListElmt          *tail;} DList;


一開(kāi)始定義結(jié)構(gòu)體在棧上分配內(nèi)存,后面?zhèn)鬟f結(jié)構(gòu)體地址

int main(int argc, char **argv) {DList              list;
DListElmt          *element;int                *data,i;/*****************************************************************************
*                                                                            *
*  Initialize the doubly-linked list.                                        *
*                                                                            *
*****************************************************************************/dlist_init(&list, free);


init的時(shí)候傳遞結(jié)構(gòu)體指針,直接賦值

void dlist_init(DList *list, void (*destroy)(void *data)) {/*****************************************************************************
*                                                                            *
*  Initialize the list.                                                      *
*                                                                            *
*****************************************************************************/list->size = 0;
list->destroy = destroy;
list->head = NULL;
list->tail = NULL;return;}

2.Redis的風(fēng)格

init的時(shí)候在堆上動(dòng)態(tài)分配內(nèi)存,返回結(jié)構(gòu)體指針

/* Create a new list. The created list can be freed with* AlFreeList(), but private value of every node need to be freed* by the user before to call AlFreeList().** On error, NULL is returned. Otherwise the pointer to the new list. */
list *listCreate(void)
{struct list *list;if ((list = zmalloc(sizeof(*list))) == NULL)return NULL;list->head = list->tail = NULL;list->len = 0;list->dup = NULL;list->free = NULL;list->match = NULL;return list;
}

typedef struct listNode {struct listNode *prev;struct listNode *next;void *value;
} listNode;typedef struct list {listNode *head;listNode *tail;void *(*dup)(void *ptr);void (*free)(void *ptr);int (*match)(void *ptr, void *key);unsigned long len;
} list;


說(shuō)透一級(jí)指針和二級(jí)指以及(void**)&在雙鏈表中的應(yīng)用? [這里分析了雙鏈表的刪除]

總結(jié)

以上是生活随笔為你收集整理的结构体的两种声明方式:堆上和栈上以及在双链表的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。