基于顺序链表的栈的顺序存储的C风格实现
头文件:
- #ifndef _SEQSTACK_H_
- #define _SEQSTACK_H_
- typedef void SeqStack;
- //创建一个栈
- SeqStack* SeqStack_Create(int capacity);
- //删除一个栈
- void SeqStack_Destroy(SeqStack* stack);
- //清空一个栈
- void SeqStack_Clear(SeqStack* stack);
- //入栈
- int SeqStack_Push(SeqStack* stack, void* item);
- //出栈
- void* SeqStack_Pop(SeqStack* stack);
- //获取栈顶元素
- void* SeqStack_GetTop(SeqStack* stack);
- //获取栈的长度
- int SeqStack_GetSize(SeqStack* stack);
- //获取栈的容量
- int SeqStack_Capacity(SeqStack* stack);
- #endif
CPP文件:
- #include "circleList.h"
- #include <iostream>
- using namespace std;
- //这个为头链表头
- typedef struct _tag_CircleList
- {
- CircleListNode header;
- CircleListNode* slider;
- int length;
- }tagCircleList;
- //创建一个循环链表
- CircleList* CircleList_Create()
- {
- tagCircleList* ret = (tagCircleList*)malloc(sizeof(tagCircleList)); //分配内存
- if (ret == NULL)
- {
- return NULL;
- }
- //初始化
- ret->header.next = NULL;
- ret->length = ;
- ret->slider = NULL;
- return ret;
- }
- //删除一个循环链表
- void CircleList_Destroy(CircleList* list)
- {
- if (list = NULL)
- {
- return;
- }
- //释放内存
- free(list);
- return;
- }
- //清空一个循环链表
- void CircleList_Clear(CircleList* list)
- {
- tagCircleList* sList = NULL;
- sList = (tagCircleList*)list;
- if (sList == NULL)
- {
- return ;
- }
- //重置为初始化状态
- sList->header.next = NULL;
- sList->length = ;
- sList->slider = NULL;
- return;
- }
- //返回链表的长度
- int CircleList_Length(CircleList* list)
- {
- tagCircleList* sList = NULL;
- sList = (tagCircleList*)list;
- int ret = -;
- //异常处理
- if (list == NULL)
- {
- return ret;
- }
- return sList->length;
- }
- //在POS位置插入一个节点
- int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
- {
- tagCircleList* sList = NULL;
- sList = (tagCircleList*)list;
- int ret = -;
- //异常处理
- if(list == NULL || node == NULL || pos<)
- {
- return ret;
- }
- //临时变量Current
- CircleListNode* Current = (CircleListNode*)sList;
- for(int i = ; (i < pos) && (Current->next != NULL); i++)
- {
- Current = Current->next;
- }
- node->next = Current->next;
- Current->next = node;
- //当长度为0时 游标指向node
- if (sList->length == )
- {
- sList->slider = node;
- }
- sList->length++;
- //如果current 依旧指向链表头 证明没跳走 是从0开始插入的 需要头插法
- if (Current == (CircleListNode*)sList)
- {
- //定义一个辅助last 变量来获取尾部节点的信息
- CircleListNode* last = (CircleListNode*)CircleList_Get(sList, sList->length - );
- //将尾部节点的NEXT域存为当前节点(头节点)
- last->next = Current->next;
- }
- return ;
- }
- //获取POS位置节点的信息
- CircleListNode* CircleList_Get(CircleList* list, int pos)
- {
- tagCircleList* sList = (tagCircleList*)list;
- CircleListNode* ret = NULL;
- int i = ;
- if (list == NULL || pos < )
- {
- return NULL;
- }
- CircleListNode* Current = (CircleListNode*)sList;
- for(i = ; i < pos; i++)
- {
- Current = Current->next;
- }
- ret = Current->next;
- return ret;
- }
- //删除POS位置的节点
- CircleListNode* CircleList_Delete(CircleList* list, int pos)
- {
- tagCircleList* sList = (tagCircleList*)list;
- CircleListNode* ret = NULL;
- if ((sList != NULL) && (pos >=) && (sList->length > ))
- {
- //将Current指向表头
- CircleListNode* Current = (CircleListNode*)(&(sList->header));
- //辅助节点last 进行头节点的删除使用 存取最后一个元素
- CircleListNode* last = NULL;
- for(int i = ; i < pos; i++)
- {
- Current = Current->next;
- }
- //删除头结点
- if ( Current == (CircleListNode*)sList)
- {
- last = (CircleListNode*)CircleList_Get(sList, sList->length - );
- }
- //要删除的元素
- ret = Current->next;
- Current->next = ret->next;
- sList->length--;
- //判断链表非空
- if( last != NULL)
- {
- //sList->header.next = ret->next;
- Current->next = ret->next;
- last->next = ret->next;
- }
- //若删除的元素为游标所指的元素
- if(sList->slider = ret)
- {
- sList->slider = ret->next;
- }
- //若删除元素后 链表长度为0 做处理
- if (sList->length == )
- {
- sList->header.next = NULL;
- sList->slider = NULL;
- }
- }
- return ret;
- }
- ////与游标相关的函数
- //删除游标所指的位置节点
- CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
- {
- tagCircleList* sList = (tagCircleList*)list;
- CircleListNode* ret = NULL;
- int i = ;
- if (sList != NULL)
- {
- CircleListNode* Current = (CircleListNode*)sList;
- //循环查找node 在链表中的位置
- for (i = ; i < sList->length; i++)
- {
- if (Current->next == node)
- {
- ret = Current->next;
- break;
- }
- Current = Current->next;
- }
- //找到了 使用CircleList_Delete 删除
- if(ret != NULL)
- {
- CircleList_Delete(list, i);
- }
- }
- return ret;
- }
- //重置游标位置
- CircleListNode* CircleList_Reset(CircleList* list)
- {
- tagCircleList* sList = (tagCircleList*)list;
- CircleListNode* ret = NULL;
- //如果不为空
- if (sList != NULL)
- {
- sList->slider = sList->header.next;
- ret = sList->slider;
- }
- return ret;
- }
- //当前游标位置
- CircleListNode* CircleList_Current(CircleList* list)
- {
- tagCircleList* sList = (tagCircleList*)list;
- CircleListNode* ret = NULL;
- //如果不为空
- if (sList != NULL)
- {
- ret = sList->slider;
- }
- return ret;
- }
- //把游标位置返回,游标下移
- CircleListNode* CircleList_Next(CircleList* list)
- {
- tagCircleList* sList = (tagCircleList*)list;
- CircleListNode* ret = NULL;
- //如果不为空
- if((sList != NULL) && (sList->slider != NULL))
- {
- ret = sList->slider;
- sList->slider = ret->next;
- }
- return ret;
- }
测试函数:
- #include "circleList.h"
- #include <iostream>
- using namespace std;
- typedef struct _Temp_Test
- {
- CircleListNode node;
- int temp;
- char temp2;
- }TempTast;
- int main()
- {
- CircleList* circlelist = NULL;
- circlelist = CircleList_Create();
- //异常处理
- if (circlelist == NULL)
- {
- cout << "Create Err " << endl;
- return -;
- }
- TempTast t1, t2, t3, t4, t5;
- t1.temp = ;
- t2.temp = ;
- t3.temp = ;
- t4.temp = ;
- t5.temp = ;
- //插入元素
- CircleList_Insert(circlelist, (CircleListNode*)(&t1), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t2), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t3), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t4), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t5), );
- //测试功能
- cout << "Length: " << CircleList_Length(circlelist) << endl;
- //遍历两次
- cout << "遍历两次:" << endl;
- for(int i = ; i < *CircleList_Length(circlelist); i++)
- {
- cout <<"Node:" << ((TempTast*)CircleList_Get(circlelist, i))->temp << endl;
- }
- cout << endl;
- //删除第一个节点
- cout <<"Node:" << ((TempTast*)CircleList_Delete(circlelist, ))->temp << endl;
- //清空
- CircleList_Clear(circlelist);
- cout << "After Clear Length: " << CircleList_Length(circlelist) << endl;
- //插入元素
- CircleList_Insert(circlelist, (CircleListNode*)(&t1), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t2), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t3), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t4), );
- CircleList_Insert(circlelist, (CircleListNode*)(&t5), );
- //删除指定元素
- cout << "Delete Node :" << ((TempTast*)CircleList_DeleteNode(circlelist, (CircleListNode*)(&t1)))->temp << endl;
- //显示游标当前位置
- cout << "Silder Now :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
- //移动后
- CircleList_Next(circlelist);
- cout << "Silder After Next :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
- //重置后
- CircleList_Reset(circlelist);
- cout << "Silder After Reset :" << ((TempTast*)CircleList_Current(circlelist))->temp << endl;
- cout << endl;
- //销毁
- CircleList_Destroy(circlelist);
- cout << "circle has been Destroied" << endl;
- system("pause");
- return ;
- }
基于顺序链表的栈的顺序存储的C风格实现的更多相关文章
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- C++模板实现动态顺序表(更深层次的深浅拷贝)与基于顺序表的简单栈的实现
前面介绍的模板有关知识大部分都是用顺序表来举例的,现在我们就专门用模板来实现顺序表,其中的很多操作都和之前没有多大区别,只是有几个比较重要的知识点需要做专门的详解. #pragma once #inc ...
- 基于链表的栈(Java)
package com.rao.linkList; /** * @author Srao * @className LinkedStack * @date 2019/12/3 13:59 * @pac ...
- java实现顺序表、链表、栈 (x)->{持续更新}
1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...
- 数组、链表、栈、队列和STL
数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...
- 数据结构(c语言第2版)-----了解链表,栈,队列,串
关于链表我觉得这都是最基本的东西,但是不常见,在实际的应用中很少的使用,了解它会用就OK,不需要研究的那么深,除非做那种内存压缩,存储方面工作. C语言中动态申请空间 malloc() q=(dlin ...
- 栈的顺序存储 - 设计与实现 - API实现
Stack基本概念 栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 Stack的常用操作 创建栈 销毁栈 清空栈 进栈 出 ...
- C语言- 基础数据结构和算法 - 栈的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
随机推荐
- ssrs 里 表头 分页后显示
1. 列组,箭头,高级 2.点击行组,静态 3. 设置静态行组 属性
- C8051F_CAN
CAN总线特点:基于报文编码而非对节点编码,增删节点对系统没有影响,靠干扰稳定性好,速率高. 小工具:CANtool 收发器:CAN总线收发器CTM1050,通信速率1Mbps,至少可连接110个节点 ...
- 17995 Stupid thief 组合数学
17995 Stupid thief 时间限制:1000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: 不限定 Description A stupid thie ...
- Bootstrap基础知识学习
Bootstrap中文网 http://www.bootcss.com/ Bootstrap菜鸟教程 http://www.runoob.com/bootstrap/bootstrap-tutoria ...
- option标签selected="selected"属性失效的问题
要在select标签上面加上autocomplete="off"关闭自动完成,不然浏览器每次刷新后将自动选择上一次关闭时的option,这样默认属性selected="s ...
- python super详解
一.super() 的入门使用 - 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能, 这时,我们就需要调用父类的方法了,可通过使用 super 来实 ...
- watchguard 软件工程师内部招聘!
作为watchguard正式员工,现发布公司最近的招聘信息,待遇优厚,请符合条件的朋友和我联系并将简历发给我,我会尽早联系公司人力部门. 我的邮件:daibao91888@163.com 博客:htt ...
- Hyperledger Fabric on SAP Cloud Platform
今天的文章来自Wen Aviva, 坐Jerry面对面的程序媛. Jerry在之前的公众号文章<在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图>已经介绍过Aviva ...
- 校内选拔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 ...
- map最基本操作
#include<iostream> #include<map> using namespace std; int main() { /*map<int,char> ...