首页 > 其他分享 >链式栈设计

链式栈设计

时间:2024-04-28 21:22:18浏览次数:20  
标签:结点 Top next LStack 链式 设计 NULL PTop

链式栈接口设计

/**
* @name: 链式栈接口设计
* @brief
* @author [email protected]
* @date 2024/04/28
* @version 1.0 :版本
* @property :类比于顺序栈,链式栈也有一个栈顶和栈底。根据链式表特性,将第一个插入的值作为栈底,即尾节点作为栈底。首节点作为栈顶。
* @note
* CopyRight (c) 2023-2024 [email protected] All Right Reseverd
*/


typedef int DataType_t;	 // 指的是链式栈中的结点有效数据类型

//构造链式结点
typedef struct LinkStack // 构造结点,链表中所有结点的数据类型应该是相同的
{
	DataType_t data;		// 结点的数据域
	struct LinkStack *next; // 结点的指针域
} LStack_t;
LStack_t *LStack_Create(void) // 创建一个空链表,空链表应该有一个头结点,对链表进行初始化
{
	// 1.创建一个头结点即栈顶并对头结点申请内存
	LStack_t *Top = (LStack_t *)calloc(1, sizeof(LStack_t));
	if (NULL == Top)
	{
		perror("Calloc memory for Top is Failed");
		exit(-1);
	}
	// 2.对头结点进行初始化,不存储有效内容,因此数据域初始化为0
	Top->next = NULL;
	Top->data = 0;
	// 3.把头结点的地址返回即可
	return Top;
}


//创建新的结点
LStack_t *LStack_NewNode(DataType_t data)
{
	// 1.创建一个新结点并对新结点申请内存
	LStack_t *New = (LStack_t *)calloc(1, sizeof(LStack_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}
	// 2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;
	return New;
}

//入栈
bool LStack_Push(LStack_t *Top, DataType_t data)
{
	// 1.创建新的结点,并对新结点进行初始化
	LStack_t *New = LStack_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}
	/* 此处考虑两种情况,如果链表为空或者非空:
	1.如果为空,即满足Top->next==NULL;
	2.如果为非空,Top->next!=NULL,用下述代码也能满足;
	综上,可以不用if语句判断是否为空链表。
	*/
	New->next = Top->next;
	Top->next = New;
	return true;
}

//出栈
bool LStack_Pop(LStack_t *Top)
{
	// 对首节点的地址进行备份
	LStack_t *PTop = Top->next;
	if (NULL == PTop) // 判断是否为空表 judge is this a empty list.
	{
		printf("This is a empty list.\n");
		return false;
	}
	/* 此处考虑两种情况,如果链表仅有一个元素或一个以上的元素:
	1.如果仅有一个元素,即满足PTop->next==NULL;
	2.如果为非空,PTop->next!=NULL,用下述代码也能满足;
	综上,可以不用if语句判断是否为仅有一个元素。
	*/
	Top->next = PTop->next;
	PTop->next = NULL;
	free(PTop);
	return true;
}

//链表整体释放
bool LStack_Free(LStack_t *Top) // 实现链式栈的整体释放
{
	// 对首节点的地址进行备份
	if (Top == NULL)
	{
		printf("The list doesn't exist.\n");
		return false;
	}
	LStack_t *PTop;
	while (Top)
	{
		PTop = Top;
		Top = Top->next;
		free(PTop);
	}
	return true;
}

//链式栈元素展示
void LStack_Print(LStack_t *Top)
{
	LStack_t *PTop = Top; // 对链表的头文件的地址进行备份
	if (Top == NULL)
	{
		printf("The list doesn't exist.\n");
		return;
	}
	printf("4\n");
	while (PTop->next) // 判断是否为空链表
	{
		// 把头的直接后继作为新的头结点
		PTop = PTop->next;
 
		// 输出头结点的直接后继的数据域
		printf("data = %d  ", PTop->data);
	}
}


//验证
int main(int argc, char const *argv[])
{
	LStack_t *H = (LStack_t *)calloc(1, sizeof(LStack_t));
	LStack_Push(H, 10);
	LStack_Push(H, 20);
	LStack_Push(H, 30);
	LStack_Print(H);
	LStack_Pop(H);
	LStack_Print(H);
	LStack_Free(H);
	return 0;
}

标签:结点,Top,next,LStack,链式,设计,NULL,PTop
From: https://www.cnblogs.com/CamelliaWY/p/18164502

