顺序表的实现

21 篇文章 0 订阅

顺序表的原理

顺序表是简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空值,插入、删除时需要移动大量元素

顺序表的三要素

1.用 elems 记录存储位置的基地址
2.分配一段连续的存储空间 size
3.用 length 记录实际的元素个数,即顺序表的长度
在这里插入图片描述

结构体定义

结构体定义
#define MAX_SIZE 100
struct _SqList{
ElemType *elems; // 顺序表的基地址
int length; // 顺序表的长度
int size; // 顺序表总的空间大小
}

顺序表的实现

顺序表的初始化

在这里插入图片描述

typedef struct {  //定义顺序表
	int* elems;	  //数组的第0个元素
	int length;
	int size;
}Sqlist;

bool initList(Sqlist& L) {	//初始化顺序表
	L.elems = new int[MAX_SIZE];
	if (!L.elems) {
		cout << "内存分配失败!" << endl;
		return false;
	}
	else if (L.elems) {
		cout << "初始化成功!" << endl;
		L.length = 0;
		L.size = MAX_SIZE;
		for (int i = 0; i <= MAX_SIZE - 1; i++) {
			L.elems[i] = NULL;
		}
		return true;
	}
	cout << "未知错误!!" << endl;
	return false;
}

顺序表的输出

void print(Sqlist& L) {		//输出顺序里面的数据
	int j = 0;
	for (int i = 0; i < L.length; i++) {
		cout << L.elems[i] << " ";

		j++;
		if (j == 10) {
			cout << endl;
			j = 0;
		}

	}
	cout << endl;
}

从尾部添加数据

在这里插入图片描述

bool Add(Sqlist& L, int e) {	//从尾部添加数据
	if (L.length == L.size || L.length > L.size) {
		cout << "内存已满!!" << endl;
		return false;
	}
	else if (L.length != L.size) {
		L.elems[L.length] = e;
		L.length++;
		return true;
	}
	cout << "未知错误!!" << endl;
	return false;
}

bool input_tail(Sqlist& L) {		//从尾部输入数据
	int e = NULL;
	int count = NULL;
	cout << "你要输入几个数据:";
	cin >> count;
	for (int i = 0; i < count; i++) {
		cout << "请输入第" << i + 1 << "个元素:";
		cin >> e;
		if (Add(L, e)) {
			e = NULL;
			cout << "输入成功!!" << endl;
		}
		else {
			cout << "输入失败!!" << endl;
			return false;
		}
	}
}

任意位置插入数据

在这里插入图片描述

bool input_random(Sqlist& L, int a, int b) {// a插入位置 b 插入数据
	if (L.length == L.size || L.length > L.size) {	//检查是否还有内存
		return false;
	}
	if (a<0 || a > L.length) { //插入位置合法性判断
		return false;
	}

	for (int i = L.length - 1; i >= a; i--) {
		/*
		//i是最后一个元素插入位置的
		//a必须小于最后一个元素i
		*/
		L.elems[i + 1] = L.elems[i];
	}
	L.elems[a] = b;
	L.length++;
	return true;
}

bool input(Sqlist& L) {		//插入数据
	int count = NULL;
	int e = NULL;
	int f = NULL;
	cout << "请输入需要插入元素的个数:";
	cin >> count;

	for (int i = 0; i < count; i++) {
		cout << "请输入插入位置以及插入数据,空格分开:";
		cin >> f >> e;
		if (input_random(L, f, e)) {
			cout << "插入成功!" << endl;
			e = NULL;
			f = NULL;
		}
		else {
			cout << "插入失败!" << endl;
			return false;
		}
	}
}

删除元素

在这里插入图片描述

bool Delete(Sqlist& L, int n) {	//删除顺序表中的元素
	if (L.length == L.size) { return false; }
	if (n<0 || n>L.length) { return false; }

	if (n == L.length - 1) {
		L.length--;
		return true;
	}
	for (int i = n; i < L.length - 1; i++) {	//被删除元素之后的元素前移
		/*
		//L.elems[i + 1]是被删除目标元素的后一个元素
		//把这个元素前移一位就覆盖掉原来的数据,而实现删除
		*/
		L.elems[i] = L.elems[i + 1];
	}
	L.length--;
	return true;
}

bool Remove(Sqlist& L) {
	int count = NULL;
	int e = NULL;

	cout << "请输入需要删除元素的个数:";
	cin >> count;

	for (int i = 0; i < count; i++) {
		cout << "请输入需要删除元素的下标:";
		cin >> e;
		if (Delete(L, e)) {
			cout << "删除成功!!" << endl;
		}
		else {
			cout << "删除失败!!" << endl;
			return false;
		}
	}
	return true;
}

查询数据

bool inquire(Sqlist& L, int n) {	//查询数据
	if (L.length == L.size || L.length > L.size || L.length == 0) { return false; }

	for (int i = 0; i < L.length; i++) {
		if (L.elems[i] == n) {
			return true;
		}
	}
	return false;
}

void inquire(Sqlist& L) {
	int tmp = 0;
	cout << "请输入需要查询的元素:";
	cin >> tmp;
	if (inquire(L, tmp)) {
		cout << "查询的:" << tmp << "存在!" << endl;
	}
	else {
		cout << "查询失败!" << endl;
	}
}

内存回收

void Empty(Sqlist& L) {
	if (L.elems) {
		delete[]L.elems;
		L.length = NULL;
		L.size = NULL;
		cout << "内存回收成功!!" << endl;
	}
}

