·聚合类型是一种复合数据类型,用于将多个数据项组合成一个整体。它通常用于表示数组、结构体、类等复合数据结构,以便于处理和管理。
线性结构:可以看作是用一根线把所有的节点串起来的结构
·连续存储[数组]
·离散存储[链表]
而栈和队列是对线性结构的两种常用的应用
数组的概念:
数组是由类型相同、大小相等的数据元素构成的有限序列,每个元素都有一个唯一的位置标识,且整个序列的大小是固定的。
下代码把数组模拟出来:
#include<stdio.h> #include<malloc.h> #include?<stdlib.h>//exit()要用到这个头文件 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; } } } |