实现双向链表

来源:互联网 发布:access 输入多条数据 编辑:程序博客网 时间:2024/05/01 22:30

    进入公司的第一个培训项目,就是用C语言实现双向链表.这是一个比较基础的,又是很常用的一个结构.在GTK+中,它会给你提供一个现成的.

    以前在大学的时候,链表的理论知识经过数据结构的修炼之后,可谓是比较熟悉的,可是没有自己实现过,当老大给我布置这么一个任务的时候,我还是比较茫然的.因为自己太是菜鸟了.今天,我把这个链表写一下,回味和复习.

    首先,你要明确链表要实现什么功能,一般就是插入、追加、遍历、删除、销毁等。然后就可以根据这么功能去实现。而且一个链表当中,不但可以插入数字的结点,还可以插入字符串的结点。下面通过代码来实现这么功能。

    

  1. dlist.h
  2. #ifndef _DLIST_H
  3. #define _DLIST_H
  4. typedef void* value_type
  5. typedef void (*ForeachFunc)(void* data, void* ctx);
  6. typedef void (*NodeDestroyFunc)(void* data, void* destroy_ctx);
  7. typedef struct _DList DList;
  8. typdef enum _Ret
  9. {
  10.  RET_FALSE,
  11.  RET_TRUE
  12. }Ret;
  13. DList*   dlist_create();
  14. Ret        dlist_append(DList* thiz, value_type data);
  15. Ret        dlist_insert(DList* thiz, size_t index, value_type data);
  16. Ret        dlist_delete(DList* thiz, size_t index, NodeDestroy node_destroy, void* ctx);
  17. Ret        dlist_destroy(DList* thiz, NodeDestroy node_destroy, void* ctx);
  18. void       dlist_foreach(DList* thiz, ForeachFunc print, void* ctx);
  19. endif /*_DList_H*/

下面是dlist.c的具体实现。

 

  1. dlist.c 
  2. #include "dlist.h" 
  3. #incluee <stdlib.h> 
  4. #include <stdio.h> 
  5. #include <assert.h> 
  6. typedef struct _Node
  7. {
  8.   value_type data;
  9.   struct _Node* next;
  10.   struct _Node* prev;
  11. }Node;
  12. struct _DList
  13. {
  14.   Node* first;
  15.   NodeDestroy node_destroy;
  16. };
  17. DList* dlist_create(NodeDestroy node_destroy)
  18. {
  19.   DList* thiz = (DList*)malloc(sizeof(DList));
  20.   thiz->node_destroy = node_destroy;
  21.   thiz->first = NULL;
  22.   return thiz;
  23. }
  24. static Node* dlist_find(DList* thiz, size_t index)
  25. {
  26.   assert(thiz != NULL);
  27.   Node* iter = thiz->first;
  28.   
  29.   while(index > 0)
  30.   {
  31.     iter = iter->next;
  32.     index--;
  33.   }
  34.   
  35.   return iter;
  36. Ret dlist_append(DList* thiz, value_type)
  37. {
  38.   assert(thiz != NULL);
  39.   Node* node = (Node* )malloc(sizeof(Node));
  40.   node->next = NULL;
  41.   node->prev = NULL;
  42.   if(thiz->first == NULL)
  43.   {
  44.      thiz->first = node;
  45.   }
  46.   else
  47.   {
  48.      Node* iter = thiz->first;
  49.      while(iter->next != NULL)
  50.      {
  51.         iter = iter->next;
  52.      }
  53.      iter->next = node;
  54.      node->prev = iter;
  55.   }
  56.   
  57.   return RET_TRUE;
  58. }
  59. Ret       dlist_insert(DList* thiz, size_t index, value_type data);
  60. Ret       dlist_delete(DList* thiz, size_t index, NodeDestroy node_destroy, void* ctx);
  61. Ret       dlist_destroy(DList* thiz, NodeDestroy node_destroy, void* ctx);
  62. void      dlist_foreach(DList* thiz, ForeachFunc print, void* ctx);

由于要写的代码比较多,所以没有一一写出来,只是实现一部分。不过思路就是这样咯。

 

原创粉丝点击