首页 > 其他分享 >链式栈

链式栈

时间:2024-04-25 23:00:30浏览次数:11  
标签:None Head 结点 next LStack 链式 NULL

数据结构

线性表--链式栈

image alt="链式栈" style="zoom:50%;"


链式栈相当于是一个单向不循环的链表。

以下是链式栈的一些基本操作,插入删除以及遍历等。

提高可移植性
链式栈中元素的数据类型为DataType_t,用户可以根据实际情况修改链表中元素的类型
/****************************************************************************
 *
 * file name: 2024-04-25_Linkstack.c
 * author   : [email protected]
 * date     : 2024-04-25
 * function : 该程序实现链式栈元素的增删改查
 *            为了方便管理链式栈,设计LinkqStack_t结构体,该结构体中包含结点的数据域和指针域
 *
 * note     : None
 *
 * CopyRight (c)   2024  [email protected]   All Right Reseverd
 *
 ****************************************************************************/

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 指的是链式栈中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;

// 构造链式栈的结点,链式栈中所有结点的数据类型应该是相同的
typedef struct LinkStack
{
  DataType_t data;        // 结点的数据域
  struct LinkStack *next; // 结点的指针域

} LStack_t;

·创建链式栈

/****************************************************************************
 *
 * function name     : LStack_Create
 * function          : 创建一个链式栈,空栈应该有一个头结点,对链栈进行初始化
 * parameter         : None
 *
 * Return results    : 返回头结点地址
 * note              : None
 * author            : [email protected]
 * date              : 2024-04-25
 * version           : V1.0
 * revision history  : None
 *
 ****************************************************************************/

LStack_t *LStack_Create(void)
{
  // 1.创建一个头结点并对头结点申请内存
  LStack_t *Head = (LStack_t *)calloc(1, sizeof(LStack_t));
  if (NULL == Head)
  {
    perror("Calloc memory for Head is Failed");
    exit(-1);
  }

  // 2.对头结点进行初始化,头结点是不存储有效内容的!!!
  Head->next = NULL;

  // 3.把头结点的地址返回即可
  return Head;
}

·链栈中创造新的结点

/****************************************************************************
 *
 * function name     :LStack_NewNode
 * function          : 创建新的结点,并对新结点进行初始化(数据域 + 指针域)
 * parameter         : None
 *
 * Return results    : 返回新结点地址。
 * note              : None
 * author            : [email protected]
 * date              : 2024-04-25
 * version           : V1.0
 * revision history  : None
 *
 ****************************************************************************/

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;
}

·入栈

/****************************************************************************
 *
 * function name     : LStack_HeadPush
 * function          : 创建新的结点,入栈
 * parameter         : None
 *
 * Return results    : 返回成功或者失败。
 * note              : None
 * author            : [email protected]
 * date              : 2024-04-25
 * version           : V1.0
 * revision history  : None
 *
 ****************************************************************************/

bool LStack_Push(LStack_t *Head, DataType_t data)
{
  // 1.创建新的结点,并对新结点进行初始化
  LStack_t *New = LStack_NewNode(data);
  if (NULL == New)
  {
    printf("can not insert new node\n");
    return false;
  }

  // 2.判断链栈是否为空,如果为空,则直接插入即可
  if (Head->next == NULL)
  {
    Head->next = New;
    return true;
  }
  // 3.如果链栈为非空,则把新结点插入到链栈的顶部
  New->next = Head->next;
  Head->next = New;
  return true;
}


·出栈

/****************************************************************************
 *
 * function name     :  LStack_Pop
 * function          : 删除栈中元素(出栈)
 * parameter         : None
 *
 * Return results    : 返回成功或者失败。
 * note              : None
 * author            : [email protected]
 * date              : 2024-04-25
 * version           : V1.0
 * revision history  : None
 *
 ****************************************************************************/

bool LStack_Pop(LStack_t *Head)
{
  // 1.判断链表是否为空,如果为空,直接返回
  if (NULL == Head->next)
  {
    return false;
  }
  // 2.判断链表是否只有一个结点,如果只有一个结点,则直接删除该结点
  if (Head->next->next == NULL)
  {
    free(Head->next);
    Head->next = NULL;
    return true;
  }
  // 如果非空,则删除第一个结点,也就是首结点
  LStack_t *Phead = Head->next; // 备份首结点

  Head->next = Phead->next;
  Phead->next = NULL;
  free(Phead);

  return true;
}

