首页 > 其他分享 >结构体变种特殊用法——顺序表

结构体变种特殊用法——顺序表

时间:2024-09-30 19:54:42浏览次数:9  
标签:index 顺序 变种 int list 用法 内存 data

顺序表是一种基本的数据结构,它在C语言中通常使用数组来实现。顺序表是一种线性表的物理存储结构,其特点是数据元素的逻辑顺序和物理顺序相同,即表中第i个位置的元素对应数组的第i个元素。

顺序表的结构

结构体第一个元素应该写数组,其次是我们需要该顺序表实现的功能;

例如:一个可以容纳1000整形并且可以知道有效数据个数和容量大小的的顺序表。

typedef struct SlDatatype//数据表名称
{
    int arr[1000];//定义顺序表可容纳的数据个数
    int size;     //有效数据个数
    int capacity  //容量大小
}

顺序表的特点

  1. 随机访问:顺序表支持通过索引快速访问任意位置的元素。
  2. 动态分配:在C语言中,通常使用指针和动态内存分配(如mallocrealloc)来创建可变长度的顺序表。
  3. 连续存储:顺序表中的元素在内存中是连续存储的。

顺序表和数组的区别?

顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝。

顺序表的分类

静态顺序表

数组空间确定,容量确定,预先给定的空间太大会造成空间浪费,太小会导致数据存储不完。

#define N 1000
typedef char SLDataType;
//静态顺序表
typedef struct seqlist 
{
SLDataType arr[N];
int size;//有效数据个数
}SL;

动态顺序表

将静态顺序表中首元素由数组名变成了数组地址,可以利用malloc,realloc函数来为表中数组动态申请空间,可以更高效的利用空间。

//动态顺序表
typedef struct seqList
{
SLDataType* arr;
int size;//有效数据个数
int capacity;//容量大小
}SL;

下面详细的介绍动态顺序表常用功能的使用方法

初始化:使用malloccalloc函数动态分配内存空间,初始化顺序表。例如:

typedef struct {
    int *data;    // 指向动态分配数组的指针
    int length;   // 顺序表的当前长度
    int capacity; // 顺序表的最大容量
} SeqList;

void initSeqList(SeqList *list, int initialCapacity) //用于申请空间的函数
{
    list->data = (int *)malloc(initialCapacity * sizeof(int));//为函数申请初始空间
    if (list->data == NULL) //如果申请失败,则返回错误报告并退出程序
    {
        printf("Memory allocation failed.\n");
        exit(1);
    }
    list->length = 0;//刚申请空间,目前一个数据都没有,初始化顺序表长度为0;
    list->capacity = initialCapacity;//显示顺序表容量
}

销毁:使用free函数释放动态分配的内存空间。

void freeSeqList(SeqList *list) {
    free(list->data);
    list->data = NULL;
    list->length = 0;
    list->capacity = 0;
}

插入元素:在顺序表的指定位置插入元素,如果空间不足,需要使用realloc函数扩大数组容量。

void insert(SeqList *list, int index, int value)//用于给顺序表插入我们所需要记录的内容的函数
 {
    if (index < 0 || index > list->length)//例行报错
    {
        printf("Index out of bounds.\n");
        return;
    }
    if (list->length == list->capacity)//如果原数组内存不够,则继续申请空间
       {
        int newCapacity = list->capacity * 2;
        int *newData = (int *)realloc(list->data, newCapacity * sizeof(int));
        if (newData == NULL) {
            printf("Memory reallocation failed.\n");
            return;
        }
        list->data = newData;
        list->capacity = newCapacity;
    }

    for (int i = list->length; i > index; i--)//将原数据向左移动一位
    {
        list->data[i] = list->data[i - 1];
    }
    list->data[index] = value;
    list->length++;
}

删除元素:从顺序表中删除指定位置的元素。

void remove(SeqList *list, int index) 
{
    if (index < 0 || index >= list->length)
    {
        printf("Index out of bounds.\n");
        return;
    }
    for (int i = index; i < list->length - 1; i++) 
    {
        list->data[i] = list->data[i + 1];
    }
    list->length--;
}

查找元素:在顺序表中查找一个元素,返回其位置。

int find(SeqList *list, int value) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == value) {
            return i;
        }
    }
    return -1;
}

更新元素:更新顺序表中指定位置的元素值。

void update(SeqList *list, int index, int newValue) {
    if (index < 0 || index >= list->length) {
        printf("Index out of bounds.\n");
        return;
    }
    list->data[index] = newValue;
}

打印顺序表:打印顺序表中的所有元素。

void printSeqList(SeqList *list) {
    for (int i = 0; i < list->length; i++) {
        printf("%d ", list->data[i]);
    }
    printf("\n");
}

扩容:当顺序表的容量不足以容纳更多元素时,需要扩容。

void ensureCapacity(SeqList *list, int newCapacity) {
    int *newData = (int *)realloc(list->data, newCapacity * sizeof(int));
    if (newData == NULL) {
        printf("Memory reallocation failed.\n");
        return;
    }
    list->data = newData;
    list->capacity = newCapacity;
}

