dynamic sequence table

Test environment: vs2013

SeqListD.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int DataType;

typedef struct SeqListD
{
    DataType *arr;
    int capacity;//空间容量
    int size;//有效元素个数
}SeqListD, *PSeqListD;



void SeqListDInit(PSeqListD ps, int capacity);//初始化
void CheckCapacity(PSeqListD ps);// 对顺序表进行增容 
void SeqListDPushBack(PSeqListD ps, DataType data);//尾插
void SeqListDPopBack(PSeqListD ps);//尾删
void SeqListDInsert(PSeqListD ps, int pos, DataType data);//任意位置插入
void SeqListDErase(PSeqListD ps, int pos);//任意位置删除

int SeqListDSize(PSeqListD ps);// 获取元素个数 

int SeqListDCapacity(PSeqListD ps);// 获取顺序表的容量
int SeqListDEmpty(PSeqListD ps);//判空,为空返回0,

void SeqListDClear(PSeqListD ps);// 将顺序表中的元素清空 注意:不改变顺序表空间的大小 
void SeqListDDestroy(PSeqListD ps);//销毁顺序表



SeqListD.c

#include "SeqListD.h"


//1.参数检测
//2.边界判断
void SeqListDInit(PSeqListD ps, int capacity)
{
    if (NULL == ps)
        return;//说明结构体不存在

    ps->arr = (DataType *)malloc(sizeof(DataType)*capacity);
    if (ps->arr == NULL)
    {
        printf("空间申请失败!!!\n");
        return;
    }
    ps->capacity = capacity;
    ps->size = 0;
}

void CheckCapacity(PSeqListD ps)
{
    if (NULL == ps)
        return;
    //printf("Data = %d capa = %d\n", sizeof(DataType), ps->capacity);
    ps->arr = (DataType *)realloc(ps->arr, (sizeof(DataType) * (ps->capacity) * 2));

    if (NULL == ps->arr)
    {
        printf("空间申请失败!!\n");
        return;
    }
    ps->capacity = 2 * ps->capacity;//每次扩增为原空间两倍
}

void SeqListDPushBack(PSeqListD ps, DataType data)
{
    if (NULL == ps)
        return;

    if (ps->size == ps->capacity)//说明原空间已满
        CheckCapacity(ps);//空间扩容

    ps->arr[ps->size] = data;//插入成功
    ps->size++;
}

void SeqListDPopBack(PSeqListD ps)
{
    if (NULL == ps)
        return;
    if (ps->size == 0)
    {
        printf("表已空,删除失败!!!\n");
        return;
    }

    ps->size--;//删除成功
}

void SeqListDInsert(PSeqListD ps, int pos, DataType data)
{
    int i = 0;

    if (NULL == ps)
        return;
    if (!((pos >= 0) && (pos <= ps->size)))
    {
        printf("位置不合法\n");
        return;
    }

    for (i = ps->size; i > pos; i--)
    {
        ps->arr[i] = ps->arr[i - 1];//将pos到size-1中的所有元素向后移位
    }

    ps->arr[pos] = data;
    ps->size++;//插入成功
}

void SeqListDErase(PSeqListD ps, int pos)
{
    int i = pos;
    if (NULL == ps)
        return;
    if (!((pos >= 0) && (pos <= ps->size - 1)))
    {
        printf("位置不合法!!!\n");
    }

    for (; i < ps->size - 1; i++)
    {
        ps->arr[i] = ps->arr[i + 1];
    }

    ps->size--;//删除成功
}

int SeqListDSize(PSeqListD ps)
{
    if (NULL == ps)
    {
        assert(0);
        return 0;
    }
    return ps->size;
}

int SeqListDCapacity(PSeqListD ps)
{
    if (NULL == ps)
    {
        assert(0);
        return 0;
    }
    return ps->capacity;
}

int SeqListDEmpty(PSeqListD ps)
{
    if (NULL == ps)
    {
        assert(0);
        return -1;
    }

    if (ps->size == 0)
        return 0;
    return 1;
}

void SeqListDClear(PSeqListD ps)
{
    if (NULL == ps)
        return;

    ps->size = 0;
}

void SeqListDDestroy(PSeqListD ps)
{
    if (NULL == ps)
        return;

    ps->size = 0;
    ps->capacity = 0;
    free(ps->arr);//释放空间
    ps->arr = NULL;//指针赋空,防止野指针产生
}

test.c

#include "SeqListD.h"
#include <Windows.h>

void print(PSeqListD ps)
{
    int i = 0;
    for (i = 0; i < ps->size; i++)
    {
        printf("%d ", ps->arr[i]);
    }
    printf("\n");
}

int main()
{
    int capacity = 10;
    int size = 0;
    SeqListD List;
    PSeqListD ps = &List;

    SeqListDInit(ps, capacity);//初始化
    CheckCapacity(ps);// 对顺序表进行增容 
    SeqListDPushBack(ps, 10);//尾插
    SeqListDPushBack(ps, 20);
    SeqListDPushBack(ps, 10);
    //SeqListDPopBack(ps);//尾删
    SeqListDInsert(ps, 2, 50);//任意位置插入
    //SeqListDErase(ps, 2);//任意位置删除
    size = SeqListDSize(ps);// 获取元素个数 
    capacity = SeqListDCapacity(ps);// 获取顺序表的容量
    printf("size = %d\ncapacity = %d\n", size, capacity);

    //SeqListDEmpty(ps);//判空,为空返回0,

    //SeqListDClear(ps);// 将顺序表中的元素清空 注意:不改变顺序表空间的大小 
    //SeqListDDestroy(ps);//销毁顺序表
    print(ps);//打印顺序表

    system("pause");
    return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325944709&siteId=291194637