相关文章

  • 原理图与PCB设计
    原理图与PCB制作1PCB(印刷电路板)介绍2嘉立创EDA安装和配置EDA:工程命名:一般是名称加-版本号(v0.0.1)_日期3PCB快速入门3.1原理图绘制1.搜索元器件(Shift+F或者底部“库”菜单)2.放置元器件3.元器件摆放4.连线(快捷默认Alt+W,改为W)5.翻转、调整6.DRC检查3......
  • 状态设计模式
    为什么使用这个状态设计模式?在预约下单模块设计订单状态的时候有7种,用户下单之后变更为待支付,如果取消订单就修改为已取消,如果支付了就修改为派单中,之后服务人员和机构进行抢单或派单修改为待服务、开始服务修改为服务中、订单完成之后修改为已完成。如果有一处用户想取消订单,需......
  • 动画毕业设计渲染加速:云渲染技术如何助力学生作品
    ​随着毕业季的临近,动画和CG专业的学生们正如火如荼地投入到毕业作品的制作中。面对动画渲染这一耗时且技术要求高的环节,云渲染农场以其高效、经济的特点,成为了学生们的优选解决方案。接下来,让我们一起深入了解如何选择渲染器与云渲染农场,轻松应对毕业作品的渲染挑战吧。一、动......
  • 自动驾驶半实物仿真平台设计方案:827-8路GMSL视频注入回灌的自动驾驶半实物仿真平台
    8路GMSL视频注入回灌的自动驾驶半实物仿真平台一、平台介绍   产品基于8路GMSL视频注入回灌的自动驾驶半实物仿真平台旨在提高实验室及研究生院师生在基础软件层开发、计算机视觉和深度学习方面的专业知识学习和实践能力,为师生提供一个稳定软件开发和多精度框......
  • 采集记录仪设计方案:926-基于PCIe的40Gbps光纤采集记录仪
    基于PCIe的40Gbps光纤采集记录仪   ORI-D2000信号记录仪是一款便携式记录仪产品,满足高达40GBps的数据存储速度、可扩展的大容量存储设备和配套的录取存储管理软件。主要特点  1、基本系统内存64GB,存储容量为7.6T,可扩展至四个盘位。  2、包含一张FPG......
  • 如何设计质量规划方案?
    技术交流群有同学问了这样一个问题:测试团队的整体质量规划如何设计?又是一个看似很务虚但实际上很有必要的问题。特别是在当下这个大家都提倡降本增效的时候,好的质量规划设计的重要性就更明显。结合我自己的实践经验以及给一些公司做技术规划的案例,这篇文章分享一些质量规划的思......
  • 简约不简单:Model 3芯片双层PCB设计,HMI控制器高效升级!
    产品高性能和可靠性的需求日益增长,特别是在工业应用领域中,这些要求更是严苛。为了满足这些不断升级的需求,启明智显推出了全新的Model3芯片。这款芯片以其卓越的性能和强大的功能,被设计用作人机界面(HMI)产品的主控制器,为HMI产品提供了强大的技术支持。Model3芯片【Model3芯片......
  • 如何写接口设计文档?
    小系统或单个模块的设计文档一、「一句话描述」的标题文件名或标题最好使用「一句话描述」,如:观测云新Event数据结构及处理逻辑设计观测云云关联处理逻辑设计二、业务流程对业务流程进行描述,具体写明「用户做了什么操作,系统进行了什么处理,最后发生了什么」。一般是流程图......
  • 系统整容纪:责任链设计模式的应用实战(爆灯了,研发工期由45天降为1天)
    本文通过介绍使用责任链设计模式的背景和经历,来使得读者加深对于此设计模式的印象,甚至受到一定的启发来对自己当下所参与、所负责的项目进行“整容”,从而提升系统的“美感”。分享工作中的点点滴滴。一、背景在下所负责的系统中有这么一个模块,分区模块,直接看这个词的话相信很......
  • Paper——可容错的虚拟机实践系统设计.18162229
    目标:通过主备复制手段设计一个可容错的VM,用于用户运行企业级程序。primary日常工作,一旦它宕机,和它保持lock-step的backup会立刻顶上,外界观察不到这些操作,我们制造了只有一台VM永远在正常运行的假象。要考虑的点:使用什么手段保持primary和backup严格同步在虚拟化单核CPU时和多......