结构体的两种声明方式:堆上和栈上以及在双链表的应用
生活随笔
收集整理的這篇文章主要介紹了
结构体的两种声明方式:堆上和栈上以及在双链表的应用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在看《算法精解:C語言描述》的雙鏈表chtbl和redis的雙鏈表adlist.c發(fā)現(xiàn)代碼思路基本是一致的。
但是,對于鏈表的初始化卻不一樣
1.《算法精解:C語言描述》風(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;
一開始定義結(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的時候傳遞結(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的時候在堆上動態(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;
說透一級指針和二級指以及(void**)&在雙鏈表中的應(yīng)用? [這里分析了雙鏈表的刪除]
總結(jié)
以上是生活随笔為你收集整理的结构体的两种声明方式:堆上和栈上以及在双链表的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下使用NetBeans调试li
- 下一篇: Linux守护进程实现