不学网

 找回密码
 立即注册

只需一步,快速开始

手机号码,快捷登录

查看: 376|回复: 0

[c/c++] [C数据结构]循环链表

[复制链接]
j2cat 发表于 2018-1-6 19:12:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
CList.h
  1. #ifndef _CLIST_H_
  2. #define _CLIST_H_

  3. typedef struct _tag_CListNode TCListNode;
  4. typedef void CList;

  5. struct _tag_CListNode {
  6.         TCListNode* next;
  7. };

  8. CList* Clist_create(void);

  9. void Clist_free(CList* list);

  10. void Clist_clear(CList* list);

  11. int Clist_length(CList* list);

  12. int Clist_insert(CList* list, TCListNode* node, int pos);

  13. TCListNode* Clist_node_get(CList* list, int pos);

  14. TCListNode* Clist_node_del(CList* list, int pos);

  15. TCListNode* Clist_current(CList* list);

  16. TCListNode* Clist_next(CList* list);

  17. TCListNode* Clist_deletenode(CList* list, TCListNode* node);

  18. TCListNode* Clist_reset(CList* list);


  19. #endif
复制代码
CList.c
  1. #include "CList.h"
  2. #include <malloc.h>

  3. typedef struct _tag_CList {
  4.         TCListNode header;
  5.         TCListNode* slider;
  6.         int length;
  7. }TCList;

  8. CList* Clist_create(void) {
  9.         TCList* clist = (TCList*)malloc(sizeof(TCList));
  10.         if (NULL != clist) {
  11.                 clist->header.next = NULL;
  12.                 clist->slider = NULL;
  13.                 clist->length = 0;
  14.         }

  15.         return clist;
  16. }

  17. void Clist_free(CList* list) {
  18.         free(list);
  19. }

  20. void Clist_clear(CList* list) {
  21.         TCList* clist = (TCList*)list;
  22.         if (NULL != clist) {
  23.                 clist->header.next = NULL;
  24.                 clist->slider = NULL;
  25.                 clist->length = 0;
  26.         }
  27. }

  28. int Clist_length(CList* list) {
  29.         TCList* clist = (TCList*)list;
  30.         int ret = -1;
  31.         if (NULL != clist) {
  32.                 ret = clist->length;
  33.         }

  34.         return ret;
  35. }

  36. int Clist_insert(CList* list, TCListNode* node, int pos) {
  37.         TCList* clist = (TCList*)list;
  38.         int ret = (NULL != clist) && (0 <= pos) && (NULL != node);

  39.         if (ret) {
  40.                 TCListNode* current = (TCListNode*)clist;

  41.                 for (int i = 0; i < pos && NULL != current->next; i++) {
  42.                         current = current->next;
  43.                 }
  44.                 node->next = current->next;
  45.                 current->next = node;

  46.                 //当链表为初始时
  47.                 if (0 == clist->length) {
  48.                         clist->slider = node;
  49.                 }//当插入元素为头插入时
  50.                 if(current == (TCListNode*)clist){
  51.                         TCListNode* last = Clist_node_get(list, clist->length);
  52.                         last->next = current->next;
  53.                 }
  54.                 clist->length++;

  55.         }
  56.         return ret;
  57. }

  58. TCListNode* Clist_node_get(CList* list, int pos) {
  59.         TCList* clist = (TCList*)list;
  60.         TCListNode* ret = NULL;
  61.         if (NULL != clist && 0 <= pos) {
  62.                 TCListNode* current = (TCListNode*)clist;
  63.                 for (int i = 0; i < pos; i++) {
  64.                         current = current->next;
  65.                 }
  66.                 ret = current->next;
  67.         }

  68.         return ret;
  69. }

  70. TCListNode* Clist_node_del(CList* list, int pos) {
  71.         TCList* clist = (TCList*)list;
  72.         TCListNode* ret = NULL;
  73.         int i = 0;
  74.         if ((clist != NULL) && (pos >= 0) && (0 < clist->length))
  75.         {
  76.                 TCListNode* current = (TCListNode*)clist;
  77.                 TCListNode* first = clist->header.next;
  78.                 TCListNode* last = NULL;

  79.                 for (i = 0; i<pos; i++)
  80.                 {
  81.                         current = current->next;
  82.                 }

  83.                 ret = current->next;
  84.                 current->next = ret->next;
  85.                 clist->length--;

  86.                 if (first == ret)
  87.                 {
  88.                         last = (TCListNode*)Clist_node_get(clist, clist->length - 1);
  89.                         clist->header.next = ret->next;
  90.                         last->next = ret->next;
  91.                 }

  92.                 if (clist->slider == ret)
  93.                 {
  94.                         clist->slider = ret->next;
  95.                 }

  96.                 if (clist->length == 0)
  97.                 {
  98.                         clist->header.next = NULL;
  99.                         clist->slider = NULL;
  100.                 }
  101.         }

  102.         return ret;
  103. }

  104. TCListNode* Clist_current(CList* list) {
  105.         TCList* clist = (TCList*)list;
  106.         TCListNode* ret = NULL;

  107.         if (NULL != clist) {
  108.                 ret = clist->slider;
  109.         }

  110.         return ret;
  111. }

  112. TCListNode* Clist_next(CList* list) {
  113.         TCList* clist = (TCList*)list;
  114.         TCListNode* ret = NULL;

  115.         if (NULL != clist && NULL != clist->slider) {
  116.                 ret = clist->slider;
  117.                 clist->slider = ret->next;
  118.         }

  119.         return ret;
  120. }

  121. TCListNode* Clist_deletenode(CList* list, TCListNode* node) {
  122.         TCList* clist = (TCList*)list;
  123.         TCListNode* ret = NULL;
  124.        
  125.         if (NULL != clist) {
  126.                 int i;
  127.                 TCListNode* current = (TCListNode*)clist;
  128.                 for (i = 0; i < clist->length; i++) {
  129.                         if (current->next == node) {
  130.                                 ret = current->next;
  131.                                 break;
  132.                         }
  133.                         current = current->next;
  134.                 }

  135.                 if (NULL != ret) {
  136.                         Clist_node_del(clist, i);
  137.                 }

  138.         }

  139.         return ret;
  140. }

  141. TCListNode* Clist_reset(CList* list) {
  142.         TCList* clist = (TCList*)list;
  143.         TCListNode* ret = NULL;
  144.         if (NULL != clist) {
  145.                 clist->slider = clist->header.next;
  146.                 ret = clist->slider;
  147.         }

  148.         return ret;
  149. }
复制代码
main.c
  1. typedef struct _tag_value {
  2.         TCListNode header;
  3.         int v;
  4. }value;
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|不学网

GMT+8, 2018-9-19 05:39

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表