美妙的算法之顺序表

x33g5p2x  于2022-03-15 转载在 其他  
字(3.1k)|赞(0)|评价(0)|浏览(298)

一、顺序表是什么?

顾名思义:顺序表就是一张连续的地址用来存储数据

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址
连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元
素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之
间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。

二、顺序表的特点

凡事都会有两面性,数据结构算法也不例外

2.1 优点:

1. 查找速度快,因为内存空间是连续的,所以找某个结点只需要通过计算即可直接找到
2. 尾插、尾删效率较高,因为有定义数组有效长度

2.2 缺点:

1. 删除效率低,当删除某一个元素时,这个元素后的所有元素都需要前移一位,需要大量的循环操作
2. 当线性表长度变化较大时,难以确定存储空间的容量

三、顺序表的实现

3.1 定义结构体

#include <stdio.h>
#include <stdlib.h>
//常量值
#define MaxSize 50 
typedef int EleType;
//结构体
typedef struct {
	EleType data[MaxSize];//定义的数组,用来存元素
	int len;//当前顺序表中有多个个元素
}List;

3.2 顺序表插入元素算法实现

//插入元素
bool Insert(List& list, int pos, EleType ele) {
	//防止插入位置不合理,禁止插入元素
	if (pos <= 0 || pos > list.len + 1) {
		return false;
	}
	//若线性表的当前存储长度>=线性表的总长度 不当存储
	if (list.len >= MaxSize) {
		return false;
	}
	//数据偏移
	for (int i = list.len; i >=pos; i--){
		list.data[i] = list.data[i - 1];
	}
	list.data[pos - 1] = ele;
	list.len++;
	return true;
}

3.3 顺序表删除元素算法实现

//删除元素
bool Delete(List& list,int pos,EleType& ele) {
	//删除位置不合法
	if (pos<1 || pos>list.len) {
		return false;
	}
	//顺序表没有元素
	if (list.len==0) {
		return false;
	}
	//保存要删除位置的元素
	ele = list.data[pos - 1];
	//把删除位置后面的元素前移
	for (int i = pos; i <list.len;i++){
		list.data[i-1]=list.data[i];
	}
	list.len--;
	return true;
}

3.4 顺序表修改元素算法实现

//修改元素
void Update(List& list,int pos,int number){
	list.data[pos-1] = number;
}

3.5 顺序表查找元素算法实现

//查找元素
int Search(List list,int number) {
	for (int i = 0; i < list.len; i++){
		//匹配成功:返回查询元素的位置
		if (list.data[i]==number) {
			return i + 1;
		}
	}
	//匹配失败:返回-1
	return -1;
}

3.6 打印顺序表

//打印线性表
void print(List& list) {
	for (int i = 0; i < list.len; i++){
		printf("%3d", list.data[i]);//将每一个元素打印出来
	}
	printf("\n");
}

四 顺序表代码

所有的算法实现总归就是增删改查

#include <stdio.h>
#include <stdlib.h>
//常量值
#define MaxSize 50 
typedef int EleType;
//结构体
typedef struct {
	EleType data[MaxSize];//定义的数组,用来存元素
	int len;//当前顺序表中有多个个元素
}List;
//插入元素
bool Insert(List& list, int pos, EleType ele) {
	//防止插入位置不合理,禁止插入元素
	if (pos <= 0 || pos > list.len + 1) {
		return false;
	}
	//若线性表的当前存储长度>=线性表的总长度 不当存储
	if (list.len >= MaxSize) {
		return false;
	}
	//数据偏移
	for (int i = list.len; i >=pos; i--){
		list.data[i] = list.data[i - 1];
	}
	list.data[pos - 1] = ele;
	list.len++;
	return true;
}
//删除元素
bool Delete(List& list,int pos,EleType& ele) {
	//删除位置不合法
	if (pos<1 || pos>list.len) {
		return false;
	}
	//顺序表没有元素
	if (list.len==0) {
		return false;
	}
	//保存要删除位置的元素
	ele = list.data[pos - 1];
	//把删除位置后面的元素前移
	for (int i = pos; i <list.len;i++){
		list.data[i-1]=list.data[i];
	}
	list.len--;
	return true;
}
//修改元素
void Update(List& list,int pos,int number){
	list.data[pos-1] = number;
}
//查找元素
int Search(List list,int number) {
	for (int i = 0; i < list.len; i++){
		//匹配成功:返回查询元素的位置
		if (list.data[i]==number) {
			return i + 1;
		}
	}
	//匹配失败:返回-1
	return -1;
}
//打印线性表
void print(List& list) {
	for (int i = 0; i < list.len; i++){
		printf("%3d", list.data[i]);
	}
	printf("\n");
}
int main1() {
	List L;//定义要操作的顺序表
	bool falg;//查看返回值
	EleType ele;//用来存要删除的元素
	int pos;//查找元素返回元素的位置
	L.data[0] = 1;
	L.data[1] = 2;
	L.data[2] = 3;
	L.data[3] = 4;
	L.len = 4;
	//插入测试
	falg=Insert(L, 3, 10);
	print(L);
	if (falg) {
		printf("插入成功\n");
	}
	//删除测试
	Delete(L, 1, ele);
	printf("删除的元素是%d\n", ele);
	printf("删除后的线性表排序为");
	print(L);
	//查找测试
	pos=Search(L,100);
	printf("查找元素的位置为===>%d\n", pos);

	//修改测试
	Update(L, 3, 66);
	print(L);
	return 0;
}

总结

后面会慢慢更新其他算法内容,纯手写,欢迎大家留言。

相关文章