1.什么是定长的顺序表
2.一系列操作&&代码实现
3.代码演示
一.什么是定长的顺序表
有效长度固定,能存储的数据有限
以数组长度为10 为例
二.一系列操作
注意一下两个点:1.插入元素要判断是否是满的,因为本节我们研究的是定长的顺序表,不能扩容,所以我们直接返回错误 2.删除要判断是否为空,如果元素都是空的,就没有必要删除了
1.头插
然后有效长度变长加1;
bool insert_head(Plist ls, int val) {
assert(ls != NULL);
if (IsFull(ls)) {
return false;
}
for (int i = ls->length; i >= 0; i--) {
ls->arr[i + 1] = ls->arr[i];
}
ls->arr[0] = val;
ls->length++;
return true;
}
将所有元素向后挪一个位置还有一种写法,有兴趣的宝子可以自己尝试一下
2.按位置插
第一步:输入这个位置
第二步:从这个位置开始,到数组有效长度所在的位置-1,所有元素向后挪动一个位置
第三步:插入想插入的元素
bool insert_pos(Plist ls, int pos, int val) {
assert(ls != NULL);
if (IsFull(ls)) {
return false;
}
for (int i = ls->length; i >= pos; i--) {
ls->arr[i + 1] = ls->arr[i];
}
ls->arr[pos] = val;
ls->length++;
return true;
}
3.尾插
首先判断数组是否已经满了,然后我们直接把元素存储在有效值末端,数组有效长度+1即可。
bool insert_tail(Plist ls, int val) {
assert(ls != NULL);
if (IsFull(ls)) {
return false;
}
ls->arr[ls->length] = val;
ls->length++;
return true;
}
4.头删
所有元素往前统一挪动一个单位
bool del_head(Plist ls) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
for (int i = 0; i < ls->length; i++) {
ls->arr[i] = ls->arr[i + 1];
}
ls->length--;
return true;
}
5.按位置删
与头删原理是相同的,只是位置发生了改变
bool del_pos(Plist ls, int pos) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
for (int i = pos; i < ls->length; i++) {
ls->arr[i] = ls->arr[i + 1];
}
ls->length--;
return true;
}
6.按值删
首先找到这个值所在的位置,然后按位置删除即可
bool del_val(Plist ls, int val) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
int tmp = 0;
for (int i = 0; i < ls->length; i++) {
if (ls->arr[i] == val) {
tmp = i;
}
}
del_pos(ls, tmp);
}
7尾删
只需要有效长度缩减一个单位长度
bool del_tail(Plist ls) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
ls->length--;
return true;
}
8判空:我们的有效长度等于0
9判满:我们的有效长度和我们定义的数组长度一样
10清除:有效长度等于0就行
11查找:遍历数组,找到要查询的元素
12打印:遍历数组,打印
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"list01.h"
typedef int ELEM_TYPE;
typedef struct list {
ELEM_TYPE arr[10];
ELEM_TYPE length;
}list, * Plist;
void Init_list(Plist ls) {
assert(ls != NULL);
if (ls == NULL) {
exit(1);
}
ls->length = 0;
}
bool insert_head(Plist ls, int val) {
assert(ls != NULL);
if (IsFull(ls)) {
return false;
}
for (int i = ls->length; i >= 0; i--) {
ls->arr[i + 1] = ls->arr[i];
}
ls->arr[0] = val;
ls->length++;
return true;
}
bool insert_pos(Plist ls, int pos, int val) {
assert(ls != NULL);
if (IsFull(ls)) {
return false;
}
for (int i = ls->length; i >= pos; i--) {
ls->arr[i + 1] = ls->arr[i];
}
ls->arr[pos] = val;
ls->length++;
return true;
}
bool insert_tail(Plist ls, int val) {
assert(ls != NULL);
if (IsFull(ls)) {
return false;
}
ls->arr[ls->length] = val;
ls->length++;
return true;
}
bool del_head(Plist ls) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
for (int i = 0; i < ls->length; i++) {
ls->arr[i] = ls->arr[i + 1];
}
ls->length--;
return true;
}
bool del_pos(Plist ls, int pos) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
for (int i = pos; i < ls->length; i++) {
ls->arr[i] = ls->arr[i + 1];
}
ls->length--;
return true;
}
bool del_val(Plist ls, int val) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
int tmp = 0;
for (int i = 0; i < ls->length; i++) {
if (ls->arr[i] == val) {
tmp = i;
}
}
del_pos(ls, tmp);
}
bool del_tail(Plist ls) {
assert(ls != NULL);
if (IsEmpty(ls)) {
return false;
}
ls->length--;
return true;
}
bool IsEmpty(Plist ls) {
assert(ls != NULL);
return ls->length == 0;
}
bool IsFull(Plist ls) {
assert(ls != NULL);
return ls->length == 10;
}
void clean(Plist ls) {
assert(ls != NULL);
ls->length = 0;
}
void Search(Plist ls, int val) {
assert(ls != NULL);
for (int i = 0; i < ls->length; i++) {
if (ls->arr[i] == val) {
printf("%d在数组的%d的位置\n", val, i + 1);
}
}
}
void Show(Plist ls) {
assert(ls != NULL);
for (int i = 0; i < ls->length; i++) {
printf("%d ", ls->arr[i]);
}
printf("\n");
}
三.代码演示
int main() {
list Ls;
Init_list(&Ls);
for (int i = 0; i < 5; i++) {
insert_pos(&Ls, i, i + 1);
}
Show(&Ls);
insert_head(&Ls, 100);
Show(&Ls);
insert_tail(&Ls, 99);
Show(&Ls);
del_head(&Ls);
Show(&Ls);
del_tail(&Ls);
Show(&Ls);
del_pos(&Ls, 1);
Show(&Ls);
del_val(&Ls, 4);
Show(&Ls);
Search(&Ls, 5);
}