热门IT资讯网

C语言数据结构 线性表的基本功能实现

发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,头文件如下#ifndef _SEQLIST_H_#define _SEQLIST_H_// 顺序表的动态存储#include #include #include typedef int SLDataT

头文件如下

#ifndef _SEQLIST_H_#define _SEQLIST_H_// 顺序表的动态存储#include #include #include typedef int SLDataType;typedef struct SeqList {    SLDataType* array;  // 指向动态开辟的数组    size_t size;       // 有效数据个数    size_t capacity;   // 容量空间的大小}SeqList;// 基本增删查改接口void SeqListInit(SeqList* psl, size_t capacity);void SeqListDestory(SeqList* psl);void CheckCapacity(SeqList* psl);void SeqListPushBack(SeqList* psl, SLDataType x);void SeqListPopBack(SeqList* psl);void SeqListPushFront(SeqList* psl, SLDataType x);void SeqListPopFront(SeqList* psl);int SeqListFind(SeqList* psl, SLDataType x);void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);void SeqListErase(SeqList* psl, size_t pos);void SeqListRemove(SeqList* psl, SLDataType x);void SeqListModify(SeqList* psl, size_t pos, SLDataType x);void SeqListPrint(SeqList* psl);void SeqListBubbleSort(SeqList* psl);int SeqListBinaryFind(SeqList* psl, SLDataType x);void SeqListRemoveAll(SeqList* psl, SLDataType x);#endif /*_SEQLIST_H_*/

以下是具体功能实现

void SeqListInit(SeqList* psl, size_t capacity)//初始化{    psl->array = (SLDataType*)calloc(capacity, sizeof(SLDataType));    psl->capacity = capacity;    psl->size = 0;}void SeqListDestory(SeqList* psl){    if (psl->array)    {        free(psl->array);        psl->array = NULL;        psl->capacity = 0;        psl->size = 0;    }}void CheckCapacity(SeqList* psl)//检查和动态开辟{    if (psl->size >= psl->capacity)    {        psl->capacity *= 2;        psl->array = (SLDataType*)realloc(psl->array, sizeof(SLDataType)*psl->capacity);    }}void SeqListPushBack(SeqList* psl, SLDataType x)//尾插{    CheckCapacity(psl);    psl->array[psl->size] = x;    psl->size++;}void SeqListPopBack(SeqList* psl)//尾删{    psl->size--;}void SeqListPushFront(SeqList* psl, SLDataType x)//首插{    int i;    CheckCapacity(psl);    for (i = psl->size - 1; i >= 0; i--)    {        psl->array[i+1] = psl->array[i];    }    psl->array[0] = x;    psl->size++;}void SeqListPopFront(SeqList* psl)//首删{    size_t i;    for (i = 0; i < psl->size-1; i++)    {        psl->array[i] = psl->array[i + 1];    }    psl->size--;}int SeqListFind(SeqList* psl, SLDataType x)//查询{    size_t i;    for (i = 0; i < psl->size - 1; i++)    {        if (psl->array[i] == x)        {            return i;        }    }    return -1;}void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)//插入{    size_t i;    for (i=psl->size-1; i>=pos; i--)    {        psl->array[i+1] = psl->array[i];    }    psl->array[pos] = x;    psl->size++;}void SeqListErase(SeqList* psl, size_t pos)//删除指定下标{    size_t i;    for (i = pos; i < psl->size - 1; i++)    {        psl->array[i] = psl->array[i + 1];    }    psl->size--;}void SeqListRemove(SeqList* psl, SLDataType x)//筛选删除{    SeqListErase(psl, SeqListFind(psl, x));}void SeqListModify(SeqList* psl, size_t pos, SLDataType x){    psl->array[pos] = x;}void SeqListPrint(SeqList* psl){    size_t i;    for (i = 0; i <=psl->size - 1; i++)    {        if (psl->array == NULL)        {            printf("NULL");            return;        }        printf("%d->", psl->array[i]);    }    putchar('\n');}void SeqListBubbleSort(SeqList* psl){    size_t i, j;    SLDataType tmp;    for (i = 0; i < psl->size - 1; i++)    {        for (j = 0; j < psl->size - 1; j++)        {            if (psl->array[j] > psl->array[j + 1])            {                tmp = psl->array[j];                psl->array[j] = psl->array[j + 1];                psl->array[j + 1] = tmp;            }        }    }}int SeqListBinaryFind(SeqList* psl, SLDataType x){    int left = 0, right = psl->size;    int mid = (left + right) / 2;    while (left <= right)    {        if (x < psl->array[mid])        {            right = mid-1;        }        if (x>psl->array[mid])        {            left = mid+1;        }        else        {            return mid;        }    }    return -1;}void SeqListRemoveAll(SeqList* psl, SLDataType x){    size_t i, gap = 0;    for (i = 0; i < psl->size; i++)    {        if (psl->array[i] == x)        {            gap++;        }        else        {            psl->array[i - gap] = psl->array[i];        }    }    psl->size -= gap;}
0