数据结构 顺序线性表

/*
顺序线性表头文件
*/

#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");
}

原文地址:https://www.cnblogs.com/zhanggaofeng/p/5678967.html