动态数组操作

​ 动态数组操作均封装成函数,涉及到的操作有:

  1. 动态数组初始化
  2. 打印
  3. 添加元素
  4. 删除元素

代码附上

// 动态数组
#include <stdio.h>
#include <stdlib.h>

#define InitialSize 10
#define EachIncreaseSize 10
#define BatchAddNumber 10

typedef struct DynamicArray
{
    int *array;
    int arrayLenth;
    int initialSize;
} DynamicArray;

void Print();

// 初始化动态数组
void InitialList(DynamicArray *);

// 通过手动输入给数组批量、顺序添加元素
void AddElement(DynamicArray *);

// 打印数组
void PrintArray(DynamicArray);

// 自动给数组批量、顺序添加元素
// 自动添加多少请改变 宏定义BatchAddNumer 的值
void BatchAdd(DynamicArray *);

// 插入一个元素
void InsertElement(DynamicArray *);

// 删除一个元素
void DeletElement(DynamicArray *);
int main(void)
{
    DynamicArray list;
    InitialList(&list);
    //  AddElement(&list);
    BatchAdd(&list);
    PrintArray(list);
    Print();
    InsertElement(&list);
    PrintArray(list);
    DeletElement(&list);
    PrintArray(list);
}

void Print()
{
    printf("==========================\n");
}

void InitialList(DynamicArray *p)
{
    // 在堆区申请100个int类型长度的内存
    // 将这块内存的首地址存入结构体中的arry指针
    p->array = (int *)malloc(InitialSize * sizeof(int));
    // 数组长度为0
    p->arrayLenth = 0;
    // 数组初始化时,可存放的int数据长度为100
    p->initialSize = InitialSize;
}

void AddElement(DynamicArray *p)
{
    int i, j, n;
    j = 0;
    printf("请输入要添加元素的数量 \n");
    scanf("%d", &n);
    for (i = p->arrayLenth; i < p->arrayLenth + n; i++)
    {
        printf("请输入第%d个要添加的元素: ", ++j);
        scanf("%d", (p->array) + i);
    }
    p->arrayLenth += n;
}

void PrintArray(DynamicArray list)
{
    int i;
    printf("当前数组信息:\n");
    printf("当前数组长度为 %d \n", list.arrayLenth);
    printf("当前数组容量为 %d \n", list.initialSize);
    printf("打印数组\n");
    for (i = 0; i < list.arrayLenth; i++)
        printf("%d ", (list.array)[i]);
    printf("\n");
}

void BatchAdd(DynamicArray *p)
{
    int i, j;
    for (i = 0, j = p->arrayLenth; i < BatchAddNumber; i++)
        (p->array)[j++] = i + 1;
    p->arrayLenth += BatchAddNumber;
}

void InsertElement(DynamicArray *p)
{
    int i, n;
    int *x = NULL;
    int *y = NULL;
    int *temp = NULL;
    printf("请输入要插入到第几位\n");
    scanf("%d", &i);
    if(i < 1 || i > (p->arrayLenth + 1))
        exit(EXIT_FAILURE);
    if(p->arrayLenth >= p->initialSize)
        temp = (int*)realloc(p->array, (InitialSize + EachIncreaseSize) * sizeof(int));
    if(temp == NULL)
        exit(EXIT_FAILURE);
    // if temp != NULL && temp != p, 说明realloc函数没有在原来开辟的后面加空间
    // 而是又开辟了一块大内存,因此原来开辟的内存应该被释放掉
    p->initialSize += EachIncreaseSize;
    if(temp != p->array)
        free(p->array);
    p->array = temp;
    x = (p->array) + i - 1;
    y = (p->array) + p->arrayLenth - 1;
    printf("要插入元素的值是多少\n");
    scanf("%d", &n);
    while(y >= x)
    {
        *(y + 1) = *y;
        y--;
    }
    *x = n;
    p->arrayLenth++;
    Print();
}

void DeletElement(DynamicArray * plist)
{
    int i;
    int &arryLenth = plist->arrayLenth;
    int * arry = plist->array;
    int *p = NULL, *q = NULL;
    printf("请输入要删除第几个元素\n");
    scanf("%d", &i);
    if(i < 1 || i > arryLenth)
        exit(EXIT_FAILURE);
    p = arry + i - 1;
    q = arry + arryLenth - 1;
    while(p <= q)
    {
        *p = *(p + 1);
        p++;
    }
    arryLenth--;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值