·遍历

/****************************************************************************
 *
 * function name     : LStack_Print
 * function          : 遍历输出链栈节点的数据
 * parameter         : None
 *
 * Return results    : None
 * note              : None
 * author            : [email protected]
 * date              : 2024-04-25
 * version           : V1.0
 * revision history  : None
 *
 ****************************************************************************/

void LStack_Print(LStack_t *Head)
{
  // 1.判断链栈是否为空
  if (NULL == Head->next)
  {
    printf("Linstack is empty,can not do nothing!\n");
    return;
  }
  // 2.遍历链栈
  // 链栈的头文件的地址进行备份
  LStack_t *Phead = Head;

  // 首结点
  while (Phead->next)
  {
    // 把头的直接后继作为新的头结点
    Phead = Phead->next;
    // 输出头结点的直接后继的数据域
    printf("data = %d\n", Phead->data);
  }
}

标签:None,Head,结点,next,LStack,链式,NULL
From: https://www.cnblogs.com/little-mirror/p/18158847

相关文章

  • 以链表作为基础实现栈空间(链式栈)
    数据结构以链表作为基础实现栈空间(链式栈)/****************************************************************************************************************** * filename : LinkedStack.c* author : [email protected]* data : 2024/04/25* function : 链式栈......
  • 链式栈
    数据结构链式栈/***************************************************************************************filename:1.c*author: [email protected]*date:2024/04/25*function: 顺序栈元素的增删改查*note:该程序目的......
  • 链式栈
    以链表作为基础实现栈空间(链式栈)/**********************************************************************************filename:LinkedStack.c*author:[email protected]*date:2024/04/25*function:实现链式栈的入栈(Push)与出栈(Pop)......
  • C语言数据结构:链式栈及其出入栈
    /***********************************************************************************************************实现链式栈一般是以链表作为基础,一般是把链表头部作为栈顶,方便数据的插入和删除,链式栈相当于是一个单向不循环的链表。****Copyright(c)2023-2......
  • 链式栈————出栈、入栈
    以链表作为基础实现栈空间(链式栈)如果打算实现链式栈,一般是以链表作为基础,一般是把链表头部作为栈顶,方便数据的插入和删除(头插+头删),链式栈相当于是一个单向不循环的链表。链式栈要注意的点:出栈要考虑栈是否为空入栈要考虑栈中是否有数据以下是我的代码:/******************......
  • 挑战前端基础120题--JavaScript 中如何实现链式调用的函数?
    一.何为链式调用?链式调用是一种简化过程的编码方式,使代码看起来更加简洁~它允许你通过在方法调用之间返回对象本身,从而连续地调用多个方法;比较常见的链式调用:jQuery,Promise等,通过多次书写.或()操作来调用。二.实现的原理?每次执行完成后返回自己/新的自己,这样可以确保后续的......
  • 栈2: 链式存储
    栈2:栈的链式存储栈的结点//链式栈的结点typedefstructLINKNODE{structLINKNODE*next;}LinkNode;链式栈的结构//链式栈typedefstructLINKSTACK{LinkNodehead;intsize;}LinkStack;栈的初始化LinkStack*Init_LinkStack(){LinkStack*s......
  • 队列链式实现
    链式存储实现的队列:链队列typedefstructLinkNode{//链式队列结点ElemTypedata;structLinkNode*next;}LinkNode;typedefstruct{//链式队列LinkNode*front,*rear;//队列的队头和队尾指针}LinkQueue;带头结点:不......
  • C语言链表:链式魔法,数据之美
    导入链表,作为C语言中一种基础且重要的数据结构,以其独特的方式组织和存储数据,成为了解决许多复杂问题的关键。下面,我们将更具体地探讨C语言链表的各个方面。一、链表的基本结构链表由一系列节点组成,每个节点通常包含两部分:数据域和指针域。数据域用于存储实际的数据,而指针域......
  • 链式队列实现
    typedefstructlist//创建队列中的链式结构{ datatypedata;//数据域 structlist*next;//指针域}list;typedefstructqueue//创建队列{ list*front;//队头 list*rear;//队尾}queue;voidinitqueue(queue*q)//初始化队列{ q->front=q->rear=(list*)mal......