栈链

/ c++ 实现///

坑 遍历栈链时不能用指针 不然top 指针指向栈底了。当 pop 出栈时把栈底都free 掉了导致内存泄漏

待优化

#include
using namespace std;
//声明结点指针
typedef struct StackNode* pLinkStackNode;
//声明链栈指针
typedef struct Stack* pLinkStack;
//声明栈结点
typedef struct StackNode
{
    //数据域
    int Num;
    //指针域
    pLinkStackNode privor;
}LinkStackNode;
//声明链栈
typedef struct Stack
{
    //链栈的长度
    int  length;
    //栈顶
    pLinkStackNode  top;
    //栈底
    pLinkStackNode  down;
    
}LinkStack;

//创建结点
pLinkStackNode Create_stack_node(int num)
{
    pLinkStackNode p=(pLinkStackNode)malloc(sizeof(StackNode));
    p->Num=num;
    p->privor=NULL;
    return p;
}


//创建链栈
LinkStack Create_link_stack(int num)
{
    pLinkStackNode downStackNode=NULL,topStackNode=NULL;
    //第一个结点栈底
    downStackNode = Create_stack_node(0);
    topStackNode = downStackNode;
    for (int i =1; iprivor = topStackNode;
        topStackNode = p;
    }
    LinkStack linkstack;
    linkstack.length = num;
    linkstack.down = downStackNode;
    linkstack.top = topStackNode;
    return linkstack;
}
//出栈
pLinkStack Pop_link_stack(pLinkStack ps)
{
    pLinkStackNode LinkStackNodetop = ps->top;//把要出栈的原来顶点赋给临时量变
    ps->top = ps->top->privor;//把原来顶点的上一个结点给栈链的顶点做为新顶点
    ps->length--;//长度--
    free(LinkStackNodetop);//删除原来的顶点
    LinkStackNodetop=NULL;
    return ps;
}
//入栈
pLinkStack Push_link_stack(pLinkStack ps,int num)
{
    pLinkStackNode LinkStackNodetop = Create_stack_node(num);//创建一个新的顶点
    LinkStackNodetop->privor =ps->top;
    ps->top =LinkStackNodetop;
    ps->length++;
//    oldtop = ps->top;
//    cout<<"<"<top->Num<top = LinkStackNodetop;
//    cout<top->Num<top->privor->Num<top->privor = oldtop;//把原来顶点的上一个结点给栈链的顶点做为新顶点
//    ps->length++;//长度++
    return ps;
}
//打印栈链   遇到的问题有不能用指针不然它改变了指向 top 指向栈底 所以当你 pop 时把当前指针也删除了也就整个栈链内存泄漏
//void Printf_link_stack(pLinkStack ps)
//{
//    pLinkStack p =ps;
//    while (p->top->privor!=NULL) {
//        cout<top->Num<top=p->top->privor;
//    }
//    if (p->top->privor==NULL) {
//        cout<top->Num<top);
    //p.privor还是一个指针 但是这里循环就不能解引用,因为解引用是一个结构体了。类型不匹配。
    while (p.privor!=NULL) {
        cout<

///用模版实现//
链栈
#include
using namespace std;
//声明结点指针
//声明栈结点
template
struct LinkStackNode
{
    //数据域
    T Num;
    //指针域
    LinkStackNode* privor;
};
//声明链栈
template
struct LinkStack
{
    //链栈的长度
    int  length;
    //栈顶
    LinkStackNode*  top;
    //栈底
    LinkStackNode*  down;
    
};

//创建结点
template
LinkStackNode* Create_stack_node(T num)
{
    LinkStackNode* p=(LinkStackNode *)malloc(sizeof(LinkStackNode));
    p->Num=num;
    p->privor=NULL;
    return p;
}


//创建链栈
template
LinkStack Create_link_stack(int n,T num)
{
    LinkStackNode* downStackNode;
    LinkStackNode*topStackNode;
    //第一个结点栈底
    downStackNode = Create_stack_node(num);
    topStackNode=downStackNode;
    for (int i =1; i* p = Create_stack_node(num);
        p->privor = topStackNode;
        topStackNode = p;
    }
    LinkStack linkstack;
    linkstack.length = num;
    linkstack.down = downStackNode;
    linkstack.top = topStackNode;
    return linkstack;
}
//出栈
template
LinkStack* Pop_link_stack(LinkStack* ps)
{
    LinkStackNode*  LinkStackNodetop = ps->top;//把要出栈的原来顶点赋给临时量变
    ps->top = ps->top->privor;//把原来顶点的上一个结点给栈链的顶点做为新顶点
    ps->length--;//长度--
    free(LinkStackNodetop);//删除原来的顶点
    LinkStackNodetop=NULL;
    return ps;
}
//入栈
template
LinkStack*  Push_link_stack(LinkStack* ps,T num)
{
    LinkStackNode*  LinkStackNodetop = Create_stack_node(num);//创建一个新的顶点
    LinkStackNodetop->privor =ps->top;
    ps->top =LinkStackNodetop;
    ps->length++;
    return ps;
}
//打印栈链
template
void Printf_link_stack(LinkStack* ps)
{
    //临时top变量
    LinkStackNode p =*(ps->top);
    while (p.privor!=NULL) {
        cout< ps = Create_link_stack(10,2.2);
    LinkStack* pl = &ps;
    Printf_link_stack(pl);
    cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"< ps1 = Create_link_stack(10,'a');
    LinkStack* pl1 = &ps1;
    Printf_link_stack(pl);
    cout<<"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"<


你可能感兴趣的:(数据结构与算法)