·聚合类型是一种复合数据类型,用于将多个数据项组合成一个整体。它通常用于表示数组、结构体、类等复合数据结构,以便于处理和管理。
线性结构:可以看作是用一根线把所有的节点串起来的结构
·连续存储[数组]
·离散存储[链表]
而栈和队列是对线性结构的两种常用的应用
数组的概念:
数组是由类型相同、大小相等的数据元素构成的有限序列,每个元素都有一个唯一的位置标识,且整个序列的大小是固定的。
下代码把数组模拟出来:
#include #include #include struct Arr { int* pBase;//存储的是数组第一个元素的地址 int len;//数组所能容纳的最大元素的个数/数组的长度 int cnt;//当前数组有效元素的个数 }; void initArr(struct Arr* pArr,int length);//初始化 bool appendArr(struct Arr* pArr, int val);//末尾添加 bool insertArr(struct Arr* pArr, int val,int pos);//插入元素---这里的pos指的是在数组中的下标的位置 bool deleteArr(struct Arr* pArr, int pos,int* val);//删除元素---int*用于接收删除的那个节点的值 int get(struct Arr arr,int pos);//获取元素 bool isEmpty(struct Arr arr);//判空 bool isFull(struct Arr arr);//判满 void showArr(struct Arr arr);//输出数组 void inversionArr(struct Arr* pArr);//逆置数组 int main() { struct Arr arr; int val; initArr(&arr, 6); appendArr(&arr, 0); appendArr(&arr, 1); appendArr(&arr, 2); appendArr(&arr, 3); inversionArr(&arr); showArr(arr); return 0; } void initArr(struct Arr* pArr, int length) { pArr->pBase = (int*)malloc(sizeof(int) * length); if (pArr->pBase == NULL) { printf("动态内存分配失败\n"); exit(-1);//终止整个程序 } else { pArr->len = length; pArr->cnt = 0; } } void showArr(struct Arr arr) { if (isEmpty(arr)) { printf("数组为空\n"); } else { for (int i = 0; i < arr.cnt; i++) { printf("%d\n", arr.pBase[i]); } } } bool isEmpty(struct Arr arr) { if (arr.cnt == 0) { return true; } else { return false; } } bool isFull(struct Arr arr) { if (arr.cnt == arr.len) { return true; } else { return false; } } bool appendArr(struct Arr* pArr, int val) { if (isFull(*pArr)) { printf("数组已满\n"); return false; } else { pArr->pBase[pArr->cnt] = val; pArr->cnt++; return true; } } bool insertArr(struct Arr* pArr, int val, int pos) { if (isFull(*pArr)) { printf("数组已满\n"); return false; } if (pos < 0 || pos > pArr->cnt) { printf("插入位置错误\n"); return false; } for (int i = pArr->cnt; i > pos; i--) { pArr->pBase[i] = pArr->pBase[i - 1]; } pArr->pBase[pos] = val; pArr->cnt++; return true; } bool deleteArr(struct Arr* pArr, int pos, int* val) { if (isEmpty(*pArr)) { printf("数组为空,无法删除\n"); return false; } if(pos<0||pos>=pArr->cnt){ printf("删除位置错误\n"); return false; } *val = pArr->pBase[pos]; for (int i = pos; i < pArr->cnt-1; i++) { pArr->pBase[i] = pArr->pBase[i + 1]; } pArr->cnt--; return true; } int get(struct Arr arr, int pos) { if (isEmpty(arr)) { printf("数组为空"); exit(-1); } return arr.pBase[pos]; } void inversionArr(struct Arr* pArr) { if (isEmpty(*pArr)) { printf("数组为空,无法逆置"); } else { for (int i = 0; i < pArr->cnt / 2; i++) { int t = pArr->pBase[i]; pArr->pBase[i] = pArr->pBase[pArr->cnt - 1 - i]; pArr->pBase[pArr->cnt - 1 - i] = t; } } } |