当前位置: 首页 > news >正文

C语言_数据结构总结1:静态分配方式的顺序表

纯C语言代码,不涉及C++

1. 初始化   

#define MaxSize 50
typedef int ElemType;

typedef struct SQList {
    ElemType data[MaxSize];    //定义一个数组存放顺序表元素
    int length;                            //顺序表当前的长度(元素个数)
}SqList;                                   //给顺序表SQList起别名为SqList

2. 插入   

即:在第pos个位置插入value值,即在数组下标pos-1的位置插入value值

int InsertSqList(SqList* L, int pos, ElemType value) {
    //1.判断插入位置是否合法
    if (pos < 1 || pos > L->length + 1)
    {
        printf("选择插入位置不当!");
        return 0;
    }

    //2.判断顺序表存储空间是否满了
    if (L->length >= MaxSize)
    {
        printf("顺序表空间已满,无法进行插入操作!");
        return 0;
    }

    //3.将第pos个位置及往后的元素都后移一个位置,空出第pos个位置(这里采用逆序遍历)
    for (int i = L->length - 1; i >= pos - 1; i--)
    {
        L->data[i + 1] = L->data[i];
    }

    //4.插入数据
    L->data[pos - 1] = value;
    //5.表长加1
    L->length++;
    return 1;
}

3. 按位查找   

即:即返回第pos个位置(数组下标为pos-1)对应的value值

ElemType findValueByPos(SqList* L, int pos) {
    //1.判断要查找的位置是否合理
    if (pos < 1 || pos > L->length)
    {
        printf("抱歉,该位置不在顺序表范围内!");
        return 0;
    }
    //2.查找第pos个位置对应的value值
    ElemType value = L->data[pos - 1];
    return value;
}

4. 按值查找   

即:即返回value值的位序,即第几个,下标加1

int  findPosByValue(SqList* L, ElemType value) {
    for (int i = 0; i < L->length; i++)
    {
        if (L->data[i] == value) {
            return i + 1;
        }
    }
    printf("抱歉,查无此值");
    return 0;
}

5. 删除   

即:将第pos个的值赋值给value后腾开第pos个位置
然后将第pos个后的数据都往前移一个位置,填补第pos个位置

int deleteSqList(SqList* L, int pos,ElemType* value) {
    //1.判断要删除的位置是否合理,即是否在存有数据的范围里
    if (pos < 1 || pos > L->length)
    {
        printf("选择删除位置不当!");
        return 0;
    }

    //2.判断空间是否为空
    if (L->length == 0)
    {
        printf("顺序表空间为空,无法进行删除操作!");
        return 0;
    }

    //3.将被删除的元素赋值给value
    *value = L->data[pos - 1];

    //4.将第pos个位置往后的元素都前移一个位置
    for (int i = pos ; i < L->length; i++)
    {
        L->data[i - 1] = L->data[i];
    }

    //4.表长减1
    L->length--;
    return 1;
}

6. 注销   

注意:由于顺序表采用的是静态分配方式,L->data 是一个数组,并非动态分配的内存,所以不能使用 free(L->data) 来释放内存。同时,L 是在栈上分配的,也不能使用 free(L) 释放。

void  destroySqList(SqList* L) {
    //静态分配无需释放内存
    if (L != NULL)
    {
        L->length = 0;
    }
}

7. 打印顺序表(格式1:每个元素后都有空格打印) 

void printSqList1(SqList* L) {
    if (L->length == 0)
    {
        printf("当前顺序表为空!\n");
    }
    for (int i = 0; i < L->length; i++)
    {
        printf("%d ", L->data[i]);
    }
    printf("\n--------------------------------------------------\n");
}

8. 打印顺序表(格式2:最后一个元素末尾没有空格打印) 

void printSqList2(SqList* L) {
    if (L->length == 0)
    {
        printf("当前顺序表为空!\n");
    }
    for (int i = 0; i < L->length; i++)
    {
        if (i == L->length - 1)
        {
            printf("%d", L->data[i]);
        }
        else
        {
            printf("%d ", L->data[i]);
        }
        
    }
    printf("\n--------------------------------------------------\n");
}

9. 测试代码   

int main() {
    SqList L;
    InitSqList(&L);
    //插入数据测试
    InsertSqList(&L, 1, 18);
    InsertSqList(&L, 2, 7);
    InsertSqList(&L, 3, 34);
    printSqList1(&L);  //18 7 34

    //删除数据测试
    ElemType value;
    deleteSqList(&L, 2,&value);
    printSqList1(&L);  //18 34

    //查找位置1的值是什么
    ElemType val = findValueByPos(&L, 1);  
    printf("%d\n",val);  //18

    //查找值18在顺序表的第几个位置
    int pos = findPosByValue(&L,18);
    printf("%d\n", pos);  //1

    //销毁顺序表
    destroySqList(&L);

    return 0;
}

10. 完整代码   

#include<stdio.h>
/*
    静态分配的顺序表
*/

#define MaxSize 50
typedef int ElemType;

typedef struct SQList {
    ElemType data[MaxSize];  //定义一个数组存放顺序表元素
    int length;              //顺序表当前的长度(元素个数)
}SqList; //给顺序表SQList起别名为SqList

//操作1——初始化
void InitSqList(SqList* L) {
    L->length = 0;  //顺序表初始化长度为0
}

