顺序表------定长的顺序表

本文介绍了定长顺序表的概念,其有效长度固定且不可扩容。详细讲解了包括头插、按位置插、尾插、头删、按位置删、尾删、按值删等操作的代码实现,并提供了完整的C语言代码示例。此外,还包含了判空、判满、清除、查找和打印等辅助功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值