自己封装一个简单动态数组,纯C语言实现

本文介绍了动态数组(可变数组)与静态数组(固定数组)的概念,讨论了动态数组的自动扩容机制和可能带来的内存效率问题,以及在实际编程中如何根据需求和资源选择使用哪种类型的数组,强调了在频繁插入和删除元素与性能优化之间的权衡。
摘要由CSDN通过智能技术生成

        动态数组(也称为可变数组)是一种可以自动增长容量的数组。在某些编程语言中,数组的长度是固定的,如果需要添加新的元素,就需要创建一个新的数组。而在动态数组中,数组的长度可以根据需要自动增长,这样就避免了因数组容量不足而需要重新分配内存的情况。

        动态数组的实现通常需要使用动态内存分配,这可能会导致内存使用效率低下。因此在某些情况下,使用静态数组(也称为固定数组)可能会更加高效。静态数组在初始化时确定数组的长度,如果在使用过程中需要添加新的元素,可以通过扩展数组来解决。

        在实际编程中,应该根据具体需求和资源限制来选择使用动态数组还是静态数组。在需要频繁插入和删除元素的情况下,动态数组可能更加适合。而在性能要求较高的场景中,静态数组可能会更加高效。

接下来让我们看看我是如何实现的:

#ifndef ARRAY_H_
#define ARRAY_H_

#include <stdbool.h>

#define DataType int
#define INITMAXSIZE 10

struct _Array
{
DataType *arr;
int maxsize;
int length;
};
typedef struct _Array Array;

//扩大动态数组容量
bool Expand(Array *arr);
//减小动态数组容量
bool Shrink(Array *arr);

//创建动态数组
Array CreateArray(int maxsize);
//清空数组
void ClearArray(Array *arr);
//添加数据
void PushData(Array *arr,DataType value);
//插入数据
bool InsertData(Array *arr,int pos,DataType value);
//删除指定位置数据
bool DeleteData(Array *arr,int pos);
//修改数据
bool ChangeData(Array *arr,int pos,DataType newvalue);
//查找数据
int FindData(Array *arr,DataType value);
//获得数据
DataType GetData(Array *arr,int pos);

void PrintArray(Array *arr);


#endif /* ARRAY_H_ */
#include "Array.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 扩大动态数组容量
bool Expand(Array *arr)
{
    if (arr->maxsize == 0)
    {
        arr->arr = (DataType *)malloc(sizeof(DataType) * 10);
        arr->maxsize = INITMAXSIZE;
    }
    else
    {
        arr->maxsize *= 2;
        arr->arr = (DataType *)realloc(arr->arr, sizeof(DataType) * (arr->maxsize));
    }
    return true;
}

// 减小动态数组容量
bool Shrink(Array *arr)
{

    if (arr->maxsize <= INITMAXSIZE || arr->length >= arr->maxsize / 2)
        return false;

    arr->maxsize /= 2;
    arr->arr = (DataType *)realloc(arr->arr, sizeof(DataType) * (arr->maxsize));
    return true;
}

Array CreateArray(int maxsize)
{

    Array arr;
    arr.maxsize = maxsize;
    arr.length = 0;

    if (maxsize > 0)
        arr.arr = (DataType *)malloc(sizeof(DataType) * maxsize);
    else
        arr.arr = NULL;

    printf("Array Created\n");

    return arr;
}

void ClearArray(Array *arr)
{
    arr->length = 0;
    arr->maxsize = 0;
    if (arr->arr != NULL)
    {
        free(arr->arr);
        arr->arr = NULL;
    }
}

void PushData(Array *arr, DataType value)
{

    if (arr->length >= arr->maxsize)
    {
        Expand(arr);
    }

    arr->arr[arr->length++] = value;
}

bool InsertData(Array *arr, int pos, DataType value)
{
    if (arr->length >= arr->maxsize)
    {
        Expand(arr);
    }
    if (pos < 0 || pos > arr->length)
        return false;

    for (int i = arr->length; i > pos; i--)
    {
        arr->arr[i] = arr->arr[i - 1];
    }

    arr->arr[pos] = value;
    arr->length++;

    return true;
}

bool DeleteData(Array *arr, int pos)
{
    if (pos < 0 || pos >= arr->length)
        return false;

    for (int i = pos; i < arr->length - 1; i++)
    {
        arr->arr[i] = arr->arr[i + 1];
    }

    arr->length--;

    if (arr->length < arr->maxsize / 4 && arr->maxsize > INITMAXSIZE)
    {
        Shrink(arr);
    }

    return true;
}

bool ChangeData(Array *arr, int pos, DataType newvalue)
{
    if (pos < 0 || pos >= arr->length)
        return false;

    arr->arr[pos] = newvalue;

    return true;
}

int FindData(Array *arr, DataType value)
{

    for (int i = 0; i < arr->length; i++)
    {
        if (arr->arr[i] == value)
            return i;
    }

    return false;
}

DataType GetData(Array *arr, int pos)
{

    if (pos < 0 || pos >= arr->length)
        return 0xFFFFFFFF;

    return arr->arr[pos];
}

void PrintArray(Array *arr)
{
    for (int i = 0; i < arr->length; i++){
        printf("%-4d,", arr->arr[i]);
    }
    printf("\n");
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 C 语言实现的数组栈代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义栈结构体 typedef struct { int data[MAX_SIZE]; // 数组存储栈元素 int top; // 栈顶指针,指向栈顶元素的下标 } Stack; // 初始化栈 void init(Stack *s) { s->top = -1; } // 判断栈是否为空 int is_empty(Stack *s) { return s->top == -1; } // 判断栈是否已满 int is_full(Stack *s) { return s->top == MAX_SIZE - 1; } // 入栈 void push(Stack *s, int x) { if (is_full(s)) { printf("Error: stack is full.\n"); exit(-1); } s->data[++s->top] = x; } // 出栈 int pop(Stack *s) { if (is_empty(s)) { printf("Error: stack is empty.\n"); exit(-1); } return s->data[s->top--]; } // 获取栈顶元素 int get_top(Stack *s) { if (is_empty(s)) { printf("Error: stack is empty.\n"); exit(-1); } return s->data[s->top]; } int main() { Stack s; init(&s); push(&s, 1); push(&s, 2); push(&s, 3); printf("Top element of stack: %d\n", get_top(&s)); pop(&s); printf("Top element of stack: %d\n", get_top(&s)); pop(&s); printf("Top element of stack: %d\n", get_top(&s)); pop(&s); printf("Is stack empty? %s\n", is_empty(&s) ? "Yes" : "No"); return 0; } ``` 代码中使用结构体 `Stack` 来封装栈,包括栈元素数组 `data` 和栈顶指针 `top`。其中,`init` 函数用于初始化栈,`is_empty` 和 `is_full` 函数分别用于判断栈是否为空和已满,`push` 函数用于入栈,`pop` 函数用于出栈,`get_top` 函数用于获取栈顶元素。在 `main` 函数中,进行了一些栈操作的演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值