头文件:

  1. #ifndef _SEQSTACK_H_
  2. #define _SEQSTACK_H_
  3.  
  4. typedef void SeqStack;
  5. //创建一个栈
  6. SeqStack* SeqStack_Create(int capacity);
  7. //删除一个栈
  8. void SeqStack_Destroy(SeqStack* stack);
  9. //清空一个栈
  10. void SeqStack_Clear(SeqStack* stack);
  11. //入栈
  12. int SeqStack_Push(SeqStack* stack, void* item);
  13. //出栈
  14. void* SeqStack_Pop(SeqStack* stack);
  15. //获取栈顶元素
  16. void* SeqStack_GetTop(SeqStack* stack);
  17. //获取栈的长度
  18. int SeqStack_GetSize(SeqStack* stack);
  19. //获取栈的容量
  20. int SeqStack_Capacity(SeqStack* stack);
  21.  
  22. #endif

CPP文件:

  1. #include "circleList.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. //这个为头链表头
  7. typedef struct _tag_CircleList
  8. {
  9. CircleListNode header;
  10. CircleListNode* slider;
  11. int length;
  12. }tagCircleList;
  13.  
  14. //创建一个循环链表
  15. CircleList* CircleList_Create()
  16. {
  17. tagCircleList* ret = (tagCircleList*)malloc(sizeof(tagCircleList)); //分配内存
  18. if (ret == NULL)
  19. {
  20. return NULL;
  21. }
  22.  
  23. //初始化
  24. ret->header.next = NULL;
  25. ret->length = ;
  26. ret->slider = NULL;
  27.  
  28. return ret;
  29. }
  30.  
  31. //删除一个循环链表
  32. void CircleList_Destroy(CircleList* list)
  33. {
  34. if (list = NULL)
  35. {
  36. return;
  37. }
  38. //释放内存
  39. free(list);
  40. return;
  41. }
  42.  
  43. //清空一个循环链表
  44. void CircleList_Clear(CircleList* list)
  45. {
  46. tagCircleList* sList = NULL;
  47. sList = (tagCircleList*)list;
  48. if (sList == NULL)
  49. {
  50. return ;
  51. }
  52. //重置为初始化状态
  53. sList->header.next = NULL;
  54. sList->length = ;
  55. sList->slider = NULL;
  56. return;
  57. }
  58.  
  59. //返回链表的长度
  60. int CircleList_Length(CircleList* list)
  61. {
  62. tagCircleList* sList = NULL;
  63. sList = (tagCircleList*)list;
  64. int ret = -;
  65. //异常处理
  66. if (list == NULL)
  67. {
  68. return ret;
  69. }
  70.  
  71. return sList->length;
  72. }
  73.  
  74. //在POS位置插入一个节点
  75. int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
  76. {
  77. tagCircleList* sList = NULL;
  78. sList = (tagCircleList*)list;
  79. int ret = -;
  80. //异常处理
  81. if(list == NULL || node == NULL || pos<)
  82. {
  83. return ret;
  84. }
  85. //临时变量Current
  86. CircleListNode* Current = (CircleListNode*)sList;
  87.  
  88. for(int i = ; (i < pos) && (Current->next != NULL); i++)
  89. {
  90. Current = Current->next;
  91. }
  92.  
  93. node->next = Current->next;
  94. Current->next = node;
  95.  
  96. //当长度为0时 游标指向node
  97. if (sList->length == )
  98. {
  99. sList->slider = node;
  100. }
  101.  
  102. sList->length++;
  103. //如果current 依旧指向链表头 证明没跳走 是从0开始插入的 需要头插法
  104. if (Current == (CircleListNode*)sList)
  105. {
  106. //定义一个辅助last 变量来获取尾部节点的信息
  107. CircleListNode* last = (CircleListNode*)CircleList_Get(sList, sList->length - );
  108. //将尾部节点的NEXT域存为当前节点(头节点)
  109. last->next = Current->next;
  110. }
  111. return ;
  112. }
  113.  
  114. //获取POS位置节点的信息
  115. CircleListNode* CircleList_Get(CircleList* list, int pos)
  116. {
  117.  
  118. tagCircleList* sList = (tagCircleList*)list;
  119. CircleListNode* ret = NULL;
  120. int i = ;
  121. if (list == NULL || pos < )
  122. {
  123. return NULL;
  124. }
  125. CircleListNode* Current = (CircleListNode*)sList;
  126. for(i = ; i < pos; i++)
  127. {
  128. Current = Current->next;
  129. }
  130.  
  131. ret = Current->next;
  132. return ret;
  133. }
  134.  
  135. //删除POS位置的节点
  136. CircleListNode* CircleList_Delete(CircleList* list, int pos)
  137. {
  138. tagCircleList* sList = (tagCircleList*)list;
  139. CircleListNode* ret = NULL;
  140.  
  141. if ((sList != NULL) && (pos >=) && (sList->length > ))
  142. {
  143. //将Current指向表头
  144. CircleListNode* Current = (CircleListNode*)(&(sList->header));
  145. //辅助节点last 进行头节点的删除使用 存取最后一个元素
  146. CircleListNode* last = NULL;
  147.  
  148. for(int i = ; i < pos; i++)
  149. {
  150. Current = Current->next;
  151. }
  152. //删除头结点
  153. if ( Current == (CircleListNode*)sList)
  154. {
  155. last = (CircleListNode*)CircleList_Get(sList, sList->length - );
  156. }
  157. //要删除的元素
  158. ret = Current->next;
  159. Current->next = ret->next;
  160. sList->length--;
  161.  
  162. //判断链表非空
  163. if( last != NULL)
  164. {
  165. //sList->header.next = ret->next;
  166. Current->next = ret->next;
  167. last->next = ret->next;
  168. }
  169. //若删除的元素为游标所指的元素
  170. if(sList->slider = ret)
  171. {
  172. sList->slider = ret->next;
  173. }
  174. //若删除元素后 链表长度为0 做处理
  175. if (sList->length == )
  176. {
  177. sList->header.next = NULL;
  178. sList->slider = NULL;
  179. }
  180. }
  181. return ret;
  182. }
  183.  
  184. ////与游标相关的函数
  185. //删除游标所指的位置节点
  186. CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
  187. {
  188. tagCircleList* sList = (tagCircleList*)list;
  189. CircleListNode* ret = NULL;
  190. int i = ;
  191.  
  192. if (sList != NULL)
  193. {
  194. CircleListNode* Current = (CircleListNode*)sList;
  195. //循环查找node 在链表中的位置
  196. for (i = ; i < sList->length; i++)
  197. {
  198. if (Current->next == node)
  199. {
  200. ret = Current->next;
  201. break;
  202. }
  203.  
  204. Current = Current->next;
  205. }
  206. //找到了 使用CircleList_Delete 删除
  207. if(ret != NULL)
  208. {
  209. CircleList_Delete(list, i);
  210. }
  211.  
  212. }
  213.  
  214. return ret;
  215. }
  216.  
  217. //重置游标位置
  218. CircleListNode* CircleList_Reset(CircleList* list)
  219. {
  220. tagCircleList* sList = (tagCircleList*)list;
  221. CircleListNode* ret = NULL;
  222. //如果不为空
  223. if (sList != NULL)
  224. {
  225. sList->slider = sList->header.next;
  226. ret = sList->slider;
  227. }
  228.  
  229. return ret;
  230. }
  231.  
  232. //当前游标位置
  233. CircleListNode* CircleList_Current(CircleList* list)
  234. {
  235. tagCircleList* sList = (tagCircleList*)list;
  236. CircleListNode* ret = NULL;
  237. //如果不为空
  238. if (sList != NULL)
  239. {
  240. ret = sList->slider;
  241. }
  242.  
  243. return ret;
  244. }
  245.  
  246. //把游标位置返回,游标下移
  247. CircleListNode* CircleList_Next(CircleList* list)
  248. {
  249. tagCircleList* sList = (tagCircleList*)list;
  250. CircleListNode* ret = NULL;
  251. //如果不为空
  252. if((sList != NULL) && (sList->slider != NULL))
  253. {
  254. ret = sList->slider;
  255. sList->slider = ret->next;
  256. }
  257.  
  258. return ret;
  259. }

