• 数据结构:链栈


    一、介绍

    操作受限的链表

    如果进行头插,就只能头删

    如果进行尾插,就只能进行尾删

    二、功能(把T->ptop当做头节点用)

    链栈的结构体

    1. #ifndef __LINK_STACK_H__
    2. #define __LINK_STACK_H__
    3. #include
    4. #include
    5. typedef struct link_stack{
    6. int data;
    7. struct link_stack *next;
    8. }link_stack,*link_p;
    9. //桟顶指针的类型
    10. //桟顶指针应该独立于桟存在,为了和桟中元素不同
    11. typedef struct top_t{
    12. int len;//记录链桟的长度
    13. link_p ptop;//桟顶指针
    14. }top_t,*top_p;
    15. //申请桟顶指针
    16. top_p creat_top();
    17. //申请节点的函数
    18. link_p creat_node(int data);
    19. //判空
    20. int empty(top_p T);
    21. //入桟
    22. void push_stack(top_p T,int data);
    23. //出桟
    24. void pop_stack(top_p T);
    25. //遍历
    26. void show_stack(top_p T);
    27. //销毁链桟
    28. void free_stack(top_p T);
    29. #endif

    1.申请栈顶指针

    1. //申请桟顶指针
    2. top_p creat_top(){
    3. top_p top=(top_p)malloc(sizeof(top_t));
    4. if(top==NULL){
    5. printf("空间申请失败\n");
    6. return NULL;
    7. }
    8. top->len=0;
    9. top->ptop=NULL;//刚申请桟指针没有指向元素
    10. return top;
    11. }

    2.申请节点

    1. //申请节点的函数
    2. link_p creat_node(int data){
    3. link_p new=(link_p)malloc(sizeof(link_stack));
    4. if(new==NULL){
    5. printf("申请空间失败\n");
    6. return NULL;
    7. }
    8. new->data=data;
    9. return new;
    10. }

    3.判空

    1. //判空
    2. int empty(top_p T){
    3. if(T==NULL){
    4. printf("申请空间失败\n");
    5. return 0;
    6. }
    7. return T->ptop==NULL?1:0;
    8. }

    4.入栈

    1. //入桟
    2. void push_stack(top_p T,int data){
    3. if(T==NULL){
    4. printf("入参为空\n");
    5. return;
    6. }
    7. link_p new=creat_node(data);
    8. new->next=T->ptop;
    9. T->ptop=new;
    10. T->len++;
    11. }

    5.出栈

    1. void pop_stack(top_p T){
    2. if(T==NULL){
    3. printf("入参为空\n");
    4. return;
    5. }
    6. if(empty(T)){
    7. printf("链桟为空,无需出桟\n");
    8. return;
    9. }
    10. link_p p=T->ptop;
    11. while(p->next->next!=NULL){
    12. p=p->next;
    13. }
    14. link_p del=p->next;
    15. p->next=del->next;
    16. free(del);
    17. T->len--;
    18. }

    6.遍历

    1. //遍历
    2. void show_stack(top_p T){
    3. if(T==NULL){
    4. printf("入参为空\n");
    5. return;
    6. }
    7. if(empty(T)){
    8. printf("链桟为空\n");
    9. return;
    10. }
    11. link_p p=T->ptop;
    12. while(p!=NULL){
    13. printf("%d ",p->data);
    14. p=p->next;
    15. }
    16. putchar(10);
    17. }

    7.销毁链栈

    1. //销毁链桟
    2. void free_stack(top_p T){
    3. if(T==NULL){
    4. printf("入参为空\n");
    5. return;
    6. }
    7. if(empty(T)){
    8. printf("链桟为空\n");
    9. return;
    10. }
    11. //循环出桟
    12. link_p p=T->ptop->next;
    13. link_p del;
    14. while(p!=NULL){
    15. del=p;
    16. p=p->next;
    17. free(del);
    18. del=NULL;
    19. }
    20. }

  • 相关阅读:
    Devart dotConnect for MySQL 9.0 Crack
    2021 年河南省中等职业教育技能大赛“网络安全”项目比赛任务书解析教程
    (附源码)spring boot校园健康监测管理系统 毕业设计 151047
    华为vrrp+mstp+dhcp配置案例
    KEPServerEX 6.15.132.0 发布说明
    【无标题】
    谈谈0基础怎么入门软件测试?
    可观察性在软件测试中的重要性
    PlantUML——类图(持续更新)
    变分自动编码器 (VAE)02/2 PyTorch 教程
  • 原文地址:https://blog.csdn.net/weixin_50022690/article/details/136308359