顺序表的使用注意事项

  1. 初始化:在创建动态顺序表时,需要为其分配初始内存空间。这通常通过malloccalloc函数完成。分配的内存应该足以存储预期数量的元素,同时留有一定的余地以便于后续的扩展。

  2. 扩容:当顺序表的元素数量达到当前容量时,需要扩容以避免溢出。扩容通常涉及到申请一块更大的内存空间,并将现有元素复制到新内存区域。扩容策略通常是将容量增加到原来的某个固定比例(如两倍),以减少频繁扩容的性能开销。

  3. 释放内存:当顺序表不再使用时,应该使用free函数释放分配的内存空间,以避免内存泄漏。

  4. 内存分配失败的处理:在使用mallocrealloc分配内存时,可能会因为各种原因(如内存不足)失败。程序应该检查这些函数的返回值,并在分配失败时进行适当的错误处理。

  5. 避免内存碎片:频繁的内存分配和释放可能会导致内存碎片,影响程序性能。可以通过适当的内存管理策略(如内存池)来减少内存碎片。

  6. 数据复制:在扩容时,需要将现有数据复制到新的内存区域。这个过程需要小心处理,确保所有数据都被正确复制,并且顺序不发生变化。

  7. 内存对齐和访问效率:现代计算机系统通常有内存对齐的要求。在分配内存时,应确保满足这些要求,以提高内存访问效率。

  8. 引用管理:在涉及到对象引用的动态顺序表中,需要注意管理好引用,确保不再使用的引用能够被垃圾回收,避免内存泄漏。

  9. 性能监控:在程序运行过程中,应监控内存使用情况,及时发现并解决内存使用中的问题,如内存泄漏、过度扩容等。

标签:index,顺序,变种,int,list,用法,内存,data
From: https://blog.csdn.net/2301_79616907/article/details/142615849

相关文章

  • CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2
    【前言】本期视频就一个任务,通过ARM官方的CMSISRTOS文档,将常用配置和用法给大家梳理清楚。对于初次使用CMSIS-RTOS的用户来说,通过梳理官方文档,可以系统的了解各种用法,方便大家再进一步的自学或者应用,起到授人以渔的作用。更深入的可以看之前分享的RTOS运行机制,任务管理,上下......
  • MATLAB中isgraphics函数用法
    目录语法说明示例测试是否为有效句柄测试句柄类型        isgraphics函数的用法是对有效的图形对象句柄为True。语法tf=isgraphics(H)tf=isgraphics(H,type)说明        tf=isgraphics(H)为H中属于有效图形对象的元素返回true,为不是有......
  • 在Robot Framework中Run Keyword If的用法
    基本用法使用ELSE使用ELSEIF使用内置变量使用Python表达式本文永久更新地址:在RobotFramework中,RunKeywordIf是一个条件执行的关键字,它允许根据某个条件来决定是否执行某个关键字。下面是RunKeywordIf的基本用法:RunKeywordIfconditionkeyword.........
  • 数据结构————顺序表
    1.线性表什么是线性表呢大家往下面看:其实线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串(线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是......
  • 数据结构(顺序表)
    无论你期望或者不期望,清晨依旧来临。--谏山创《进击的巨人》线性表的概念1.线性表是n个具有相同特性的数据元素的有限序列。2.线性表在逻辑上是线性结构,但是在物理结构上并不⼀定是连续的。3.线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表的概念......
  • C++ 静态顺序表和动态顺序表
    对比静态顺序表与动态顺序表特性静态顺序表动态顺序表大小固定动态内存管理简单复杂随机访问快速快速插入/删除效率较低较低(需移动元素)扩展能力不可扩展可扩展C++静态顺序表概述定义:静态顺序表是一种线性表的实现方式,采用一段连续的内存空间存储数据元素,具有固定的大小。在......
  • Vue 常用的指令用法
    文章目录Vue常用的指令用法一、引言二、指令详解1、v-model2、v-bind3、v-for4、v-if/v-else-if/v-else5、v-show6、v-on7、v-text和v-html三、指令使用技巧四、总结Vue常用的指令用法一、引言Vue.js是一个构建用户界面的渐进式框架,它通过一系列指令来实......
  • python内置模块typing里Literal函数的基本用法和总结--快速学习掌握Literal函数的用法
    Literal是Pythontyping模块中提供的一种类型注解,用于指定变量或函数的参数只能取特定的字面量值(常量)。它允许你将变量的取值严格限制在指定的一组值内,确保程序只接受特定的常量值,从而减少错误的发生。一、基本概念在Python中,通常我们会使用常见的类型注解来限制变量......
  • PermissionHandler包的用法
    文章目录概念介绍使用方法示例代码经验分享我们在上一章回中介绍了局部动态列表相关的内容,本章回中将介绍权限管理包permission_hanadler.闲话休提,让我们一起TalkFlutter吧。概念介绍权限是使用某种功能的授权,比如使用手机上的相机就是获取相机相关的权限......
  • 第5周 5.1 顺序与选择结构
    5.1顺序与选择结构5.1.1顺序结构顺序结构是程序中最简单、最基本的流程控制结构,它按照程序中语句出现的先后顺序依次执行,直到程序的结束。顺序结构示例:publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("Hel......