测试函数:

  1. #include "circleList.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct _Temp_Test
  7. {
  8. CircleListNode node;
  9. int temp;
  10. char temp2;
  11. }TempTast;
  12.  
  13. int main()
  14. {
  15. CircleList* circlelist = NULL;
  16.  
  17. circlelist = CircleList_Create();
  18. //异常处理
  19. if (circlelist == NULL)
  20. {
  21. cout << "Create Err " << endl;
  22. return -;
  23. }
  24.  
  25. TempTast t1, t2, t3, t4, t5;
  26. t1.temp = ;
  27. t2.temp = ;
  28. t3.temp = ;
  29. t4.temp = ;
  30. t5.temp = ;
  31. //插入元素
  32. CircleList_Insert(circlelist, (CircleListNode*)(&t1), );
  33. CircleList_Insert(circlelist, (CircleListNode*)(&t2), );
  34. CircleList_Insert(circlelist, (CircleListNode*)(&t3), );
  35. CircleList_Insert(circlelist, (CircleListNode*)(&t4), );
  36. CircleList_Insert(circlelist, (CircleListNode*)(&t5), );
  37. //测试功能
  38. cout << "Length: " << CircleList_Length(circlelist) << endl;
  39. //遍历两次
  40. cout << "遍历两次:" << endl;
  41. for(int i = ; i < *CircleList_Length(circlelist); i++)
  42. {
  43. cout <<"Node:" << ((TempTast*)CircleList_Get(circlelist, i))->temp << endl;
  44. }
  45. cout << endl;
  46. //删除第一个节点
  47. cout <<"Node:" << ((TempTast*)CircleList_Delete(circlelist, ))->temp << endl;
  48. //清空
  49. CircleList_Clear(circlelist);
  50. cout << "After Clear Length: " << CircleList_Length(circlelist) << endl;
  51.  
  52. //插入元素
  53. CircleList_Insert(circlelist, (CircleListNode*)(&t1), );
  54. CircleList_Insert(circlelist, (CircleListNode*)(&t2), );
  55. CircleList_Insert(circlelist, (CircleListNode*)(&t3), );
  56. CircleList_Insert(circlelist, (CircleListNode*)(&t4), );
  57. CircleList_Insert(circlelist, (CircleListNode*)(&t5), );
  58. //删除指定元素
  59. cout << "Delete Node :" << ((TempTast*)CircleList_DeleteNode(circlelist, (CircleListNode*)(&t1)))->temp << endl;
  60. //显示游标当前位置
  61. cout << "Silder Now :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
  62. //移动后
  63. CircleList_Next(circlelist);
  64. cout << "Silder After Next :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
  65. //重置后
  66. CircleList_Reset(circlelist);
  67. cout << "Silder After Reset :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
  68. cout << endl;
  69. //销毁
  70. CircleList_Destroy(circlelist);
  71. cout << "circle has been Destroied" << endl;
  72. system("pause");
  73. return ;
  74. }

