栈 ------ 知识学习2

1.栈类型

2.链式栈

3.实例

cpp 复制代码
#ifndef LINKSTACK_H
#define LINKSTACK_H


typedef struct{
    char name[32];
    char sex;
    int age;
    int score;
}DATATYPE;

typedef struct LinkStackNode {
    DATATYPE data;
    struct LinkStackNode *next;
}LinkStackNode;

typedef struct{
    LinkStackNode *top;// head
    int clen;
}LinkStackList;

LinkStackList* CreateLinkStackList();
int DestroyLinkStack(LinkStackList*ls);
int PushLinkStack(LinkStackList*ls,DATATYPE* data);
int PopLinkStack(LinkStackList*ls);
int GetSizeLinkStack(LinkStackList*ls);
DATATYPE*GetTopLinkStack(LinkStackList*ls);
int IsEmptyLinkStack(LinkStackList*ls);


#endif // LINKSTACK_H
cpp 复制代码
#include "linkstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
LinkStackList *CreateLinkStackList()
{
   LinkStackList *ls=(LinkStackList*)malloc(sizeof(LinkStackList));
   if(NULL == ls)
   {
       perror("CreateLinkStackList malloc");
       return NULL;
   }
   ls->top =NULL;
   ls->clen = 0 ;
   return ls;

}

int PushLinkStack(LinkStackList *ls, DATATYPE *data)
{
    LinkStackNode* newnode = malloc(sizeof(LinkStackNode));
    if(NULL == newnode)
    {
        perror("PushLinkStack malloc");
        return 1;
    }
    memcpy(&newnode->data,data,sizeof(DATATYPE));
    newnode->next = NULL;
    if(IsEmptyLinkStack(ls))
    {
        ls->top = newnode;
    }
    else
    {
        newnode->next = ls->top;
        ls->top = newnode;
    }
    ls->clen++;
    return 0;
}

int PopLinkStack(LinkStackList *ls)
{
    if(IsEmptyLinkStack(ls))
    {
        return 1;
    }
    LinkStackNode* tmp = ls->top;
    ls->top = ls->top->next;
    free(tmp);
    ls->clen--;
    return 0 ;
}

int IsEmptyLinkStack(LinkStackList *ls)
{
    return 0 == ls->clen;
}

int GetSizeLinkStack(LinkStackList *ls)
{
    return ls->clen;
}

DATATYPE *GetTopLinkStack(LinkStackList *ls)
{
    if(IsEmptyLinkStack(ls))
        return NULL;
    return &ls->top->data;
}

int DestroyLinkStack(LinkStackList *ls)
{
    int len = GetSizeLinkStack(ls);
    int i = 0 ;
    for(i = 0 ;i<len;i++)
    {
        PopLinkStack(ls);
    }
    free(ls);
    return 0;
}

(ls->top = ls->top->next 时中间的tmp 则可被释放 // )

cpp 复制代码
#include <stdio.h>
#include "linkstack.h"
int main()
{
    LinkStackList *ls = CreateLinkStackList();
    DATATYPE data[5]={
           {"zhangsan",'m',20,70},
           {"lisi",'f',21,60},
           {"wangmazi",'m',25,80},
           {"liubei",'f',30,85},
           {"caocao",'f',40,90},
       };

    int  i = 0 ;
    for(i = 0 ;i<5;i++)
    {
        PushLinkStack(ls,&data[i]);
    }

    int size = GetSizeLinkStack(ls);
    DATATYPE* tmp;
    for(i=0;i<size;i++)
    {
        tmp = GetTopLinkStack(ls);
        printf("name:%s score:%d\n",tmp->name,tmp->score);
        PopLinkStack(ls);
    }
    DestroyLinkStack(ls);
    printf("Hello World!\n");
    return 0;
}

4.检查是否泄漏

相关推荐
急急黄豆5 分钟前
MADDPG学习笔记
笔记·学习
BullSmall9 分钟前
《道德经》第十七章
学习
知识分享小能手1 小时前
微信小程序入门学习教程,从入门到精通,项目实战:美妆商城小程序 —— 知识点详解与案例代码 (18)
前端·学习·react.js·微信小程序·小程序·vue·前端技术
做科研的周师兄1 小时前
【机器学习入门】7.4 随机森林:一文吃透随机森林——从原理到核心特点
人工智能·学习·算法·随机森林·机器学习·支持向量机·数据挖掘
QZ_orz_freedom2 小时前
学习笔记--文件上传
java·笔记·学习
deng-c-f2 小时前
Linux C/C++ 学习日记(24):UDP协议的介绍:广播、多播的实现
linux·网络·学习·udp
爱吃甜品的糯米团子2 小时前
Linux 学习笔记之 VI 编辑器与文件查找技巧
linux·笔记·学习
im_AMBER2 小时前
数据结构 03 栈和队列
数据结构·学习·算法
我先去打把游戏先3 小时前
VSCode通过SSH连接到Ubuntu虚拟机失败“找不到ssh安装”问题解决
笔记·vscode·单片机·嵌入式硬件·学习·ubuntu·ssh
●VON3 小时前
重生之我在大学自学鸿蒙开发第五天-《实战篇》
学习·华为·云原生·harmonyos·鸿蒙