zoukankan      html  css  js  c++  java
  • 数据结构 顺序线性表

    /*
    顺序线性表头文件
    */
    
    #ifndef _vzhangseqlist
    #define _vzhangseqlist
    
    typedef void SeqList;
    typedef void SeqListNode;
    
    //创建线性表
    _declspec(dllexport)//如果在动态库中定义头文件  这句话不可以缺少  不然会报错   函数重定义
    SeqList* SeqList_Create(int capacity);
    
    //销毁线性表
    _declspec(dllexport)
    int SeqList_Destroy(SeqList** list);
    
    //清空线性表
    _declspec(dllexport)
    int SeqList_Clear(SeqList* list);
    
    //获取线性表长度
    _declspec(dllexport)
    int SeqList_Length(SeqList* list);
    
    //获取线性表的容量
    _declspec(dllexport)
    int SeqList_Capacity(SeqList* list);
    
    //线性表指定位置插入元素
    _declspec(dllexport)
    int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
    
    //获取线性表指定位置的元素
    _declspec(dllexport)
    SeqListNode* SeqList_Get(SeqList* list, int pos);
    
    //删除线性表指定位置的元素
    _declspec(dllexport)
    SeqListNode* SeqList_Delete(SeqList* list, int pos);
    
    #endif
    //动态库代码实现
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"SeqList.h"
    
    typedef struct _TSeqList
    {
        //指针数组---内存模型①
        unsigned int * Nodes;
        //数组元素个数
        int length;
        //数组最大容量
        int capacity;
    }TSeqList;
    
    //创建线性表
    _declspec(dllexport)//文件导出关键字
    SeqList* SeqList_Create(int capacity)
    {
        TSeqList * tlist = (TSeqList *)malloc(sizeof(TSeqList));
        if (tlist==NULL)
        {
            printf("分配内存失败!
    ");
            return NULL;
        }
        //分配指针域数组
        tlist->Nodes = (unsigned int *)malloc(sizeof(int)*capacity);
        if (tlist->Nodes==NULL)
        {
            printf("分配内存失败!
    ");
            return NULL;
        }
        tlist->capacity = capacity;
        tlist->length = 0;
        return (SeqList*)tlist;
    }
    
    //销毁线性表
    _declspec(dllexport)
    int SeqList_Destroy(SeqList** list)
    {
        int ERRO_MSG = 0;
        if (list==NULL)
        {
            ERRO_MSG = -1;
            printf("list==NULL 传入参数不可以为空! erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        TSeqList * tlist = (TSeqList *)*list;
        //释放指针域数组内存
        if (tlist->Nodes!=NULL)
        {
            free(tlist->Nodes);
            tlist->Nodes = NULL;
        }
        //释放线性表对象
        if (tlist!=NULL)
        {
            free(tlist);
            tlist = NULL;
            *list = NULL;
        }
        return ERRO_MSG;
    }
    
    //清空线性表
    _declspec(dllexport)
    int SeqList_Clear(SeqList* list){
        int ERRO_MSG = 0;
        if (list==NULL)
        {
            ERRO_MSG = -1;
            printf("list==NULL 传入参数不可以为空! erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        TSeqList *tlist = (TSeqList *)list;
        memset(tlist->Nodes, 0, sizeof(unsigned int)*tlist->capacity);
        tlist->length = 0;
        return ERRO_MSG;
    }
    
    //获取线性表长度
    _declspec(dllexport)
    int SeqList_Length(SeqList* list)
    {
        int ERRO_MSG = 0;
        if (list == NULL)
        {
            ERRO_MSG = -1;
            printf("list==NULL 传入参数不可以为空! erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        TSeqList *tlist = (TSeqList *)list;
        return tlist->length;
    }
    
    
    //获取线性表的容量
    _declspec(dllexport)
    int SeqList_Capacity(SeqList* list){
        int ERRO_MSG = 0;
        if (list == NULL)
        {
            ERRO_MSG = -1;
            printf("list==NULL 传入参数不可以为空! erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        TSeqList *tlist = (TSeqList *)list;
        return tlist->capacity;
    }
    
    //线性表指定位置插入元素
    _declspec(dllexport)
    int SeqList_Insert(SeqList* list, SeqListNode* node, int pos){
        int ERRO_MSG = 0, i = 0;
        if (list == NULL)
        {
            ERRO_MSG = -1;
            printf("list==NULL 传入参数不可以为空! erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        TSeqList *tlist = (TSeqList *)list;
        /*
        顺序线性表指定位置插入元素  后面的元素必须后移
        */
        //判断数组元素是不是满了
        if (tlist->length >= tlist->capacity)
        {
            ERRO_MSG = -2;
            printf("数组元素已满! erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        //判断插入位置--线性表必须一个个的插入  不能在容量位置向前插入   这样数组中间有些位置会空闲
        if (pos<0 || pos>tlist->length)
        {
            //注意:这里的长度是数组已有元素的个数
            //进行容错处理--从尾部插入
            pos = tlist->length;
        }
        for (i = tlist->length; i >pos; i--)
        {
            /*
            刚好将第pos个元素的位置空出来
            */
            tlist->Nodes[i] = tlist->Nodes[i - 1];
        }
        //将指针强转为unsigned int类型
        tlist->Nodes[pos] = (unsigned int) node;
        //数组元素个数加1
        tlist->length++;
        return ERRO_MSG;
    }
    
    //获取线性表指定位置的元素
    _declspec(dllexport)
    SeqListNode* SeqList_Get(SeqList* list, int pos){
        int ERRO_MSG = 0, i = 0;
        if (list == NULL)
        {
            ERRO_MSG = -1;
            printf("list==NULL 传入参数不可以为空! erro msg:%d
    ", ERRO_MSG);
            return NULL;
        }
        TSeqList *tlist = (TSeqList *)list;
        //判断获取位置
        if (pos<0 || pos>tlist->length)
        {
            ERRO_MSG = -2;
            printf("没有该位置的元素! erro msg:%d
    ", ERRO_MSG);
            return NULL;
        }
        return (SeqListNode*)tlist->Nodes[pos];
    }
    
    //删除线性表指定位置的元素
    _declspec(dllexport)
    SeqListNode* SeqList_Delete(SeqList* list, int pos){
        int ERRO_MSG = 0, i = 0;
        unsigned int ret = 0;
        if (list == NULL)
        {
            ERRO_MSG = -1;
            printf("list==NULL 传入参数不可以为空! erro msg:%d
    ", ERRO_MSG);
            return NULL;
        }
        TSeqList *tlist = (TSeqList *)list;
        //判断获取位置
        if (pos<0 || pos>tlist->length)
        {
            ERRO_MSG = -2;
            printf("没有该位置的元素! erro msg:%d
    ", ERRO_MSG);
            return NULL;
        }
        ret = tlist->Nodes[pos];
        for (i = pos; i < tlist->length-1; i++)
        {
            tlist->Nodes[i] = tlist->Nodes[i+1];
        }
        //最后元素置零--这一步也可以不要
        memset(tlist->Nodes + tlist->length - 1, 0, sizeof(unsigned int));
        //元素个数减1
        tlist->length--;
        return (SeqListNode*)ret;
    }
    //顺序线性表测试代码
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"SeqList.h"
    
    typedef struct _Student{
        char name[30];
        int age;
    }Student;
    
    void Test(){
        Student s1, s2, s3,s4,s5;
        int numx = 0, i = 0,ret=0;
        strcpy(s1.name, "小米");
        s1.age = 11;
        strcpy(s2.name, "小刚");
        s2.age = 12;
        strcpy(s3.name, "小红");
        s3.age = 10;
        strcpy(s4.name, "啸天");
        s4.age = 13;
        strcpy(s5.name, "莲华");
        s5.age = 12;
        //线性表指针
        SeqList *list = NULL;
        //创建线性表
        list = SeqList_Create(10);
        //获取线性表容量
        numx = SeqList_Capacity(list);
        printf("线性表容量是%d
    ", numx);
        //插入元素
        SeqList_Insert(list, (SeqListNode *)&s1, 0);
        SeqList_Insert(list, (SeqListNode *)&s2, 0);
        SeqList_Insert(list, (SeqListNode *)&s3, 0);
        SeqList_Insert(list, (SeqListNode *)&s4, 0);
        SeqList_Insert(list, (SeqListNode *)&s5, 0);
        //获取元素个数
        numx = SeqList_Length(list);
        //打印所有元素
        for (i = 0; i < numx; i++)
        {
            Student *temp = (Student *)SeqList_Get(list, i);
            printf("我的名字是%s;我的年龄是%d
    ", temp->name, temp->age);
        }
        //删除线性表中的数据
        Student *delem = (Student *)SeqList_Delete(list, 1);
        printf("我被删除了,我的名字是%s;我的年龄是%d
    ", delem->name, delem->age);
        //销毁线性表
        ret=SeqList_Destroy(&list);
        if (ret==0)printf("线性表销毁成功!
    ");
    }
    
    void main(){
        Test();
        system("pause");
    }

  • 相关阅读:
    假期小作业1
    Python_day4
    Python_day3
    Python_day2
    12/06
    12/05
    python系统学习:第三周之简单的三级菜单
    python系统学习:第二周之字典应用
    python系统学习:第二周之字符串函数练习
    python系统学习:第二周之购物车功能
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5678967.html
Copyright © 2011-2022 走看看