栈-线性表(代码、分析、汇编)

目录:

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

代码:

LinkList.h

#ifndef _LINKLIST_H_
#define _LINKLIST_H_typedef void LinkList;  //定义链表类型
typedef struct _tag_LinkListNode LinkListNode;//定义链表节点类型
struct _tag_LinkListNode
{LinkListNode* next;
};LinkList* LinkList_Create();void LinkList_Destroy(LinkList* list);void LinkList_Clear(LinkList* list);int LinkList_Length(LinkList* list);int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);LinkListNode* LinkList_Get(LinkList* list, int pos);LinkListNode* LinkList_Delete(LinkList* list, int pos);#endif

LinkList.c

#include <stdio.h>
#include <malloc.h>
#include "LinkList.h"typedef struct _tag_LinkList//定义实际使用链表类型
{LinkListNode header;//头节点int length;
} TLinkList;LinkList* LinkList_Create()//定义链表创建函数
{TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));if( ret != NULL )//创建成功{ret->length = 0;ret->header.next = NULL;}return ret;//返回链表指针
}void LinkList_Destroy(LinkList* list) //定义链表销毁函数
{free(list);
}void LinkList_Clear(LinkList* list)//定义链表清空重设函数
{TLinkList* sList = (TLinkList*)list;if( sList != NULL )//链表不为空{sList->length = 0;sList->header.next = NULL;}
}int LinkList_Length(LinkList* list) //定义获取链表长度函数
{TLinkList* sList = (TLinkList*)list;int ret = -1;if( sList != NULL )//链表不为空{ret = sList->length;}return ret;
}int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) //定义插入节点函数
{ TLinkList* sList = (TLinkList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL);//判断表不为空与pos正常与插入的节点不为空int i = 0;if( ret ){LinkListNode* current = (LinkListNode*)sList;//指向头节点//找到新插入节点的前一个节点//current->next ==NULL 表示 是第一个插入的节点 或 pos 大于当前表长度就是插入到最后一个位置了for(i=0; (i<pos) && (current->next != NULL); i++){current = current->next;}node->next = current->next;//新插入节点的next等于本来在该位置的节点current->next = node;//新插入节点的前一个节点的next等于新插入节点sList->length++;//长度增加}return ret;
}LinkListNode* LinkList_Get(LinkList* list, int pos) //定义获取节点函数
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判断表不为空与pos是否在范围内{LinkListNode* current = (LinkListNode*)sList;//指向头节点for(i=0; i<pos; i++)//找到前一个节点 {current = current->next;}ret = current->next;//取得获取节点}return ret;
}LinkListNode* LinkList_Delete(LinkList* list, int pos) //定义删除节点函数
{TLinkList* sList = (TLinkList*)list;LinkListNode* ret = NULL;int i = 0;if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )//判断表不为空与pos是否在范围内{LinkListNode* current = (LinkListNode*)sList;//指向头节点for(i=0; i<pos; i++)//找到删除节点的前一个节点{current = current->next;}ret = current->next;//取得删除节点current->next = ret->next;//将删除节点前一个节点的next指向删除节点的下一个节点sList->length--;//长度减少}return ret;
}

LinkStack.h

#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_typedef void LinkStack;//定义栈类型LinkStack* LinkStack_Create();//声明创建栈函数void LinkStack_Destroy(LinkStack* stack);//声明销毁栈函数void LinkStack_Clear(LinkStack* stack);//声明清空栈函数int LinkStack_Push(LinkStack* stack, void* item);//声明添加数据进栈函数void* LinkStack_Pop(LinkStack* stack);//声明取出数据出栈函数void* LinkStack_Top(LinkStack* stack);//声明获取栈顶数据函数不移除节点int LinkStack_Size(LinkStack* stack);//声明获取栈当前大小函数#endif

LinkStack.c

