• C 栈顺序存储


    // seqstack.h
    
    #ifndef _MY_SEQSTACK_H_
    #define _MY_SEQSTACK_H_
    
    typedef void SeqStack;
    
    SeqStack* SeqStack_Create(int capacity);
    
    void SeqStack_Destroy(SeqStack* stack);
    
    void SeqStack_Clear(SeqStack* stack);
    
    int SeqStack_Push(SeqStack* stack, void* item);
    
    void* SeqStack_Pop(SeqStack* stack);
    
    void* SeqStack_Top(SeqStack* stack);
    
    int SeqStack_Size(SeqStack* stack);
    
    int SeqStack_Capacity(SeqStack* stack);
    
    #endif //_MY_SEQSTACK_H_
    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include "seqstack.h"
    #include "seqlist.h"  //顺序存储 链表
    
    
    //创建栈 相当于 创建一个线性表
    SeqStack* SeqStack_Create(int capacity)
    {
        return SeqList_Create(capacity);
    }
    
    //销毁栈 相当于销毁链表
    void SeqStack_Destroy(SeqStack* stack)
    {
        SeqList_Destroy(stack);
    }
    
    //清空栈 相当于 清空线性表
    void SeqStack_Clear(SeqStack* stack)
    {
        SeqList_Clear(stack);
    }
    
    //栈插入元素 相当于 在线性表(数组)的尾部添加元素
    int SeqStack_Push(SeqStack* stack, void* item)
    {
        return SeqList_Insert(stack, item, SeqList_Length(stack)); //相当 尾插法
    }
    
    //栈 弹出元素  相当于 从线性表的尾部 删除元素
    void* SeqStack_Pop(SeqStack* stack)
    {
        return  SeqList_Delete(stack, SeqList_Length(stack)-1 );
    }
    
    //栈 获取栈顶元素 相当于 求链表的尾部元素
    //获取栈顶元素 相当于 从链表的尾部拿元素;  尾部元素的下标=长度-1
    void* SeqStack_Top(SeqStack* stack)
    {
        return SeqList_Get(stack, SeqList_Length(stack) - 1);
    }
    
    //求栈的大小 相当于 链表的长度
    int SeqStack_Size(SeqStack* stack)
    {
        return SeqList_Length(stack);
    }
    
    //求栈的容量  相当于  求链表的容量
    int SeqStack_Capacity(SeqStack* stack)
    {
        return SeqList_Capacity(stack);
    }
    #ifndef  __MY_SEQLIST_H__ 
    #define __MY_SEQLIST_H__
    
    typedef void SeqList;
    typedef void SeqListNode;
    
    //链表 创建
    SeqList* SeqList_Create(int capacity);
    
    //链表 销毁
    void SeqList_Destroy(SeqList* list);
    
    ////链表 清空
    void SeqList_Clear(SeqList* list);
    
    //链表 长度
    int SeqList_Length(SeqList* list);
    
    
    //链表 容量 
    int SeqList_Capacity(SeqList* list);
    
    //链表 在某一个位置 插入元素
    int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
    
    //获取某一个位置的链表结点
    SeqListNode* SeqList_Get(SeqList* list, int pos);
    
    //删除某一个位置的结点
    SeqListNode* SeqList_Delete(SeqList* list, int pos);
    
    
    #endif  //__MY_SEQLIST_H__
    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include "seqlist.h"
    
    
    //用数组来模拟线性表
    typedef struct _tag_SeqList
    {
        int        capacity;
        int        length;
        //int *node[100];
        int        **node;  //int node[capacity] //
                        //int *node[capacity];
        //int *node; //   int node[i]===> *(node+i)
    }TSeqList;
    
    
    //链表 创建
    SeqList* SeqList_Create(int capacity) //O(1)
    {
        int            ret;
        TSeqList    *tmp = NULL;
        tmp = (TSeqList *)malloc(sizeof(TSeqList));
        if (tmp == NULL)
        {
            ret =1;
            printf("func SeqList_Create() err :%d 
    ", ret);
            return NULL;
        }
        memset(tmp, 0, sizeof(TSeqList));
        tmp->capacity = capacity;
        tmp->length = 0;
        tmp->node = (int **)malloc(sizeof(void *) * capacity);
        if (tmp->node == NULL)
        {
            ret = 2;
            printf("func SeqList_Create() malloc err :%d 
    ", ret);
            return NULL;
        }
        memset(tmp->node, 0, sizeof(void *) * capacity);
    
        return tmp;
    }
    
    //链表 创建
    int SeqList_Create2(int capacity, SeqList**handle)
    {
        int            ret = 0;
        TSeqList    *tmp = NULL;
        tmp = (TSeqList *)malloc(sizeof(TSeqList));
        if (tmp == NULL)
        {
            ret =1;
            printf("func SeqList_Create2() err :%d 
    ", ret);
            return ret;
        }
        memset(tmp, 0, sizeof(TSeqList));
        tmp->capacity = capacity;
        tmp->length = 0;
        tmp->node = (int **)malloc(sizeof(void *) * capacity);
        if (tmp->node == NULL)
        {
            ret = 2;
            printf("func SeqList_Create2() malloc err :%d 
    ", ret);
            return ret;
        }
    
        *handle = tmp;
        return ret;
    }
    
    //链表 销毁
    void SeqList_Destroy(SeqList* list)  //O(1)
    {
        TSeqList    *tmp = NULL;
        if (list == NULL)
        {
            return ;
        }
    
        tmp = (TSeqList *)list;
    
        if (tmp->node != NULL)
        {
            free(tmp->node);
        }
        free(tmp);
        return ;
    }
    
    ////链表 清空
    void SeqList_Clear(SeqList* list) //O(1)
    {
        TSeqList    *tmp = NULL;
        if (list == NULL)
        {
            return ;
        }
    
        tmp = (TSeqList *)list;
        tmp->length = 0;
        memset(tmp->node, 0, (tmp->capacity * sizeof(void *)) );
    
        return ;
    }
    
    //链表 长度
    int SeqList_Length(SeqList* list) //O(1)
    {
        TSeqList    *tmp = NULL;
        if (list == NULL)
        {
            return -1;
        }
        tmp = (TSeqList *)list;
    
        return tmp->length;
    }
    
    
    //链表 容量 
    int SeqList_Capacity(SeqList* list) //O(1)
    {
        TSeqList    *tmp = NULL;
        if (list == NULL)
        {
            return -1;
        }
        tmp = (TSeqList *)list;
        return tmp->capacity;
    }
    
    //链表 在某一个位置 插入元素
    int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)  //O(n)
    {
        TSeqList    *tList = NULL;
        int i = 0;
        if (list == NULL ||  node==NULL)
        {
            return -1;
        }
        tList = (TSeqList *)list;
        //如果满了 
        if (tList->length >= tList->capacity)
        {
            return -2;
        }
    
        //pos位置的容错处理
        if (pos > tList->length )
        {
            pos = tList->length;
        }
    
        for (i=tList->length; i>pos; i--)  //n
        {
            tList->node[i] = tList->node[i-1];
        }
    
        tList->node[i] = (int* )node; //ok
        tList->length ++;
    
        return 0;
    }
    
    //获取某一个位置的链表结点
    SeqListNode* SeqList_Get(SeqList* list, int pos)  //O(1)
    {
        TSeqList    *tList = NULL;
        SeqListNode *tmp = NULL;
    
        tList = (TSeqList *)list;
    
        if (list == NULL || pos<0 || pos >=tList->length )
        {
            return NULL;
        }
        tmp = tList->node[pos];
    
        return tmp;
    }
    
    //删除某一个位置的结点
    SeqListNode* SeqList_Delete(SeqList* list, int pos)  ////O(n)
    {
        int            i = 0;
        TSeqList    *tList = NULL;
        SeqListNode *tmp = NULL; 
    
        tList = (TSeqList *)list;
        if (list == NULL || pos <0 || pos >= tList->length)
        {
            return NULL;
        }
        tmp = tList->node[pos];
    
        // pos = 3
        for (i=pos+1; i<tList->length; i++)
        {
            tList->node[i-1] = tList->node[i];
    
        }
        tList->length --;
        return tmp;
    }
    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    #include "seqstack.h"
    
    
    void main()
    {
        int i = 0; 
        SeqStack *stack = NULL;
    
        int  a[10];
        for (i=0; i<10; i++)
        {
            a[i] = i+1;
        }
    
        stack = SeqStack_Create(20);
        
        //入栈
        for (i=0; i<3; i++)
        {
            SeqStack_Push(stack, &a[i]);
        }
    
        //栈的属性
        printf("len:%d 
    ", SeqStack_Size(stack));
        printf("capacity:%d 
    ", SeqStack_Capacity(stack));
    
        printf("top:%d 
    ", *((int *)SeqStack_Top(stack) )   )  ;
    
    
        //元素出栈
    
        while (SeqStack_Size(stack) > 0)
        {
            printf("%d ",   *( (int *)SeqStack_Pop(stack) ) );
        }
    
        SeqStack_Destroy(stack);
    
        printf("hello...
    ");
        system("pause");
        return ;
    }
  • 相关阅读:
    第一次来博客园,不写技术
    asp.net跳转页面的三种方法比较
    那年五月
    在GridView里使用单选按钮,RadioButton/Radio
    常用网页嵌入播放器代码精解收集
    HTML 嵌入视频
    代码规范
    C:\WINDOWS\system32\wmp.dll”受到“Windows 系统文件保护”。
    window.pageyoffset和document.body.scrollTop
    网页制作中段落缩进的5种解决方法
  • 原文地址:https://www.cnblogs.com/yaowen/p/4811254.html
Copyright © 2020-2023  润新知