## 页首HTML代码 ```html

链式栈

数据结构

线性表--链式栈

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


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

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

提高可移植性
链式栈中元素的数据类型为DataType_t,用户可以根据实际情况修改链表中元素的类型
/****************************************************************************
 *
 * file name: 2024-04-25_Linkstack.c
 * author   : tongyaqi1110@163.com
 * date     : 2024-04-25
 * function : 该程序实现链式栈元素的增删改查
 *            为了方便管理链式栈,设计LinkqStack_t结构体,该结构体中包含结点的数据域和指针域
 *
 * note     : None
 *
 * CopyRight (c)   2024  tongyaqi1110@163.com   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            : tongyaqi1110@163.com
 * 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            : tongyaqi1110@163.com
 * 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            : tongyaqi1110@163.com
 * 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            : tongyaqi1110@163.com
 * 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            : tongyaqi1110@163.com
 * 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);
  }
}
posted @ 2024-04-25 22:58  一面小镜子  阅读(26)  评论(0)    收藏  举报