鱼C论坛

 找回密码
 立即注册
查看: 2623|回复: 0

[学习笔记] 抽象数据类型之链表ADT接口包

[复制链接]
发表于 2016-9-6 00:39:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 mingcxx 于 2016-9-6 00:50 编辑

C的基础大致学完了,感觉几个ADT的接口包可能以后会用。所以先存到这里,方便找。
这是一个单项链表,也可以修改Item的结构类型,加入一个指向前一节点的指针,变成双向链表。
  1. //list.h -- 简单列表类型的头文件

  2. #ifndef LIST_H_
  3. #define LIST_H_

  4. #include <stdbool.h>                //C99特性,兼容C++

  5. //特定于程序的声明
  6. #define TSIZE 45                        //存放影片名的数组大小

  7. struct film
  8. {
  9.         char title[TSIZE];
  10.         int rating;
  11. };

  12. //一般类型定义,根据实际需要修改Item
  13. typedef struct film Item;

  14. typedef struct node
  15. {
  16.         Item item;
  17.         struct node * next;
  18. } Node;

  19. typedef Node * List;

  20. //函数原型

  21. /*操作:初始化一个列表
  22. 操作前:plist指向一个列表
  23. 操作后:该列表被初始化为空列表*/
  24. void InitializeList(List * plist);


  25. /*操作:确定列表是否为空列表
  26. 操作前:plist指向一个已初始化的列表
  27. 操作后:如果该列表为空则返回true,
  28.                 否则返回false*/
  29. bool ListIsEmpty(const List * plist);


  30. /*操作:确定列表是否已满
  31. 操作前:plist指向一个已初始化的列表
  32. 操作后:如果该列表已满则返回true,
  33.                 否则返回false*/
  34. bool ListIsFull(const List * plist);


  35. /*操作:确定列表中的项目个数
  36. 操作前:plist指向一个已初始化的列表
  37. 操作后:返回该列表的项目个数*/
  38. unsigned int ListItemCount(const List * plist);


  39. /*操作:在列表尾部添加一个项目
  40. 操作前:Item是要被增加到列表的项目
  41.                 plist指向一个已初始化的列表
  42. 操作后:如果可能的话,在列表尾部添加
  43.                 一个新项目,函数返回true,
  44.                 否则返回false*/
  45. bool AddItem(Item item, List * plist);


  46. /*操作:把一个函数作用于列表中的每个项目
  47. 操作前:plist指向一个已初始化的列表,
  48.                 pfun指向一个函数,该函数接受
  49.                 一个Item参数并且无返回值
  50. 操作后:pfun指向个函数被作用到列表
  51.                 中的每个项目一次*/
  52. void Traverse(const List * plist, void(*pfun)(Item item));


  53. /*操作:释放已分配的内存
  54. 操作前:plist指向一个已初始化的列表,
  55. 操作后:为该列表分配的内存被释放,并
  56.                 且该列表被置为空列表*/
  57. void EmptyTheList(List * plist);


  58. #endif // !LIST_H_
复制代码
  1. //list.c -- 支持链表操作的函数实现

  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "list.h"

  5. /*局部函数原型*/
  6. static void CopyToNode(Item item, Node * pnode);

  7. //接口函数

  8. /*把列表设置为空列表*/
  9. void InitializeList(List * plist)
  10. {
  11.         *plist = NULL;
  12. }

  13. /*如果列表为空则返回真,否则返回假*/
  14. bool ListIsEmpty(const List * plist)
  15. {
  16.         if (*plist == NULL)
  17.         {
  18.                 return true;
  19.         }
  20.         else
  21.         {
  22.                 return false;
  23.         }
  24. }

  25. /*如果列表已满则返回真,否则返回假*/
  26. bool ListIsFull(const List * plist)
  27. {
  28.         Node * pnode = (Node *)malloc(sizeof(Node));
  29.         if (pnode == NULL)
  30.         {
  31.                 return true;
  32.         }
  33.         else
  34.         {
  35.                 free(pnode);
  36.                 return false;
  37.         }
  38. }

  39. /*返回节点数*/
  40. unsigned int ListItemCount(const List * plist)
  41. {
  42.         Node * pnode = *plist;
  43.         unsigned int count = 0;

  44.         while (pnode != NULL)
  45.         {
  46.                 ++count;
  47.                 pnode = pnode->next;
  48.         }

  49.         return count;
  50. }

  51. /*创建存放项目的节点,并把它添加到
  52. plist指向的列表的尾部(较慢的方法)*/
  53. bool AddItem(Item item, List * plist)
  54. {
  55.         Node * pnode = (Node *)malloc(sizeof(Node));
  56.         Node * scan = *plist;

  57.         if (pnode == NULL)
  58.         {
  59.                 return false;
  60.         }

  61.         CopyToNode(item, pnode);
  62.         pnode->next = NULL;
  63.         if (scan == NULL)
  64.         {
  65.                 *plist = pnode;
  66.         }
  67.         else
  68.         {
  69.                 while (scan->next != NULL)
  70.                 {
  71.                         scan = scan->next;
  72.                 }
  73.                 scan->next = pnode;
  74.         }


  75.         return true;
  76. }

  77. /*访问每个节点并对它们分别执行pfun指向的函数*/
  78. void Traverse(const List * plist, void(*pfun)(Item item))
  79. {
  80.         Node * pnode = *plist;

  81.         while (pnode != NULL)
  82.         {
  83.                 (*pfun)(pnode->item);
  84.                 pnode = pnode->next;
  85.         }
  86. }


  87. /*释放由malloc()分配的内存
  88. 把列表指针设置为NULL*/
  89. void EmptyTheList(List * plist)
  90. {
  91.         Node * tmp;

  92.         while (*plist != NULL)
  93.         {
  94.                 tmp = (*plist)->next;
  95.                 free(*plist);
  96.                 *plist = tmp;
  97.         }
  98. }


  99. //局部函数定义

  100. //把一个项目复制到一个节点中
  101. static void CopyToNode(Item item, Node * pnode)
  102. {
  103.         pnode->item = item;
  104. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-16 09:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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