//操作2——插入:在第pos个位置插入value值,即在数组下标pos-1的位置插入value值
int InsertSqList(SqList* L, int pos, ElemType value) {
    //1.判断插入位置是否合法
    if (pos < 1 || pos > L->length + 1)
    {
        printf("选择插入位置不当!");
        return 0;
    }

    //2.判断顺序表存储空间是否满了
    if (L->length >= MaxSize)
    {
        printf("顺序表空间已满,无法进行插入操作!");
        return 0;
    }

    //3.将第pos个位置及往后的元素都后移一个位置,空出第pos个位置(这里采用逆序遍历)
    for (int i = L->length - 1; i >= pos - 1; i--)
    {
        L->data[i + 1] = L->data[i];
    }

    //4.插入数据
    L->data[pos - 1] = value;
    //5.表长加1
    L->length++;
    return 1;
}

//操作3——按位查找,即返回第pos个位置对应的value值
ElemType findValueByPos(SqList* L, int pos) {
    //1.判断要查找的位置是否合理
    if (pos < 1 || pos > L->length)
    {
        printf("抱歉,该位置不在顺序表范围内!");
        return 0;
    }
    //2.查找第pos个位置对应的value值
    ElemType value = L->data[pos - 1];
    return value;
}

//操作4——按值查找,即返回value值的位序,即第几个,下标加1
int  findPosByValue(SqList* L, ElemType value) {
    for (int i = 0; i < L->length; i++)
    {
        if (L->data[i] == value) {
            return i + 1;
        }
    }
    printf("抱歉,查无此值");
    return 0;
}

//操作5——删除:将第pos个的值赋值给value后腾开第pos个位置
// 然后将第pos个后的都数据往前移一个位置,填补第pos个位置
int deleteSqList(SqList* L, int pos,ElemType* value) {
    //1.判断要删除的位置是否合理,即是否在存有数据的范围里
    if (pos < 1 || pos > L->length)
    {
        printf("选择删除位置不当!");
        return 0;
    }

    //2.判断空间是否为空
    if (L->length == 0)
    {
        printf("顺序表空间为空,无法进行删除操作!");
        return 0;
    }

    //3.将被删除的元素赋值给value
    *value = L->data[pos - 1];

    //4.将第pos个位置往后的元素都前移一个位置
    for (int i = pos ; i < L->length; i++)
    {
        L->data[i - 1] = L->data[i];
    }

    //4.表长减1
    L->length--;
    return 1;
}

//操作6——注销
void  destroySqList(SqList* L) {
    //静态分配无需释放内存
    if (L != NULL)
    {
        L->length = 0;
    }
}

//操作7.1——打印顺序表里存放的数据
void printSqList1(SqList* L) {
    if (L->length == 0)
    {
        printf("当前顺序表为空!\n");
    }
    for (int i = 0; i < L->length; i++)
    {
        printf("%d ", L->data[i]);
    }
    printf("\n--------------------------------------------------\n");
}

//操作7.2——打印顺序表里存放的数据,最后一个元素后面无空格
void printSqList2(SqList* L) {
    if (L->length == 0)
    {
        printf("当前顺序表为空!\n");
    }
    for (int i = 0; i < L->length; i++)
    {
        if (i == L->length - 1)
        {
            printf("%d", L->data[i]);
        }
        else
        {
            printf("%d ", L->data[i]);
        }
        
    }
    printf("\n--------------------------------------------------\n");
}

//测试
int main() {
    SqList L;
    InitSqList(&L);
    //插入数据测试
    InsertSqList(&L, 1, 18);
    InsertSqList(&L, 2, 7);
    InsertSqList(&L, 3, 34);
    printSqList1(&L);  //18 7 34

    //删除数据测试
    ElemType value;
    deleteSqList(&L, 2,&value);
    printSqList1(&L);  //18 34

    //查找位置1的值是什么
    ElemType val = findValueByPos(&L, 1);  
    printf("%d\n",val);  //18

    //查找值18在顺序表的第几个位置
    int pos = findPosByValue(&L,18);
    printf("%d\n", pos);  //1

    //销毁顺序表
    destroySqList(&L);

    return 0;
}

11. 运行截图

如有问题,欢迎指出!

谢谢!

相关文章:

  • 记一次ScopeSentry搭建
  • DAV_postgresql_4-pg安装
  • 文件操作核心概念总结
  • 鸿蒙中打开相机相册
  • AIGC时代:如何快速搞定Spring Boot+Vue全栈开发
  • *基础算法(1)
  • Linux之df命令
  • 网络安全工作怎么样?
  • 【CPU】Hart ID是什么(草稿)
  • AutoGen学习笔记系列(三)Tutorial - Agents
  • 深拷贝 浅拷贝防御性拷贝
  • 每日一题洛谷普及/提高-P1154 奶牛分厩c++
  • SAP MDG —— MDG on S/4HANA 2023 FPS03 创新汇总
  • mapbox进阶,使用点类型geojson加载symbol符号图层,用于标注带图标的注记,且文字居中在图标内,图标大小自适应文字
  • html | 预览一个颜色数组
  • OpenHarmony文件管理子系统
  • Kubernetes集群部署实战:从零到英雄
  • 【Flutter】正方形的Dialog
  • 通俗易懂的聚类算法之K均值详解
  • 嵌入式开发:磁通门传感器开发(4):自然环境中的磁场
  • 企业营销微网站建设/百度网站排名搜行者seo
  • 刚察县wap网站建设公司/营销公司
  • 公司怎么与网站进行活动推广/南京百度快速排名优化
  • wordpress建手机网站/全球疫情最新数据消息
  • 跟做网站相关的法律/站长工具排名分析
  • 建设掌上银行官方网站/免费web服务器网站