Chinaunix首页 | 论坛 | 博客
  • 博客访问: 256753
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-24 07:45
个人简介

生活就像海洋,只有意志坚强的人,才能到达彼岸。

文章存档

2013年(52)

分类: C/C++

2013-08-15 18:03:18

1>双向链表的定义

    在单链表的结点中增加一个指向其前驱的的pre指针。

2>双向链表的操作

a、创建链表,b、销毁链表,c、获取链表长度,d、清空链表,e、获取第pos个元素操作,

f、插入元素到位置pos,g、删除位置pos处的元素。

3>双向链表的插入操作

current->next = node;

node->next = next;

next->pre = node;

node->pre = current;

4>双向链表的删除操作

current->next = next;

next-pre = current;


5>双向链表的新操作

    *获取当前游标指向的数据元素

    *将游标重置指向链表中的第一个数据元素

    *将游标移动指向到链表中的下一个数据元素

    *将游标移动指向到链表中的上一个数据元素

    *直接指定删除链表中的某个数据元素

DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);

DLinkListNode* DLinkList_Reset(DLinkList* list);

DLinkListNode* DLinkList_Current(DLinkList* list);

DLinkListNode* DLinkList_Next(DLinkList* list);

DLinkListNode* DLinkList_Pre(DLinkList* list);

