顺序表的优点
能够随机储存和访问,能通过数组名(首数据地址)+元素序号(偏移量)直接访问
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||xsize < max) { if (x == ar->size) { ar->date[x] = m; ar->size++; } else { for (int i = ar->size; i > x; i--) { ar->date = ar->date[i-1];//最后一位等于前面一位数据 } ar->date[x] = m; ar->size++; } return 1; } else printf("传入数据超出储存范围"); return 0;}[/code]查
1.确认线性表是否为空表
若为空表则输出线性表为空表,
2.确认数据位置
如找到数据则返回数据对应序号
如无则返回-1- 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,则return 0也可以输出未找到该数据
反之则从当前序号开始往后循环进行赋值处理
最后让储存数据个数加一- int find(Array* ar, int k)
- {
- for (int i = 0; i < ar->size; i ++ ) {
- if (ar->date[i] == k)return i;
- }
- return -1;
- }
复制代码 改
这个操作与删减操作差不多
在查找到相对数据的序号后
让这个序号所对应数据进行更改- 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;
-
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |