前言
本文面向编程零基础的小白,简单了解C语言中动态数组的用法。
正文
数据结构:数组(动态数组\列表),链表(双向链表/环形链表),堆/栈,队列
数组:数组长度一旦确定不可更改(连续的内存)
动态数组:可以根据数据的增加动态扩容
实现对数据的增/删/查/改
首先给定一块区域存放数据,再用指针保存内存,便于后面实现动态数组功能
//初始数组 int arr[] = {1, 2, 3, 4, 5}; // int * arrP = &arr[0]; int * arrP = arr; //保存第一个元素的内存地址 int len = 5; //数组长度 int size = 5; //记录有效数据个数把所需功能的代码分别写出:
1.增
如果需要增加数据,在增加之前要确认内存是否需要扩容(即有效数据个数是否等于内存长度)如果不用扩容,则直接将增加的数据放在有效数据最后一位的下标后
int data = 0; scanf("%d", &data); arrP[size] = data; size++;如果需要扩容,则先扩容再增加数据
if (size == len) { //根据原数组长度2陪扩容(开辟新的内存空间,以字节为单位) int nLen = len * 2; int *nArrP = (int *)malloc(nLen *sizeof(int)); //复制原数组的数据 for (int i = 0; i < len; i++) { nArrP[i] = arrP[i]; } len = nLen; arrP = nArrP; //更新内存地址 } //添加数据到末尾 arrP[size] = data; size++;2.删
删除数据可以分为几种情况:指定位置删除(31)和指定数据删除(32)
写一个判断语句选择其一
int index; scanf("%d", &index); if (index == 31) { }else if(index == 32){ }指定位置删除(31):
int data = 0; scanf("%d", &data); for (int i = data; i < size - 1 ; i++) { arrP[i] = arrP[i + 1];//从输入的下标处开始从后往前置换数据 } size--;指定数据删除(32):
int shu; scanf("%d", &shu); for (int i = 0; i < size; i++) { if (arrP[i] == shu) { for (int j = i; j < size; j++) { arrP[i] = arrP[i + 1]; } size--;3.查
输入指定下标并输出对应数据即可
int data; scanf("%d", &data); printf("%d\n", arrP[data]);4.改
输入指定下标,再将新数据覆盖原数据即可
int data; int index; scanf("%d", &data); printf("请输入数据:\n"); scanf("%d", &index); arrP[data] = index;要共同实现这些功能,可以用分支语句按情况写入各个分支
printf("\n===== 自定义动态数组 ===== \n"); printf("===== 1.添加数据 ===== \n"); printf("===== 2.删除数据 ===== \n"); printf("===== 3.插入数据 ===== \n"); printf("===== 4.查找数据 ===== \n"); printf("===== 输入编号: ===== \n"); int id = 0; scanf("%d", &id); switch (id) { case 1: { } break; case 2{ } ...最后打印数组信息
printf("数组中数据:"); for (int i = 0; i < size; i++) { printf("%d ", arrP[i]);