zoukankan      html  css  js  c++  java
  • C 栈 链式存储

    #ifndef _MY_LINKSTACK_H_
    #define _MY_LINKSTACK_H_
    
    typedef void LinkStack;
    
    LinkStack* LinkStack_Create();
    
    void LinkStack_Destroy(LinkStack* stack);
    
    void LinkStack_Clear(LinkStack* stack);
    
    int LinkStack_Push(LinkStack* stack, void* item);
    
    void* LinkStack_Pop(LinkStack* stack);
    
    void* LinkStack_Top(LinkStack* stack);
    
    int LinkStack_Size(LinkStack* stack);
    
    #endif //_MY_LINKSTACK_H_
    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    #include "linkstack.h"
    #include "linklist.h"
    
    
    typedef struct _tag_LinkStack
    {
        LinkListNode node;
        void* item;
    }TLinkStack;
    
    //创建一个栈 相当于 创建一个线性表
    LinkStack* LinkStack_Create()
    {
        return LinkList_Create();
    }
    
    void LinkStack_Destroy(LinkStack* stack)
    {
        LinkStack_Clear(stack);  //释放栈的 结点 
        LinkList_Destroy(stack);  //释放句柄
    }
    
    void LinkStack_Clear(LinkStack* stack)
    {
        while (LinkList_Length(stack) > 0)
        {
            LinkStack_Pop(stack);
        }
        return ;
    }
    
    //向栈中添加元素 相等向 线性表中 添加结点
    int LinkStack_Push(LinkStack* stack, void* item)
    {
        int            ret = 0;
        TLinkStack *tmp = NULL;
    
         //// void* item 栈结点  ===>链表结点
        tmp = (TLinkStack *)malloc(sizeof(TLinkStack));
        tmp->item = item;
    
        ret = LinkList_Insert(stack, (LinkListNode *)tmp, 0);
        if (ret != 0)
        {
            printf("func LinkList_Insert() err:%d 
    ", ret);
            free(tmp);
            return ret;
        }
        return ret;
    }
    
    //从栈中 弹出 元素   相当于 从线性表中 删除0号位置元素
    void* LinkStack_Pop(LinkStack* stack)
    {
        TLinkStack *tmp = NULL;
    
        void *item = NULL;
    
        tmp = (TLinkStack*) LinkList_Delete(stack, 0);
        if (tmp == NULL)
        {
            printf("func LinkList_Delete() err 
    ");
            return NULL;
        }
        //把链表节点 ====>转换成  栈结点
        item = tmp->item;
    
        free(tmp);
    
        return item;
    }
    
    //获取栈顶元素 相等于 从线性表的0号位置元素
    void* LinkStack_Top(LinkStack* stack)
    {
        TLinkStack *tmp = NULL;
        void *item = NULL;
    
        tmp = (TLinkStack *)LinkList_Get(stack, 0);
        if (tmp == NULL)
        {
            printf("func LinkStack_Top() err 
    ");
        }
        item = tmp->item;
        return item;
    }
    
    int LinkStack_Size(LinkStack* stack)
    {
        return LinkList_Length(stack);
    }
    #ifndef _MYLINKLIST_H_
    #define _MYLINKLIST_H_
    
    typedef void LinkList;
    /*
    typedef struct _tag_LinkListNode LinkListNode;
    struct _tag_LinkListNode
    {
        LinkListNode* next;
    };
    */
    
    typedef struct _tag_LinkListNode
    {
        struct _tag_LinkListNode* next;
    }LinkListNode;
    
    LinkList* LinkList_Create();
    
    void LinkList_Destroy(LinkList* list);
    
    void LinkList_Clear(LinkList* list);
    
    int LinkList_Length(LinkList* list);
    
    int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
    
    LinkListNode* LinkList_Get(LinkList* list, int pos);
    
    LinkListNode* LinkList_Delete(LinkList* list, int pos);
    
    #endif
    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include "linklist.h"
    
    typedef struct _tag_LinkList
    {
        LinkListNode header;
        int        length;
    }TLinkList;
    //
    LinkList* LinkList_Create()  //O(1)
    {
        TLinkList *tmp = NULL;
    
        tmp = (TLinkList *)malloc(sizeof(TLinkList));
        if (tmp == NULL)
        {
            printf("func LinkList_Create() err 
    ");
            return NULL;
        }
        memset(tmp, 0, sizeof(TLinkList));
        tmp->length = 0;
        tmp->header.next = NULL; //
        return tmp;
    }
    
    void LinkList_Destroy(LinkList* list)  //O(1)
    {
        if (list == NULL)
        {
            return ;
        }
        free(list);
        return ;
    }
    
    void LinkList_Clear(LinkList* list)   //O(1)
    {
        TLinkList *tList = NULL;
        tList = (TLinkList *)list;
        if (tList == NULL)
        {
            return ;
        }
        tList->header.next = NULL;
        tList->length = 0;
    
        return ;
    }
    
    int LinkList_Length(LinkList* list)  //O(1)
    {
        TLinkList *tList = NULL;
        tList = (TLinkList *)list;
        if (tList == NULL)
        {
            return -1;
        }
        return tList->length;
    }
    
    int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)  //O(n)
    {
        int                i = 0;
        LinkListNode    *current = NULL;
        TLinkList        *tList = NULL;
    
        tList = (TLinkList *)list;
        
        if (list==NULL || node==NULL || pos<0)
        {
            return -1;
        }
    
        current = &(tList->header);
        for (i=0; i<pos; i++)
        {
            current = current->next;
        }
        //新结点 连接 后继链表
        node->next = current->next;
    
        //前面的链表 连接 新结点
        current->next = node;
    
        tList->length ++;
        return 0;
    }
    
    LinkListNode* LinkList_Get(LinkList* list, int pos)  //O(n)
    {
        int                i = 0;
        LinkListNode    *current = NULL;
        TLinkList        *tList = NULL;
    
        tList = (TLinkList *)list;
    
        if (list==NULL || pos<0)
        {
            return NULL;
        }
    
        current = &(tList->header); //赋值指针变量初始化
        for (i=0; i<pos; i++)
        {
            current = current->next;
        }
        return current->next;
    }
    
    LinkListNode* LinkList_Delete(LinkList* list, int pos) //O(n)
    {
        int                i = 0;
        LinkListNode    *current = NULL;
        LinkListNode    *ret = NULL;
        TLinkList        *tList = NULL;
    
        tList = (TLinkList *)list;
        if (list==NULL || pos<0)
        {
            return NULL;
        }
    
        current = &(tList->header);
        for (i=0; i<pos; i++)
        {
            current = current->next;
        }
        ret = current->next; //缓存要删除的结点
    
        current->next = ret->next;
    
        tList->length --;
    
        return ret;
    }
    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include "linkstack.h"
    
    void main()
    {
        LinkStack *stack = NULL;
        int  a[5], i = 0;
    
        for (i=0; i<5; i++)
        {
            a[i] = i+1;
        }
    
        stack = LinkStack_Create();
    
        //向栈中 添加 元素 
        for (i=0; i<5; i++)
        {
            LinkStack_Push(stack, &a[i]); //抛砖: 栈的结点a[i]==>转换成(适配成) 链表结点 ===>插入到链表库
        }
    
        //栈的属性
        printf("len:%d 
    ", LinkStack_Size(stack));
        printf("top:%d 
    ",  *( (int *)LinkStack_Top(stack) )  );
    
        /*
        //元素 出栈
        while (LinkStack_Size(stack) > 0 )
        {
            int tmp = 0;
            tmp = *( (int *)LinkStack_Pop(stack) );
            printf("%d ", tmp);
        }
        */
    
        LinkStack_Destroy(stack);
    
        printf("hello...
    ");
        system("pause");
        return ;
    }
  • 相关阅读:
    慎用静态类static class
    20170617
    学习笔记之工厂模式-2017年1月11日23:00:53
    链表翻转
    面试被虐
    tips
    依赖注入那些事儿
    浅谈算法和数据结构(1):栈和队列
    猫都能学会的Unity3D Shader入门指南(一)
    SerializeField等Unity内的小用法
  • 原文地址:https://www.cnblogs.com/yaowen/p/4811288.html
Copyright © 2011-2022 走看看