进入公司的第一个培训项目,就是用C语言实现双向链表.这是一个比较基础的,又是很常用的一个结构.在GTK+中,它会给你提供一个现成的.
以前在大学的时候,链表的理论知识经过数据结构的修炼之后,可谓是比较熟悉的,可是没有自己实现过,当老大给我布置这么一个任务的时候,我还是比较茫然的.因为自己太是菜鸟了.今天,我把这个链表写一下,回味和复习.
首先,你要明确链表要实现什么功能,一般就是插入、追加、遍历、删除、销毁等。然后就可以根据这么功能去实现。而且一个链表当中,不但可以插入数字的结点,还可以插入字符串的结点。下面通过代码来实现这么功能。
- dlist.h
- #ifndef _DLIST_H
- #define _DLIST_H
- typedef void* value_type
- typedef void (*ForeachFunc)(void* data, void* ctx);
- typedef void (*NodeDestroyFunc)(void* data, void* destroy_ctx);
- typedef struct _DList DList;
- typdef enum _Ret
- {
- RET_FALSE,
- RET_TRUE
- }Ret;
- DList* dlist_create();
- Ret dlist_append(DList* thiz, value_type data);
- Ret dlist_insert(DList* thiz, size_t index, value_type data);
- Ret dlist_delete(DList* thiz, size_t index, NodeDestroy node_destroy, void* ctx);
- Ret dlist_destroy(DList* thiz, NodeDestroy node_destroy, void* ctx);
- void dlist_foreach(DList* thiz, ForeachFunc print, void* ctx);
- endif /*_DList_H*/
下面是dlist.c的具体实现。
- dlist.c
- #include "dlist.h"
- #incluee <stdlib.h>
- #include <stdio.h>
- #include <assert.h>
- typedef struct _Node
- {
- value_type data;
- struct _Node* next;
- struct _Node* prev;
- }Node;
- struct _DList
- {
- Node* first;
- NodeDestroy node_destroy;
- };
- DList* dlist_create(NodeDestroy node_destroy)
- {
- DList* thiz = (DList*)malloc(sizeof(DList));
- thiz->node_destroy = node_destroy;
- thiz->first = NULL;
- return thiz;
- }
- static Node* dlist_find(DList* thiz, size_t index)
- {
- assert(thiz != NULL);
- Node* iter = thiz->first;
- while(index > 0)
- {
- iter = iter->next;
- index--;
- }
- return iter;
- }
- Ret dlist_append(DList* thiz, value_type)
- {
- assert(thiz != NULL);
- Node* node = (Node* )malloc(sizeof(Node));
- node->next = NULL;
- node->prev = NULL;
- if(thiz->first == NULL)
- {
- thiz->first = node;
- }
- else
- {
- Node* iter = thiz->first;
- while(iter->next != NULL)
- {
- iter = iter->next;
- }
- iter->next = node;
- node->prev = iter;
- }
- return RET_TRUE;
- }
-
- Ret dlist_insert(DList* thiz, size_t index, value_type data);
- Ret dlist_delete(DList* thiz, size_t index, NodeDestroy node_destroy, void* ctx);
- Ret dlist_destroy(DList* thiz, NodeDestroy node_destroy, void* ctx);
- void dlist_foreach(DList* thiz, ForeachFunc print, void* ctx);
由于要写的代码比较多,所以没有一一写出来,只是实现一部分。不过思路就是这样咯。