基于顺序链表的栈的顺序存储的C风格实现的更多相关文章

  1. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  2. [Python] 数据结构--实现顺序表、链表、栈和队列

    说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...

  3. C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现

    前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...

  4. 基于链表的栈(Java)

    package com.rao.linkList; /** * @author Srao * @className LinkedStack * @date 2019/12/3 13:59 * @pac ...

  5. java实现顺序表、链表、栈 (x)->{持续更新}

    1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...

  6. 数组、链表、栈、队列和STL

    数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...

  7. 数据结构(c语言第2版)-----了解链表,栈,队列,串

    关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...

  8. 栈的顺序存储 - 设计与实现 - API实现

    Stack基本概念 栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 Stack的常用操作 创建栈 销毁栈 清空栈 进栈 出 ...

  9. C语言- 基础数据结构和算法 - 栈的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

随机推荐

  1. ssrs 里 表头 分页后显示

    1. 列组,箭头,高级 2.点击行组,静态 3. 设置静态行组 属性

  2. C8051F_CAN

    CAN总线特点:基于报文编码而非对节点编码,增删节点对系统没有影响,靠干扰稳定性好,速率高. 小工具:CANtool 收发器:CAN总线收发器CTM1050,通信速率1Mbps,至少可连接110个节点 ...

  3. 17995 Stupid thief 组合数学

    17995 Stupid thief 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: 不限定 Description A stupid thie ...

  4. Bootstrap基础知识学习

    Bootstrap中文网 http://www.bootcss.com/ Bootstrap菜鸟教程 http://www.runoob.com/bootstrap/bootstrap-tutoria ...

  5. option标签selected="selected"属性失效的问题

    要在select标签上面加上autocomplete="off"关闭自动完成,不然浏览器每次刷新后将自动选择上一次关闭时的option,这样默认属性selected="s ...

  6. python super详解

    一.super() 的入门使用 - 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, 这时,我们就需要调用父类的方法了,可通过使用 super 来实 ...

  7. watchguard 软件工程师内部招聘!

    作为watchguard正式员工,现发布公司最近的招聘信息,待遇优厚,请符合条件的朋友和我联系并将简历发给我,我会尽早联系公司人力部门. 我的邮件:daibao91888@163.com 博客:htt ...

  8. Hyperledger Fabric on SAP Cloud Platform

    今天的文章来自Wen Aviva, 坐Jerry面对面的程序媛. Jerry在之前的公众号文章<在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图>已经介绍过Aviva ...

  9. 校内选拔I题题解 构造题 Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2) ——D

    http://codeforces.com/contest/574/problem/D Bear and Blocks time limit per test 1 second memory limi ...

  10. map最基本操作

    #include<iostream> #include<map> using namespace std; int main() { /*map<int,char> ...