#include<stdio.h>
#include <malloc.h>
#include "LinkStack.h"
#include "LinkList.h"//注意: 该栈只给链表套多一层调用线性链表的函数typedef struct _tag_LinkStackNode//定义栈节点类型
{//注意 :栈只是将在链表的模式下的节点的信息封装在该文件了,不在main.c定义了LinkListNode header;//头节点 void* item;//指向插入数据的地址 
} TLinkStackNode;LinkStack* LinkStack_Create()//定义创建栈函数
{return LinkList_Create();//调用链表创建函数一个链表
}void LinkStack_Destroy(LinkStack* stack)//定义销毁栈函数
{LinkStack_Clear(stack);//先清空栈内数据LinkList_Destroy(stack);//再调用链表销毁函数,销毁该链表
}void LinkStack_Clear(LinkStack* stack)//定义清空栈函数
{while( LinkStack_Size(stack) > 0 )//如果栈内还有数据全部取出来{LinkStack_Pop(stack);}
}//第二个参数是传进来是变量地址 
int LinkStack_Push(LinkStack* stack, void* item)//定义添加数据进栈函数 
{   //注意:这个节点是动态添加,不用时要释放内存TLinkStackNode* node = (TLinkStackNode*)malloc(sizeof(TLinkStackNode));//申请新创一个节点int ret = (node != NULL) && (item != NULL);//判断是否创建成功与插入数据是否正常if( ret ){node->item = item;//将传来的变量地址给新创建的节点存放的数据赋值//插入链表第一个位置,到时取出就取第一个位置,实现先进后出ret  = LinkList_Insert(stack, (LinkListNode*)node, 0);}if( !ret )//如果插入不成功{free(node);//将刚申请的节点空间释放}return ret;
}void* LinkStack_Pop(LinkStack* stack)//定义取出数据出栈函数
{//调用链表删除函数 第一个位置的节点,因为会返回删除节点TLinkStackNode* node = (TLinkStackNode*)LinkList_Delete(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示栈内还有元素{ret = node->item;//取得节点内数据地址free(node);//释放该节点}return ret;//返回节点内的数据地址
}void* LinkStack_Top(LinkStack* stack)//定义获取栈顶数据函数不移除节点
{TLinkStackNode* node = (TLinkStackNode*)LinkList_Get(stack, 0);void* ret = NULL;if( node != NULL )//如果成功 ,表示栈内还有元素{ret = node->item;//取得节点内数据地址}//注意:没有释放移除节点的,节点还在return ret;//返回节点内的数据地址
}int LinkStack_Size(LinkStack* stack)//定义获取栈当前大小函数
{return LinkList_Length(stack);
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"int main(int argc, char *argv[]) 
{LinkStack* stack = LinkStack_Create();int a[10];int i = 0;for(i=0; i<10; i++){a[i] = i;LinkStack_Push(stack, a + i);}printf("Top: %d\n", *(int*)LinkStack_Top(stack));printf("Length: %d\n", LinkStack_Size(stack));while( LinkStack_Size(stack) > 0 ){printf("Pop: %d\n", *(int*)LinkStack_Pop(stack));}LinkStack_Destroy(stack);getchar();return 0;
}

分析:

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

汇编:

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

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

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

相关文章

Java IdentityHashMap isEmpty()方法与示例

IdentityHashMap类isEmpty()方法 (IdentityHashMap Class isEmpty() method) isEmpty() method is available in java.util package. isEmpty()方法在java.util包中可用。 isEmpty() method is used to check whether this IdentityHashMap is "empty" or "not …

datatable序列化为string

代码 privatestaticstringSerializeDataTableXml(DataTable pDt){ //序列化DataTableStringBuilder sb newStringBuilder(); XmlWriter writer XmlWriter.Create(sb); XmlSerializer serializer newXmlSerializer(typeof(DataTable)); serializer.Serialize(writer, pD…

C#常用输出格式

输出方法Console. WriteLine( ) Console. WriteLine()方法将数据输出到屏幕并加上一个回车换行符(若不加回车换行 符&#xff0c;可用Console. Write()方法)。 该方法类似于C语言中的printf()函数, 可以采用“{N[,M][:格式化字符串]}”的形式格式化输出字符串,其中的参数含义如…

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

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_typedef void SeqList;//定义顺序表类型 typedef void SeqListNode;//定义顺序表节点类型SeqList* SeqList_Create(int capacity);voi…

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;也就是说蜜蜂依靠这样的方式构成…