数据结构day6(链栈)

 链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。

顺序栈存在栈满的情况,适用于数据量较小时,使用不方便,引出链栈,

链栈的最大特点没有满。

链栈的插入和删除

头插和头删:头结点等价于栈的栈顶

尾插和尾删:尾结点等价于栈顶

 head.h

#ifndef __LE_H__
#define __LE_H__

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

typedef int datedef;

typedef struct
{
  char name[20];
  int age;
  int score;
} student;

typedef struct Node
{
  union // 数据域
  {
    int len;      // 头结点的数据域 (链表长度)
    datedef date; // 其他结点的数据域
  };
  struct Node *next; // 指针域
} *linkstack, Linkstack;

linkstack creat(int flag); // 创建新链表

int push(linkstack L, datedef s); // 入栈
int pop(linkstack L);             // 出栈

void output(linkstack L); // 遍历

void L_free(linkstack L); // 链表释放

#endif

fun.c

#include "head.h"

linkstack creat(int flag) // 创建链表新结点
{
  linkstack L = (linkstack)malloc(sizeof(Linkstack));
  if (L == NULL)
  {
    return NULL;
  }
  if (flag == 1) // 头结点
  {
    L->len = 0;
  }
  else if (flag == 0) // 其他结点
  {
    L->date = 0;
  }
  L->next = NULL; // 初始化
  return L;
}

int push(linkstack L, datedef s) // 入栈
{
  if (L == NULL)
  {
    printf("入栈失败\n");
    return -1;
  }
  linkstack q = creat(0);
  if (q == NULL)
  {
    return -1;
  }
  q->date = s;
  q->next = L->next;
  L->next = q;
  L->len++;
  return 0;
}

void output(linkstack L) // 遍历
{
  if (L->next == NULL || L == NULL)
  {
    printf("遍历失败\n");
  }
  printf("输出的元素是:\n");
  linkstack p = L;
  while (p->next)
  {
    p = p->next;
    printf("%d\t", p->date);
  }
  puts("");
  printf("该链栈有%d个元素。\n", L->len);
}
/*
 *for(int i=0;i<p->len;i++)
 *{
 *p=p->next;
 *printf("%d\t",p->date);
 *}
 *puts("");
 */

int pop(linkstack L) // 出栈
{
  if (L->next == NULL || L == NULL)
  {
    printf("出栈失败\n");
    return -1;
  }
  linkstack p = L->next;
  printf("  %d  已出栈\n", p->date);
  L->next = p->next;
  L->len--;
  free(p);
  p = NULL;
  return 0;
}

void L_free(linkstack L) // 链表释放
{

  if (L == NULL)
  {
    return;
  }

  int n = L->len;
  for (int i = 0; i < n; i++)
  {
    pop(L); // 出栈
  }
  free(L);
  L = NULL;
  printf("链栈已释放\n");
}

main.c

#include "head.h"

int main(int argc, const char *argv)
{

  linkstack L = creat(1);

  int n;
  datedef s, e;

  printf("你要入栈的元素个数:");
  scanf("%d", &n);
  for (int i = 0; i < n; i++)
  {
    printf("你要入栈的元素是:");
    scanf("%d", &s);
    push(L, s); // 入栈
  }
  output(L);

  char c;
  while (1)
  {
    printf("是否出栈?Y/N");
    scanf("%c", &c);
    puts("");
    if (c == 'n' || c == 'N')
    {
      break;
    }
    pop(L);
  }
  output(L);

  L_free(L);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值