顺序表的优点
能够随机储存和访问,能通过数组名(首数据地址)+元素序号(偏移量)直接访问
a[5]能够访问第五个数据,链表需要遍历才可以
缺点
大小确定,扩容不方便
数据改动时需要的操作太多如增删
在这个操作后,需要把后面数据全部改动
typedef struct ArrayList {int* date;//指针模拟开数组,int size;//实际数据大小
}Array;
Array initArray(){Array a;a.date = (int*)malloc(sizeof(int) * max);if (a.date == NULL) {printf("内存分配失败");return a;}a.size = 0;return a;
}//初始化
增
1.确定数据插入是否正确(插入地址是否存在)
在线性数据表中数据只能依次排序,所以要确定数据插入的地方是否是存储在指定范围内
如c
x>0||x<=储存数据的个数
确定表未满
2.确认插入数据位置
如果是在最后一个则直接插入
如果不是则插入前要倒着遍历赋值
然后再将数据插入相应位置
点击查看代码
int add(Array* ar, int x,int m)
{//ar传入结构体,x数据位置,m数据if (ar->size < max) {if (x == ar->size){ar->date[x] = m;ar->size++;}else {for (int i = ar->size; i > x; i--) {ar->date[i] = ar->date[i-1];//最后一位等于前面一位数据}ar->date[x] = m;ar->size++;}return 1;}else printf("传入数据超出储存范围");return 0;
}
查
1.确认线性表是否为空表
若为空表则输出线性表为空表,
2.确认数据位置
如找到数据则返回数据对应序号
如无则返回-1
int find(Array* ar, int k)
{for (int i = 0; i < ar->size; i ++ ) {if (ar->date[i] == k)return i;}return -1;
}
删
1.确认线性表是否为空表
2.查找相应数据位置,根据查找函数的返回值确认接下来的操作
返回值为-1,则return 0也可以输出未找到该数据
反之则从当前序号开始往后循环进行赋值处理
最后让储存数据个数加一
int delet(Array* ar, int k)
{if (ar->size == 0)return -1;//数组里面没有数据int i = find(ar, k);if (i == -1)return -1;//数组里面没找到相应数据for (; i < ar->size-1; i++) {ar->date[i] = ar->date[i + 1];}ar->size--;return 0;}
改
这个操作与删减操作差不多
在查找到相对数据的序号后
让这个序号所对应数据进行更改
int change(Array* ar, int k,int y) {if (ar->size == 0)return -1;int j = find(ar, k);if (j == -1)return -1;ar->date[j] == y;return 0;
}