点击(此处)折叠或打开

  1. /***************************************************************/
  2. /*DLinkList.h*/

  3. #ifndef _DLINKLIST_H_
  4. #define _DLINKLIST_H_

  5. typedef void DLinkList;
  6. typedef struct _tag_DLinkListNode DLinkListNode;
  7. struct _tag_DLinkListNode
  8. {
  9.     DLinkListNode* next;
  10.     DLinkListNode* pre;
  11. };

  12. DLinkList* DLinkList_Create();

  13. void DLinkList_Destroy(DLinkList* list);

  14. void DLinkList_Clear(DLinkList* list);

  15. int DLinkList_Length(DLinkList* list);

  16. int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos);

  17. DLinkListNode* DLinkList_Get(DLinkList* list, int pos);

  18. DLinkListNode* DLinkList_Delete(DLinkList* list, int pos);

  19. DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);

  20. DLinkListNode* DLinkList_Reset(DLinkList* list);

  21. DLinkListNode* DLinkList_Current(DLinkList* list);

  22. DLinkListNode* DLinkList_Next(DLinkList* list);

  23. DLinkListNode* DLinkList_Pre(DLinkList* list);

  24. #endif

  25. /******************************************************************************/

  26. /*DLinkList.c*/

  27. #include <stdio.h>
  28. #include <malloc.h>
  29. #include "DLinkList.h"

  30. typedef struct _tag_DLinkList
  31. {
  32.     DLinkListNode header;
  33.     DLinkListNode* slider;
  34.     int length;
  35. } TDLinkList;

  36. DLinkList* DLinkList_Create() // O(1)
  37. {
  38.     TDLinkList* ret = (TDLinkList*)malloc(sizeof(TDLinkList));
  39.     
  40.     if( ret != NULL )
  41.     {
  42.         ret->length = 0;
  43.         ret->header.next = NULL;
  44.         ret->header.pre = NULL;
  45.         ret->slider = NULL;
  46.     }
  47.     
  48.     return ret;
  49. }

  50. void DLinkList_Destroy(DLinkList* list) // O(1)
  51. {
  52.     free(list);
  53. }

  54. void DLinkList_Clear(DLinkList* list) // O(1)
  55. {
  56.     TDLinkList* sList = (TDLinkList*)list;
  57.     
  58.     if( sList != NULL )
  59.     {
  60.         sList->length = 0;
  61.         sList->header.next = NULL;
  62.         sList->header.pre = NULL;
  63.         sList->slider = NULL;
  64.     }
  65. }

  66. int DLinkList_Length(DLinkList* list) // O(1)
  67. {
  68.     TDLinkList* sList = (TDLinkList*)list;
  69.     int ret = -1;
  70.     
  71.     if( sList != NULL )
  72.     {
  73.         ret = sList->length;
  74.     }
  75.     
  76.     return ret;
  77. }

  78. int DLinkList_Insert(DLinkList* list, DLinkListNode* node, int pos) // O(n)
  79. {
  80.     TDLinkList* sList = (TDLinkList*)list;
  81.     int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
  82.     int i = 0;
  83.     
  84.     if( ret )
  85.     {
  86.         DLinkListNode* current = (DLinkListNode*)sList;
  87.         DLinkListNode* next = NULL;
  88.         
  89.         for(i=0; (i<pos) && (current->next != NULL); i++)
  90.         {
  91.             current = current->next;
  92.         }
  93.         next = current->next;
  94.         current->next = node;
  95.         node->next = next;
  96.         
  97.         if( next != NULL )
  98.         {
  99.             next->pre = node;    
  100.         }
  101.         
  102.         node->pre = current;
  103.         
  104.         if( sList->length == 0)
  105.         {
  106.             node->pre = NULL;
  107.             sList->slider = node;    
  108.         }
  109.         
  110.         sList->length++;
  111.     }
  112.     
  113.     return ret;
  114. }

  115. DLinkListNode* DLinkList_Get(DLinkList* list, int pos) // O(n)
  116. {
  117.     TDLinkList* sList = (TDLinkList*)list;
  118.     DLinkListNode* ret = NULL;
  119.     int i = 0;
  120.     
  121.     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
  122.     {
  123.         DLinkListNode* current = (DLinkListNode*)sList;
  124.         
  125.         for(i=0; i<pos; i++)
  126.         {
  127.             current = current->next;
  128.         }
  129.         
  130.         ret = current->next;
  131.     }
  132.     
  133.     return ret;
  134. }

  135. DLinkListNode* DLinkList_Delete(DLinkList* list, int pos) // O(n)
  136. {
  137.     TDLinkList* sList = (TDLinkList*)list;
  138.     DLinkListNode* ret = NULL;
  139.     int i = 0;
  140.     
  141.     if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
  142.     {
  143.         DLinkListNode* current = (DLinkListNode*)sList;
  144.         DLinkListNode* next = NULL;
  145.         
  146.         for(i=0; i<pos; i++)
  147.         {
  148.             current = current->next;
  149.         }
  150.         
  151.         ret = current->next;
  152.         next = ret->next;
  153.         
  154.         current->next = next;
  155.         
  156.         if( next != NULL )
  157.         {
  158.             next->pre = current;
  159.             
  160.             if( current == (DLinkListNode*)sList )
  161.             {
  162.                 next->pre = NULL;    
  163.             }    
  164.         }
  165.         
  166.         if(sList->slider == ret)
  167.         {
  168.             sList->slider = next;    
  169.         }
  170.         
  171.         sList->length--;
  172.     }
  173.     
  174.     return ret;
  175. }
  176. DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node)
  177. {
  178.     TDLinkList* sList = (TDLinkList*)list;
  179.     DLinkListNode* ret = NULL;
  180.     int i = 0;
  181.     
  182.     if( sList != NULL)
  183.     {
  184.         DLinkListNode* current = (DLinkListNode*)sList;
  185.         
  186.         for(i=0; i<sList->length; i++)
  187.         {
  188.             if(current->next == node)
  189.             {
  190.                 ret = current->next;
  191.                 break;    
  192.             }    
  193.             
  194.             current = current->next;
  195.         }    
  196.         
  197.         if(ret != NULL)
  198.         {
  199.             DLinkList_Delete(sList,i);    
  200.         }
  201.     }
  202.     
  203.     return ret;
  204. }

  205. DLinkListNode* DLinkList_Reset(DLinkList* list)
  206. {
  207.     TDLinkList* sList = (TDLinkList*)list;
  208.     DLinkListNode* ret = NULL;
  209.     
  210.     if( sList != NULL )
  211.     {
  212.         sList->slider = sList->header.next;
  213.         ret = sList->slider;    
  214.     }
  215.     
  216.     return ret;
  217. }

  218. DLinkListNode* DLinkList_Current(DLinkList* list)
  219. {
  220.     TDLinkList* sList = (TDLinkList*)list;
  221.     DLinkListNode* ret = NULL;
  222.     
  223.     if( sList != NULL )
  224.     {
  225.         ret = sList->slider;    
  226.     }
  227.     
  228.     return ret;
  229. }

  230. DLinkListNode* DLinkList_Next(DLinkList* list)
  231. {
  232.     TDLinkList* sList = (TDLinkList*)list;
  233.     DLinkListNode* ret = NULL;
  234.     
  235.     if( (sList != NULL) && (sList->slider != NULL) )
  236.     {
  237.         ret = sList->slider;
  238.         sList->slider = ret->next;    
  239.     }
  240.     
  241.     return ret;
  242. }

  243. DLinkListNode* DLinkList_Pre(DLinkList* list)
  244. {
  245.     TDLinkList* sList = (TDLinkList*)list;
  246.     DLinkListNode* ret = NULL;
  247.     
  248.     if( (sList != NULL) && (sList->slider != NULL) )
  249.     {
  250.         ret = sList->slider;
  251.         sList->slider = ret->pre;    
  252.     }
  253.     
  254.     return ret;
  255. }

  256. /***************************************************************/
  257. /*main.c*/

  258. #include <stdio.h>
  259. #include <stdlib.h>
  260. #include "DLinkList.h"
  261. /* run this program using the console pauser or add your own getch, system("pause") or input loop */

  262. struct Value
  263. {
  264.     DLinkListNode header;
  265.     int v;
  266. };

  267. int main(int argc, char *argv[])
  268. {
  269.     int i = 0;
  270.     DLinkList* list = DLinkList_Create();
  271.     
  272.     struct Value* pv = NULL;
  273.     struct Value v1;
  274.     struct Value v2;
  275.     struct Value v3;
  276.     struct Value v4;
  277.     struct Value v5;
  278.     
  279.     v1.v = 1;
  280.     v2.v = 2;
  281.     v3.v = 3;
  282.     v4.v = 4;
  283.     v5.v = 5;
  284.     
  285.     DLinkList_Insert(list,(DLinkListNode*)&v1,DLinkList_Length(list));
  286.     DLinkList_Insert(list,(DLinkListNode*)&v2,DLinkList_Length(list));
  287.     DLinkList_Insert(list,(DLinkListNode*)&v3,DLinkList_Length(list));
  288.     DLinkList_Insert(list,(DLinkListNode*)&v4,DLinkList_Length(list));
  289.     DLinkList_Insert(list,(DLinkListNode*)&v5,DLinkList_Length(list));
  290.     
  291.     for(i=0; i<DLinkList_Length(list); i++)
  292.     {
  293.         pv = (struct Value*)DLinkList_Get(list,i);
  294.         
  295.         printf("%d\n", pv->v);    
  296.     }
  297.     
  298.     printf("\n");
  299.     
  300.     DLinkList_Delete(list, DLinkList_Length(list)-1);
  301.     DLinkList_Delete(list,0);
  302.     
  303.     for(i=0; i<DLinkList_Length(list); i++)
  304.     {
  305.         pv = (struct Value*)DLinkList_Next(list);
  306.         
  307.         printf("%d\n", pv->v);    
  308.     }

  309.     printf("\n");
  310.     
  311.     DLinkList_Reset(list);
  312.     DLinkList_Next(list);
  313.     
  314.     pv = (struct Value*)DLinkList_Current(list);
  315.     
  316.     printf("%d\n",pv->v);
  317.     printf("\n");
  318.     
  319.     DLinkList_DeleteNode(list,(DLinkListNode*)pv);
  320.     
  321.     pv = (struct Value*)DLinkList_Current(list);
  322.     
  323.     printf("%d\n",pv->v);
  324.     
  325.     printf("\n");
  326.     
  327.     DLinkList_Pre(list);
  328.     
  329.     pv = (struct Value*)DLinkList_Current(list);
  330.     
  331.     printf("%d\n",pv->v);
  332.     
  333.     DLinkList_Destroy(list);
  334.     
  335.     return 0;
  336. }
双向链表在单链表的基础上增加了指向前驱的指针,功能上双向链表可以完全取代单链表的使用,双向链表的Next,pre和Current操作可

以高效的遍历表中的所有元素

阅读(1737) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~