1. #ifndef __MY_SEQLIST_H__
  2. #define __MY_SEQLIST_H__
  3.  
  4. typedef void SeqList;
  5. typedef void SeqListNode;
  6.  
  7. //链表 创建
  8. SeqList* SeqList_Create(int capacity);
  9.  
  10. //链表 销毁
  11. void SeqList_Destroy(SeqList* list);
  12.  
  13. ////链表 清空
  14. void SeqList_Clear(SeqList* list);
  15.  
  16. //链表 长度
  17. int SeqList_Length(SeqList* list);
  18.  
  19. //链表 容量
  20. int SeqList_Capacity(SeqList* list);
  21.  
  22. //链表 在某一个位置 插入元素
  23. int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
  24.  
  25. //获取某一个位置的链表结点
  26. SeqListNode* SeqList_Get(SeqList* list, int pos);
  27.  
  28. //删除某一个位置的结点
  29. SeqListNode* SeqList_Delete(SeqList* list, int pos);
  30.  
  31. #endif //__MY_SEQLIST_H__
  32.  
  33. #ifndef _MY_SEQQUEUE_H_
  34. #define _MY_SEQQUEUE_H_
  35.  
  36. typedef void SeqQueue;
  37.  
  38. //创建队列
  39. SeqQueue* SeqQueue_Create(int capacity);
  40.  
  41. //销毁 队列
  42. void SeqQueue_Destroy(SeqQueue* queue);
  43.  
  44. //清空 队列
  45. void SeqQueue_Clear(SeqQueue* queue);
  46.  
  47. //向队列中添加 元素
  48. int SeqQueue_Append(SeqQueue* queue, void* item);
  49.  
  50. //从 队列 中 提取 元素
  51. void* SeqQueue_Retrieve(SeqQueue* queue);
  52.  
  53. //求 队列 队头元素
  54. void* SeqQueue_Header(SeqQueue* queue);
  55.  
  56. //队列 长度
  57. int SeqQueue_Length(SeqQueue* queue);
  58.  
  59. //队列容量
  60. int SeqQueue_Capacity(SeqQueue* queue);
  61.  
  62. #endif //_MY_SEQQUEUE_H_
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include "seqlist.h"
  6.  
  7. //用数组来模拟线性表
  8. typedef struct _tag_SeqList
  9. {
  10. int capacity;
  11. int length;
  12. //int *node[100];
  13. int **node; //int node[capacity] //
  14. //int *node[capacity];
  15.  
  16. //int *node; // int node[i]===> *(node+i)
  17. }TSeqList;
  18.  
  19. //链表 创建
  20. SeqList* SeqList_Create(int capacity) //O(1)
  21. {
  22. int ret;
  23. TSeqList *tmp = NULL;
  24. tmp = (TSeqList *)malloc(sizeof(TSeqList));
  25. if (tmp == NULL)
  26. {
  27. ret =;
  28. printf("func SeqList_Create() err :%d \n", ret);
  29. return NULL;
  30. }
  31. memset(tmp, , sizeof(TSeqList));
  32. tmp->capacity = capacity;
  33. tmp->length = ;
  34. tmp->node = (int **)malloc(sizeof(void *) * capacity);
  35. if (tmp->node == NULL)
  36. {
  37. ret = ;
  38. printf("func SeqList_Create() malloc err :%d \n", ret);
  39. return NULL;
  40. }
  41. memset(tmp->node, , sizeof(void *) * capacity);
  42.  
  43. return tmp;
  44. }
  45.  
  46. //链表 创建
  47. int SeqList_Create2(int capacity, SeqList**handle)
  48. {
  49. int ret = ;
  50. TSeqList *tmp = NULL;
  51. tmp = (TSeqList *)malloc(sizeof(TSeqList));
  52. if (tmp == NULL)
  53. {
  54. ret =;
  55. printf("func SeqList_Create2() err :%d \n", ret);
  56. return ret;
  57. }
  58. memset(tmp, , sizeof(TSeqList));
  59. tmp->capacity = capacity;
  60. tmp->length = ;
  61. tmp->node = (int **)malloc(sizeof(void *) * capacity);
  62. if (tmp->node == NULL)
  63. {
  64. ret = ;
  65. printf("func SeqList_Create2() malloc err :%d \n", ret);
  66. return ret;
  67. }
  68.  
  69. *handle = tmp;
  70. return ret;
  71. }
  72.  
  73. //链表 销毁
  74. void SeqList_Destroy(SeqList* list) //O(1)
  75. {
  76. TSeqList *tmp = NULL;
  77. if (list == NULL)
  78. {
  79. return ;
  80. }
  81.  
  82. tmp = (TSeqList *)list;
  83.  
  84. if (tmp->node != NULL)
  85. {
  86. free(tmp->node);
  87. }
  88. free(tmp);
  89. return ;
  90. }
  91.  
  92. ////链表 清空
  93. void SeqList_Clear(SeqList* list) //O(1)
  94. {
  95. TSeqList *tmp = NULL;
  96. if (list == NULL)
  97. {
  98. return ;
  99. }
  100.  
  101. tmp = (TSeqList *)list;
  102. tmp->length = ;
  103. memset(tmp->node, , (tmp->capacity * sizeof(void *)) );
  104.  
  105. return ;
  106. }
  107.  
  108. //链表 长度
  109. int SeqList_Length(SeqList* list) //O(1)
  110. {
  111. TSeqList *tmp = NULL;
  112. if (list == NULL)
  113. {
  114. return -;
  115. }
  116. tmp = (TSeqList *)list;
  117.  
  118. return tmp->length;
  119. }
  120.  
  121. //链表 容量
  122. int SeqList_Capacity(SeqList* list) //O(1)
  123. {
  124. TSeqList *tmp = NULL;
  125. if (list == NULL)
  126. {
  127. return -;
  128. }
  129. tmp = (TSeqList *)list;
  130. return tmp->capacity;
  131. }
  132.  
  133. //链表 在某一个位置 插入元素
  134. int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) //O(n)
  135. {
  136. TSeqList *tList = NULL;
  137. int i = ;
  138. if (list == NULL || node==NULL)
  139. {
  140. return -;
  141. }
  142. tList = (TSeqList *)list;
  143. //如果满了
  144. if (tList->length >= tList->capacity)
  145. {
  146. return -;
  147. }
  148.  
  149. //pos位置的容错处理
  150. if (pos > tList->length )
  151. {
  152. pos = tList->length;
  153. }
  154.  
  155. for (i=tList->length; i>pos; i--) //n
  156. {
  157. tList->node[i] = tList->node[i-];
  158. }
  159.  
  160. tList->node[i] = (int* )node; //ok
  161. tList->length ++;
  162.  
  163. return ;
  164. }
  165.  
  166. //获取某一个位置的链表结点
  167. SeqListNode* SeqList_Get(SeqList* list, int pos) //O(1)
  168. {
  169. TSeqList *tList = NULL;
  170. SeqListNode *tmp = NULL;
  171.  
  172. tList = (TSeqList *)list;
  173.  
  174. if (list == NULL || pos< || pos >=tList->length )
  175. {
  176. return NULL;
  177. }
  178. tmp = tList->node[pos];
  179.  
  180. return tmp;
  181. }
  182.  
  183. //删除某一个位置的结点
  184. SeqListNode* SeqList_Delete(SeqList* list, int pos) ////O(n)
  185. {
  186. int i = ;
  187. TSeqList *tList = NULL;
  188. SeqListNode *tmp = NULL;
  189.  
  190. tList = (TSeqList *)list;
  191. if (list == NULL || pos < || pos >= tList->length)
  192. {
  193. return NULL;
  194. }
  195. tmp = tList->node[pos];
  196.  
  197. // pos = 3
  198. for (i=pos+; i<tList->length; i++)
  199. {
  200. tList->node[i-] = tList->node[i];
  201.  
  202. }
  203. tList->length --;
  204. return tmp;
  205. }
  206.  
  207. #define _CRT_SECURE_NO_WARNINGS
  208. #include <stdlib.h>
  209. #include <string.h>
  210. #include <stdio.h>
  211.  
  212. #include "seqqueue.h"
  213. #include "seqlist.h"
  214.  
  215. //创建一个队列 相当于 创建一个顺序表
  216. SeqQueue* SeqQueue_Create(int capacity)
  217. {
  218. return SeqList_Create(capacity);
  219. }
  220.  
  221. //销毁 队列 相当于 销毁 一个 顺序表
  222. void SeqQueue_Destroy(SeqQueue* queue)
  223. {
  224. SeqList_Destroy(queue);
  225. }
  226.  
  227. //清空 队列 相当于 清空 一个 顺序表
  228. void SeqQueue_Clear(SeqQueue* queue)
  229. {
  230. SeqList_Clear(queue);
  231. }
  232.  
  233. //向队列尾部添加一个元素 相当于 向线性表的尾部添加元素
  234. int SeqQueue_Append(SeqQueue* queue, void* item)
  235. {
  236. return SeqList_Insert(queue, item, SeqList_Length(queue));
  237. }
  238.  
  239. //提取队头元素 相当于 删除链表0号位置元素
  240. void* SeqQueue_Retrieve(SeqQueue* queue)
  241. {
  242. return SeqList_Delete(queue, ) ;
  243. }
  244.  
  245. //获取队头元素 相当于 获取 链表0号位置元素
  246. void* SeqQueue_Header(SeqQueue* queue)
  247. {
  248. return SeqList_Get(queue, );
  249. }
  250.  
  251. int SeqQueue_Length(SeqQueue* queue)
  252. {
  253. return SeqList_Length(queue);
  254. }
  255.  
  256. int SeqQueue_Capacity(SeqQueue* queue)
  257. {
  258. return SeqList_Capacity(queue);
  259. }
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include "seqqueue.h"
  6.  
  7. void main()
  8. {
  9. int i = , a[];
  10.  
  11. SeqQueue *queue = NULL;
  12.  
  13. for (i=; i<; i++)
  14. {
  15. a[i] = i + ;
  16. }
  17.  
  18. queue = SeqQueue_Create();
  19.  
  20. //向队列的尾部 添加元素
  21. for (i=; i<; i++)
  22. {
  23. SeqQueue_Append(queue, a + i);
  24. }
  25.  
  26. //获取队列的属性
  27. printf("capacity:%d \n", SeqQueue_Capacity(queue));
  28. printf("length:%d \n", SeqQueue_Length(queue));
  29. printf("队头: %d \n", *( (int *)SeqQueue_Header(queue) ));
  30.  
  31. //销毁 队列
  32.  
  33. while (SeqQueue_Length(queue) > )
  34. {
  35. int tmp;
  36. tmp = *( (int *)SeqQueue_Retrieve(queue) );
  37. printf("%d ", tmp);
  38. }
  39. SeqQueue_Destroy(queue);
  40.  
  41. printf("hello...\n");
  42. system("pause");
  43. return ;
  44. }

