栈 ------ 知识学习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.检查是否泄漏

相关推荐
月盈缺4 小时前
学习嵌入式的第二十二天——数据结构——双向链表
数据结构·学习·链表
★YUI★6 小时前
学习游戏制作记录(制作系统与物品掉落系统)8.16
学习·游戏·ui·unity·c#
努力还债的学术吗喽6 小时前
【速通】深度学习模型调试系统化方法论:从问题定位到性能优化
人工智能·深度学习·学习·调试·模型·方法论
南猿北者11 小时前
Cmake学习笔记
笔记·学习·策略模式
diablobaal12 小时前
云计算学习100天-第26天
学习·云计算
测试老哥13 小时前
pytest+requests+allure自动化测试接入Jenkins学习
自动化测试·软件测试·学习·测试工具·职场和发展·jenkins·pytest
diablobaal16 小时前
云计算学习100天-第21天
学习
好望角雾眠1 天前
第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)
笔记·学习·c#
艾伦~耶格尔1 天前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
星仔编程1 天前
python学习DAY46打卡
学习