栈-顺序表(代码、分析、汇编)

目录:

    • 代码:
    • 分析:
    • 汇编:

代码:

SeqList.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_typedef void SeqList;//定义顺序表类型
typedef void SeqListNode;//定义顺序表节点类型SeqList* SeqList_Create(int capacity);void SeqList_Destroy(SeqList* list);void SeqList_Clear(SeqList* list);int SeqList_Length(SeqList* list);int SeqList_Capacity(SeqList* list);int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);SeqListNode* SeqList_Get(SeqList* list, int pos);SeqListNode* SeqList_Delete(SeqList* list, int pos);#endif

SeqList.c

#include <stdio.h>
#include <malloc.h>
#include "SeqList.h"typedef unsigned int TSeqListNode;//定义实际使用的顺序表节点类型typedef struct _tag_SeqList //定义实际使用的顺序表类型
{int capacity;//容量int length;//当前长度长度TSeqListNode* node; //节点指针(数组)
} TSeqList;SeqList* SeqList_Create(int capacity) //定义创建表函数
{TSeqList* ret = NULL;if( capacity >= 0 ){ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);}if( ret != NULL )//如果创建成功{ret->capacity = capacity;//容量赋值ret->length = 0;//当前长度赋值ret->node = (TSeqListNode*)(ret + 1);//表内的指针等于第一个节点}return ret;//返回新建表
}void SeqList_Destroy(SeqList* list) //定义销毁表函数
{free(list);
}void SeqList_Clear(SeqList* list) //定义清空重设表函数
{TSeqList* sList = (TSeqList*)list;if( sList != NULL ){sList->length = 0;//重设置0}
}int SeqList_Length(SeqList* list) //定义获取表当前长度函数
{TSeqList* sList = (TSeqList*)list;int ret = -1;if( sList != NULL ){ret = sList->length;//获取当前表长度}return ret;//返回长度
}int SeqList_Capacity(SeqList* list) //定义获取表容量函数
{TSeqList* sList = (TSeqList*)list;int ret = -1;if( sList != NULL ){ret = sList->capacity;//获取容量}return ret;//返回容量
}int SeqList_Insert(SeqList* list, SeqListNode* node, int pos) //定义插入节点函数
{TSeqList* sList = (TSeqList*)list;int ret = (sList != NULL);int i = 0;ret = ret && (sList->length + 1 <= sList->capacity);//判断表是否为空与表是否有节点插入新节点ret = ret && (0 <= pos);//判断pos是否正常if( ret ){if( pos >= sList->length )//如果pos大于当前长度{pos = sList->length;//将插入位置设为最后一位}for(i=sList->length; i>pos; i--)//节点数据后移{sList->node[i] = sList->node[i-1];}sList->node[i] = (TSeqListNode)node;//将地址转成使用的表节点类型(数值)赋给节点sList->length++;//长度增加}return ret;
}SeqListNode* SeqList_Get(SeqList* list, int pos)//定义获取节点数据函数
{TSeqList* sList = (TSeqList*)list;SeqListNode* ret = NULL;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判断表是否为空与pos是否在范围{ret = (SeqListNode*)(sList->node[pos]);//获取节点数据}return ret;
}SeqListNode* SeqList_Delete(SeqList* list, int pos)//定义删除表节点函数 
{TSeqList* sList = (TSeqList*)list;SeqListNode* ret = SeqList_Get(list, pos);//取得要删除节点int i = 0;if( ret != NULL )//节点不为空{for(i=pos+1; i<sList->length; i++)//节点数据前移更改要删除节点数据{sList->node[i-1] = sList->node[i];}sList->length--;//长度减少}return ret;//返回删除节点
}

SeqStack.h

#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_Top(SeqStack* stack);int SeqStack_Size(SeqStack* stack);int SeqStack_Capacity(SeqStack* stack);#endif

SeqStack.c

#include "SeqStack.h"
#include "SeqList.h"//注意: 该栈只是套多一层调用顺序表的函数SeqStack* SeqStack_Create(int capacity)//定义创建栈函数
{return SeqList_Create(capacity);//调用创建顺序表函数
}void SeqStack_Destroy(SeqStack* stack)//定义销毁栈函数
{SeqList_Destroy(stack);//调用销毁顺序表函数
}void SeqStack_Clear(SeqStack* stack)//定义清除栈函数
{SeqList_Clear(stack);//调用清除顺序表函数
}int SeqStack_Push(SeqStack* stack, void* item)//定义添加数据到栈(进栈)
{return SeqList_Insert(stack, item, SeqList_Length(stack));//调用顺序表插入函数,始终插入到最后一个位置
}void* SeqStack_Pop(SeqStack* stack)//定义取出数据从栈(出栈)
{return SeqList_Delete(stack, SeqList_Length(stack) - 1);//调用顺序表删除函数。删除最一个节点,因为返回删除节点
}void* SeqStack_Top(SeqStack* stack)//定义取出数据(不称除节点)
{return SeqList_Get(stack, SeqList_Length(stack) - 1);//调用顺序表获取最一个节点数据
}int SeqStack_Size(SeqStack* stack)//定义获取当前栈长度函数
{return SeqList_Length(stack);//调用获取顺序表长度函数
}int SeqStack_Capacity(SeqStack* stack)//定义获取栈容量函数
{return SeqList_Capacity(stack);
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "SeqStack.h"int main(int argc, char *argv[]) 
{SeqStack* stack = SeqStack_Create(20);int a[10];int i = 0;for(i=0; i<10; i++){a[i] = i;SeqStack_Push(stack, a + i);}printf("Top: %d\n", *(int*)SeqStack_Top(stack));printf("Capacity: %d\n", SeqStack_Capacity(stack));printf("Length: %d\n", SeqStack_Size(stack));while( SeqStack_Size(stack) > 0 ){printf("Pop: %d\n", *(int*)SeqStack_Pop(stack));}SeqStack_Destroy(stack);return 0;
}

分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汇编:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlserver 数据库日志文件过大的问题

USE[master] GO ALTER DATABASE 【数据库】 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 【数据库】 SET RECOVERY SIMPLE --简单模式 GO USE 【数据库】 GO DBCC SHRINKFILE (N【数据库日志文件名&#xff08;如&#xff1a;msdb_log&#xff09;】 , 11, TRUNCATE…

SQl Server存储过程基础

一、存储过程的概念 存储过程是SQL语句和可选控制流语句的预编译集合&#xff0c;存储在数据库中&#xff0c;可由应用程序通过一个调用执行&#xff0c;而且允许用户声明变量、有条件执行以及其他强大的编程功能。 在SQL Server中存储过程分为两类&#xff1a;即系统提供的存储…

isinfinite_Java Double类isInfinite()方法与示例

isinfinite双类isInfinite()方法 (Double class isInfinite() method) isInfinite() method is available in java.lang package. isInfinite()方法在java.lang包中可用。 isInfinite() method is used to check infinity (i.e. either positive infinity or negative infinity…

MySql学习(一)

SQL语句的分类&#xff1a;DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操作语言&#xff09;、DCL&#xff08;数据控制语句&#xff09;MySql的命令语句以&#xff1b;或\g结束建库&#xff1a;Create database name;建表&#xff1a;Create tablle name;选…

C盘爆红的解决办法

方法一&#xff1a;开始—>搜索—>cleanmgr—>磁盘清理—>选择你所需要清理的磁盘即可 方法二&#xff1a;我的电脑右击—>管理—>磁盘管理—>右键选择你要压缩的磁盘—>压缩卷—>输入压缩空间量—>压缩—>右键 拓展卷—>下一步—>输入…

栈应用_检测成对符号是否正确使用(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c LinkStack.h LinkStack.c 栈-线性表 main.c #include <stdio.h> #include <stdlib.h> #include "LinkStack.h"//该程序是检查字符串中的出…

Oracle 参数分类 和 参数的查看方法

Oracle数据库系统根据初始化参数文件init.ora中设置的参数来配置自身的启动&#xff0c;每个实例在启动之前&#xff0c;首先读取这些参数文件中设置的不同参数。 Oracle系统中的参数&#xff0c;根据系统使用情况可以简单分为两大类&#xff1a; 普通参数&#xff1a;也就是Or…

java 方法 示例_Java集合checkedList()方法与示例

java 方法 示例集合类checkedList()方法 (Collections Class checkedList() method) checkedList() Method is available in java.lang package. CheckedList()方法在java.lang包中可用。 checkedList() Method is used to return the typesafe view of the given List at runt…

ParameterizedTypeImpl

关于“通过反射获得泛型的参数化类型”的问题&#xff1a; 下面是张老师 通过反射获得泛型的参数化类型的一段代码import java.util.*; import java.lang.reflect.*;public class GenericalReflection { private Vector<Date> dates new Vector<Date>(); public v…

Spyder打开报错解决办法

删除C:\Users\Administrator路径下.matplotlib和.spyder-py3&#xff08;你的有可能是.spyder2或.spyder3&#xff09;这两个文件夹&#xff0c;然后再重启Spyder即可 &#xff08;本人也是查找多篇大佬博客然后最后找到的解决方法&#xff09;

ERP软件销售的方法论--SPIN销售法(SPIN Selling)

有许多人一直在做的ERP软件产品的销售&#xff0c;也接受了许多关于销售方法的培训&#xff0c;我所了解的就包括有C139&#xff0c;用友的《策略九问》等方法&#xff0c;但其实行业内早就有先驱创立了相关的销售方法&#xff0c;那就是SPIN销售法&#xff0c;之前一直都是只知…

ffmpeg - AVPacket内存问题分析(AVFrame一样的)

目录&#xff1a;1、av_packet_alloc()和av_packet_free()2、av_init_packet()的问题3、av_packet_move_ref()的问题4、av_packet_clone()的问题5、AVPacket的引用计数问题6、 AVFrame一样的1、av_packet_alloc()和av_packet_free() 源码中av_packet_unref()调用av_buffer_unre…

Java类class isSynthetic()方法及示例

类的类isSynthetic()方法 (Class class isSynthetic() method) isSynthetic() method is available in java.lang package. isSynthetic()方法在java.lang包中可用。 isSynthetic() method is used to check whether this Class is a synthetic class or not. isSynthetic()方法…

BNU OJ 第26303 题 Touchscreen Keyboard

BNU OJ第26303题Touchscreen Keyboard&#xff08;题目链接&#xff09;的解题报告。 原题如下&#xff1a; Touchscreen Keyboard Problem Description Nowadays, people do not use hardware keyboards but touchscreens. Usually, they touch on the wrong letters with the…

列表(二)

1&#xff0c;什么是列表&#xff1f; 列表由一系列按特定顺序排列的元素组成。得知列表内的元素是有序的。 在Python中&#xff0c;用方括号&#xff08;[]&#xff09;来表示列表&#xff0c;并用逗号来分隔其中的元素。 color [red,blue,black,yellow]#定义一个字符串列表…

Zigbee在.Net Micro Framework系统中的应用

Zigbee是IEEE 802.15.4协议的代名词。根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞&#xff0c;由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息&#xff0c;也就是说蜜蜂依靠这样的方式构成…

ffmpeg-AVFrame分配内存问题

目录&#xff1a;1、格式&#xff1a;交错式2、格式&#xff1a;平坦式3、总结&#xff1a;1、格式&#xff1a;交错式 LRLRRLRLRLRLRLRLRLR 2、格式&#xff1a;平坦式 LLLLLLRRRRRR 3、总结&#xff1a; 两种方式的内存排列在AVFrame中分配是有区别的 交错式在一个buf…

stl中map函数_map :: empty()函数以及C ++ STL中的Example

stl中map函数C STL映射:: empty() (C STL map::empty()) It is built-in function in C STL and used to check whether the map container is empty or not i.e whether its size is 0 or not? 它是C STL中的内置函数&#xff0c;用于检查地图容器是否为空&#xff0c;即其…

C#使用Dotfuscator混淆代码以及加密

C#编写的代码如果不进行一定程度的混淆和加密&#xff0c;那么是非常容易被反编译进行破解的&#xff0c;特别是对于一些商业用途的C#软件来说&#xff0c;因为盯着的人多&#xff0c;更是极易被攻破。使用Dotfuscator可以实现混淆代码、变量名修改、字符串加密等功能。 这里介…

操作列表(三)

1&#xff0c;for循环(for 变量名 in 列表名:) phone [iphone 8, xiaomi10pro, huaweiv30pro, honor20, jianguopro]#定义一个列表phone for tel in phone:print("手机的类型为&#xff1a;" tel.title())#当然这里的每个元素也可以调用title()等一些方法 print(&…