C 队列顺序存储的更多相关文章

  1. [置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的 ...

  2. [置顶] ※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

    循环队列 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量.存储在其中的队列称为循环队列(Circular Queue). ...

  3. 队列顺序存储 - 设计与实现 - API函数

    队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不允许在中间部位进行操作! queue常用操作 销毁队列 清空队 ...

  4. 基于python实现顺序存储的队列代码

    """ 队列-顺序存储 seqqueue.py 代码实现 """ # 自定义异常类 class QueueError(Exception): ...

  5. (转)java redis使用之利用jedis实现redis消息队列

    应用场景 最近在公司做项目,需要对聊天内容进行存储,考虑到数据库查询的IO连接数高.连接频繁的因素,决定利用缓存做. 从网上了解到redis可以对所有的内容进行二进制的存储,而java是可以对所有对象 ...

  6. 队列链式存储 - 设计与实现 - API函数

    队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...

  7. 预热一下吧《实现Redis消息队列》

    应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...

  8. Java利用Redis实现消息队列

    应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...

  9. [PHP] 2018年终总结

    去掉敏感信息后的不完整版 ==========================================================================2018年12月29日 记 ...

随机推荐

  1. POJ 3436 ACM Computer Factory (拆点+输出解)

    [题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...

  2. HDU 5280 Senior's Array (暴力,水)

    题意:给一个数列,再给一个数字p,要求p一定要替换掉数列中的一个元素,然后求最大连续子序列之和. 思路:1000*1000的复杂度,O(n*n) .就是每个都试,然后求和. #include < ...

  3. Azure 负载平衡器新分发模式

    Yves Pitsch Azure 网络首席项目经理 Azure负载平衡器是一种第四层(TCP.UDP)类型的负载平衡器,它可以将传入流量分发到云服务中正常运行的服务实例上,或者分发到负载平衡器集内所 ...

  4. CSS布局中——导航是非常常见的

    导航绝对是页面布局中最常见的,为了不用每次去写,稍微贴个简单的导航模版出来,方便以后使用. <title>CSS菜单</title> <style type=" ...

  5. 自定义Sharepoint的登陆页面

    转:http://www.cnblogs.com/jecoso/archive/2008/05/25/1207151.html 原文作者:Damon Armstrong 原文地址:http://www ...

  6. ODAC访问oracle时,提示:由于以前的函数求值超时,函数求值被禁用,必须继续执行才能正常返回

    这是因为调试时会自动对Local/Watch等窗口里面(或鼠标停留所在)的变量求值,为了防止用户写的程序错误(比如死循环),系统有一个超时限制,如果某个属性的get中做了很复杂的操作(而不是简单地返回 ...

  7. POJ 1236 Network of Schools 有向图强连通分量

    参考这篇博客: http://blog.csdn.net/ascii991/article/details/7466278 #include <stdio.h> #include < ...

  8. bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...

  9. 6.1 CUDA: pinned memory固定存储

    CPU和GPU内存交互 在CUDA编程中,内存拷贝是非常费时的一个动作. 从上图我们可以看出:1. CPU和GPU之间的总线bus是PCIe,是双向传输的. 2. CPU和GPU之间的数据拷贝使用DM ...

  10. HW7.10

    public class Solution { public static void main(String[] args) { int[][] array = new int[3][3]; for( ...