C语言链表实现堆栈(0基础也能学会)

C语言链表实现堆栈(0基础也能学会),第1张

 C语言用链表实现堆栈(详细版)小白专用

所谓堆栈就是先入后出(FILO)的一种数据结构,在递归函数,回溯算法等领域广泛应用。


首先,我们用链表实现堆栈,就需要建立一个堆栈链表的结构体。


因为需要用到标准输入输出函数,同时需要申请动态空间,因此我们需要引入头文件,如下图所示。


#include
#include
struct Snode
{
	int data;    //结点由数据构成
	struct Snode* Next;   //同时一个结点还包括指针域
};

前面基础准备工作做完后,我们就可以进行堆栈的构建

struct Snode* Push()
{
	struct Snode* s = malloc(sizeof(struct Snode));  //构建一个堆栈的头节点
	s->Next = NULL;                 //将堆栈的头节点指针域指向空
	int val = -1;                  //设置一个数字,作为输入结束的标志(当然这里val值随意设定)
	while (1)                      //下面进行循环入栈
	{
		scanf_s("%d", &val);                                     //输入一个值,令其存在val中
		if (val == -1)          //如果输入的值为-1则跳出循环
		{
			break;
		}
		struct Snode* TmpCell = malloc(sizeof(struct Snode));    //建立一个新的结点TmpCell
		TmpCell->data = val;                          //将输入的每一个值存入新建立的结点中
		TmpCell->Next = s->Next;               //为新的结点建立指针指向,即放入到堆栈里
		s->Next = TmpCell;                     //将头节点的下一项指向新结点
	}                              //以此为循环,建立新节点,pop如新结点,一个堆栈就这样构成了
	return s;                     //最后我们返回堆栈的头节点,就能获取到整个堆栈的全部信息

}

对于上面这段代码,做一下解释,上面这段代码,对于每建立一个新的结点,头结点的下一项都会指向这个新的结点,这样一来,我们一旦获取到头节点,就能得知后放入的元素,相当于先建立的结点,在后面;最后建立的结点紧靠着头节点,这样一来,我们在出栈的时候,只需要用到头节点,就能将全部栈内元素输出。


void Pop(struct Snode* s)   //出栈的时候,需要传入栈的头节点
{
	struct Snode* pCurrent = malloc(sizeof(struct Snode)); //设立一个辅助的结点pCurrent
	
	pCurrent = s->Next;    //令辅助指针指向头节点的下一项
	while (pCurrent != NULL)
                         //下面遍历取出栈内的元素,若pCurrent不等于空,说明没有到链表的最后一项
	{
		printf("%d ", pCurrent->data);    //打印输出,辅助结点对应的数值
		pCurrent = pCurrent->Next;        //每打印完后,辅助结点向后移动,读取下一个结点
	}

}

 当然,出栈以后可以加上free函数,释放结点占用的空间,这里就不再赘述了。


最后我们建立一个主函数,用来测试我们的堆栈

int main()
{
	printf("入栈:\n");
	struct Snode* s=Push();   //头节点的创建
	printf("出栈:\n");
	Pop(s);    //传入堆栈头结点
	return 0;
}

我们运行程序试试看!

 我们输入10 20 30 40 50 60 70 80 90 100然后输入终止的标志-1

此时,我们就会发现先输入数据的后输出了,我们的堆栈实现成功~

才疏学浅,难免有错误和不当之处,欢迎交流批评指正!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存