完整代码

#include <iostream>
#include <Windows.h>

#define MAX_SIZE 100	//顺序可存入的最多个元素

using namespace std;

typedef struct {  //定义顺序表
	int* elems;	  //数组的第0个元素
	int length;
	int size;
}Sqlist;

bool initList(Sqlist& L) {	//初始化顺序表
	L.elems = new int[MAX_SIZE];
	if (!L.elems) {
		cout << "内存分配失败!" << endl;
		return false;
	}
	else if (L.elems) {
		cout << "初始化成功!" << endl;
		L.length = 0;
		L.size = MAX_SIZE;
		for (int i = 0; i <= MAX_SIZE - 1; i++) {
			L.elems[i] = NULL;
		}
		return true;
	}
	cout << "未知错误!!" << endl;
	return false;
}

void print(Sqlist& L) {		//输出顺序里面的数据
	int j = 0;
	for (int i = 0; i < L.length; i++) {
		cout << L.elems[i] << " ";

		j++;
		if (j == 10) {
			cout << endl;
			j = 0;
		}

	}
	cout << endl;
}

bool Add(Sqlist& L, int e) {	//从尾部添加数据
	if (L.length == L.size || L.length > L.size) {
		cout << "内存已满!!" << endl;
		return false;
	}
	else if (L.length != L.size) {
		L.elems[L.length] = e;
		L.length++;
		return true;
	}
	cout << "未知错误!!" << endl;
	return false;
}

bool input_random(Sqlist& L, int a, int b) {// a插入位置 b 插入数据
	if (L.length == L.size || L.length > L.size) {	//检查是否还有内存
		return false;
	}
	if (a<0 || a > L.length) { //插入位置合法性判断
		return false;
	}

	for (int i = L.length - 1; i >= a; i--) {
		/*
		//i是最后一个元素插入位置的
		//a必须小于最后一个元素i
		*/
		L.elems[i + 1] = L.elems[i];
	}
	L.elems[a] = b;
	L.length++;
	return true;
}

bool input(Sqlist& L) {		//插入数据
	int count = NULL;
	int e = NULL;
	int f = NULL;
	cout << "请输入需要插入元素的个数:";
	cin >> count;

	for (int i = 0; i < count; i++) {
		cout << "请输入插入位置以及插入数据,空格分开:";
		cin >> f >> e;
		if (input_random(L, f, e)) {
			cout << "插入成功!" << endl;
			e = NULL;
			f = NULL;
		}
		else {
			cout << "插入失败!" << endl;
			return false;
		}
	}
}

bool input_tail(Sqlist& L) {		//从尾部输入数据
	int e = NULL;
	int count = NULL;
	cout << "你要输入几个数据:";
	cin >> count;
	for (int i = 0; i < count; i++) {
		cout << "请输入第" << i + 1 << "个元素:";
		cin >> e;
		if (Add(L, e)) {
			e = NULL;
			cout << "输入成功!!" << endl;
		}
		else {
			cout << "输入失败!!" << endl;
			return false;
		}
	}
}

bool Delete(Sqlist& L, int n) {	//删除顺序表中的元素
	if (L.length == L.size) { return false; }
	if (n<0 || n>L.length) { return false; }

	if (n == L.length - 1) {
		L.length--;
		return true;
	}
	for (int i = n; i < L.length - 1; i++) {	//被删除元素之后的元素前移
		/*
		//L.elems[i + 1]是被删除目标元素的后一个元素
		//把这个元素前移一位就覆盖掉原来的数据,而实现删除
		*/
		L.elems[i] = L.elems[i + 1];
	}
	L.length--;
	return true;
}

bool inquire(Sqlist& L, int n) {	//查询数据
	if (L.length == L.size || L.length > L.size || L.length == 0) { return false; }

	for (int i = 0; i < L.length; i++) {
		if (L.elems[i] == n) {
			return true;
		}
	}
	return false;
}

void inquire(Sqlist& L) {
	int tmp = 0;
	cout << "请输入需要查询的元素:";
	cin >> tmp;
	if (inquire(L, tmp)) {
		cout << "查询的:" << tmp << "存在!" << endl;
	}
	else {
		cout << "查询失败!" << endl;
	}
}

bool Remove(Sqlist& L) {
	int count = NULL;
	int e = NULL;

	cout << "请输入需要删除元素的个数:";
	cin >> count;

	for (int i = 0; i < count; i++) {
		cout << "请输入需要删除元素的下标:";
		cin >> e;
		if (Delete(L, e)) {
			cout << "删除成功!!" << endl;
		}
		else {
			cout << "删除失败!!" << endl;
			return false;
		}
	}
	return true;
}

void Empty(Sqlist& L) {
	if (L.elems) {
		delete[]L.elems;
		L.length = NULL;
		L.size = NULL;
		cout << "内存回收成功!!" << endl;
	}
}

int main(void) {
	Sqlist s1;					//定义顺序表

	initList(s1);				//初始化顺序表

	bool q = input_tail(s1);		//从尾部插入数据
	print(s1);

	bool w = input(s1);			//任意位置插入数据
	print(s1);					//输出顺序表中的数据

	inquire(s1);				//查询顺序表中的数据

	bool e = Remove(s1);		//删除顺序表中的数据
	print(s1);

	Empty(s1);					//回收顺序表的内存

	return NULL;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值