数据结构:02 顺序表array

文章详细介绍了顺序表这种数据结构,包括其存储结构、主要操作如创建、销毁、清空、插入、删除、访问、修改、排序和遍历的实现,强调了保持元素连续性和防止越界的重要性。顺序表的优点在于随机访问效率高,但插入和删除操作较慢,且对内存需求较大。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据项:

        *存储连续元素的内存首地址

        *表的容量

        元素的数量

运算:

        创建、销毁、清空、插入、删除、访问、查询、修改、排序、遍历

*注意:

        ① 从始至终都要时刻保证元素的连续性

        ② 不能越界

        优点:支持随机访问,修改、访问、排序效率高,不容易出现内存碎片

        缺点:对内存要求高,插入、删除元素时不方便、效率低

运算的代码实现举例

        顺序表的结构可以如图这般简单这样理解。数据项作为一个结构体存储表内存的首地址、表容量、元素的数量,访问顺序表内的内容时,只需要明确哪个数据项,该内容相对于首地址的位置,例如我需要访问ptr[2]这个元素,只需要arr->ptr[2]即可

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h> 
#define TYPE int

设计顺序表结构

typedef struct Array
{
    TYPE* ptr;//存储元素的内存首地址
    size_t cal;//表的容量
    size_t cnt;//元素的数量
}Array;

创建

Array* create_array(size_t size)
{
    //分配表结构的内存
    Array* arr = malloc(sizeof(Array));
    //分配存储元素的内存
    arr->ptr = malloc(sizeof(TYPE)*size);
    //记录容量
    arr->cal = size;
    //初始化数量
    arr->cnt = 0;
    return arr;
}

销毁

void destroy_array(Array* arr)
{
    free(arr->ptr);
    free(arr);
}

清空

void clean_array(Array* arr)
{
    arr->cnt=0;
}

插入

bool insert_array(Array* arr,size_t index,TYPE val)
{
    if(arr->cnt >= arr->cal) return false;
    //判断下标是为了确保表中元素的连续性
    if(arr->cnt < index) return false;
    /*
    for(int i=arr->cnt;i>index;i--)
    {
        arr->ptr[i]=arr->ptr[i-1];
    }
    */
    //内存拷贝
    memmove(arr->ptr+index+1,arr->ptr+index,(arr->cnt-index)*sizeof(TYPE));
    //插入的位置赋值    
    arr->ptr[index]=val;
    //表内元素的总量+1
    arr->cnt++;
    return true;
}

删除

bool delete_array(Array* arr,size_t index)
{
    if(arr->cnt <= index) return false;
    memmove(arr->ptr+index,arr->ptr+index+1,(arr->cnt-index-1)*sizeof(TYPE));
    arr->cnt--;
    return true;
}

访问

bool access_array(Array* arr,size_t index,TYPE* val)
{
    if(arr->cnt <= index) return false;
    *val=arr->ptr[index];
    return true;
}

修改

bool modify_array(Array* arr,size_t index,TYPE val)
{
    if(arr->cnt <= index) return false;
    arr->ptr[index]=val;
    return true;
}

查询

int query_array(Array* arr,TYPE val)
{
    for(int i=0;i<arr->cnt;i++)
    {
        if(val==arr->ptr[i])
        {
            return i;
        }
    }
    return -1;
}

排序

void sort_array(Array* arr)
{
    for(int i=0;i<arr->cnt-1;i++)
    {
        int k=i;
        for(int j=i;j<arr->cnt;j++)
        {
            if(arr->ptr[k]>arr->ptr[j])
            {
                k=j;
            }
        }
        if(k!=i)
        {
            TYPE temp=arr->ptr[k];
            arr->ptr[k]=arr->ptr[i];
            arr->ptr[i]=temp;
        }
    }
}

遍历

void show_array(Array* arr)
{
    for(int i=0;i<arr->cnt;i++)
    {
        printf("%d ",arr->ptr[i]);
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就酱77叭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值