线性表的顺序存储原理及实现

线性表

定义:由n个相同类型的元素组成的有序集合。
特点:1.表中元素的个数是有限的。2.表中元素的数据类型都相同,意味着每一个元素占用相同大小的空间。3.表中元素具有逻辑上的顺序,在序列中各元素排序有其先后顺序。
注意:线性表是一种逻辑结构,表示元素一对一的相邻关系。顺序结构和链表是存储结构。
顺序表: 逻辑上相邻的两个元素在物理位置上也相邻。
优点:1.可以随机存储(根据表头元素地址和元素序号)表中任意一个元素。2.存储密度高,每个结点只存储数据元素。
缺点:1.插入和删除操作需要移动大量元素。2.线性表变化较大时,难以确定存储空间的容量。3.存储分配需要一整段连续的存储空间,不够灵活。
实现:1.定义结构体,包括数组、长度。2.增删改查,在进行操作时,先检查是否合法(标记位置和顺序表是否满了),然后移动元素,最后顺序表长度发生变化。

//顺序表实现
#include<stdio.h>

typedef int ElemType;
typedef struct {
	ElemType data[50];
	int len;
}SqList;//声明结构体类型
void PrintList(SqList L) {
	//打印链表
	for (int j = 0; j < L.len; j++) {
		printf("%d ", L.data[j]);
	}
}
bool ListInsert(SqList& L, int i, ElemType e) {
	//1.判断插入位置是否合法,顺序表是否满了
	if (i<1 || i>L.len + 1) {
		return false;
	}
	if (L.len >= 50) {
		return false;
	}
	//2.从第i个位置开始向后移动元素
	for (int j = L.len; j >= i; j--) {
		L.data[j] = L.data[j - 1];
	}
	//插入元素
	L.data[i - 1] = e;
	//3.顺序表长度增加
	L.len++;
	return true;
}
bool ListDelete(SqList& L, int i, ElemType& e) {
	//1.判断删除位置是否合法,顺序表是否为空
	if (i<1 || i>L.len) {
		return false;
	}
	if (L.len <= 0) {
		return false;
	}
	//2.从第i个位置开始向前移动元素
	for (int j = i; j < L.len; j++) {
		L.data[j - 1] = L.data[j];
	}
	//要删除元素
	e = L.data[i - 1];
	// 3.顺序表长度减少
	L.len--;
	return true;
}
bool QueryList(SqList& L, ElemType i, ElemType& x) {
	//1.判断查顺序表是否为空
	if (L.len <= 0) {
		return false;
	}
	//2.开始查询
	for (int j = 0; j < L.len; j++) {
		if (i == L.data[j]) {
			x = j + 1;
		}
	}
	return true;
}

int main() {
	SqList L;//创建一个结构体
	//在顺序表中添加数据
	L.data[0] = 4;
	L.data[1] = 5;
	L.data[2] = 6;
	L.len = 3;
	//增
	ListInsert(L, 2, 60);
	//删
	ElemType del;
	ListDelete(L, 2, del);
	//查
	ElemType pos;//查询元素位置
	bool ret;
	ret = QueryList(L, 5, pos);
	if (ret) {
		printf("查询成功,位置为 %d\n", pos);
	}
	else {
		printf("查询失败\n");
	}
	//打印顺序表
	PrintList(L);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值