首页 > 其他分享 >10.顺序表

10.顺序表

时间:2023-06-13 13:22:25浏览次数:34  
标签:10 顺序 return int elems length SqList

1.顺序表的定义

  • 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
  • 顺序表:可动态增长的数组,要求数据是连续存储的
typedef struct _SqList SqList;

struct _SqList
{
	int* elems;//顺序表的基地址
	int length;//顺序表的长度
	int size;//顺序表总的空间大小
};
typedef struct
{
	int* elems;//顺序表的基地址
	int length;//顺序表的长度
	int size;//顺序表总的空间大小
}SqList;

2.顺序表的初始化

bool initList(SqList& L)//构造一个空的顺序表L
{
	L.elems = new int[MAX_SIZE];//为顺序表分配MAX_SIZE个int元素的空间
	if (!L.elems) return false;

	L.length = 0;
	L.size = MAX_SIZE;
	return true;
}

3.顺序表的打印

void listPrint(SqList& L)
{
	cout << "顺序表的存储空间size:" << L.size << ",已保存的元素个数length:" << L.length << endl;
	for (int i = 0; i <= L.length - 1; i++)
	{
		cout << L.elems[i] << " ";
	}
	cout << endl;
}

4.表尾添加元素

bool listAppend(SqList& L, int e)
{
	if (L.length == L.size)  return false;//存储空间已满

	L.elems[L.length] = e;
	L.length++;//表长增加1
	return true;
}
//2.添加元素
int count = 0;
cout << "请输入要添加的元素个数:" << endl;
cin >> count;

for (int i = 0; i < count; i++)
{
    cout << "\n请输入要添加的元素e:";
    cin >> e;
    if (listAppend(list, e))
    {
        cout << "添加成功!" << endl;
    }
    else
    {
        cout << "添加失败!" << endl;
    }
}
listPrint(list);

5.表中任意位置插入元素

bool listInsert(SqList &L, int i, int e)
{
	if (i < 0 || i >= L.length) return false;//i值不合法
	if (L.length == L.size) return false;//存储空间已满

	for (int j = L.length - 1; j >= i; j--)
	{
		L.elems[j + 1] = L.elems[j];//从最后一个元素开始后移,直到下标为i的元素后移
	}

	L.elems[i] = e;//将新元素e放入第i的位置
	L.length++;//表长加1

	return true;
}
//3.插入元素
cout << "请输入要插入元素的个数,(先输入插入位置,后输入元素个数):" << endl;
cin >> i >> e;

if (listInsert(list, i, e))
{
    cout << "插入成功!" << endl;
}
else
{
    cout << "插入失败!" << endl;
}
listPrint(list);

6.表中任意位置删除元素

bool listDelete(SqList& L, int i)
{
	if (i < 0 || i >= L.length) return false;//删除位置无效

	if (i == L.length - 1)//删除最后一个元素
	{
		L.length--;
		return true; 
	}

	for (int j = i; j < L.length - 1; j++)
	{
		L.elems[j] = L.elems[j + 1];//删除位置的后续元素依次往前移
	}
	L.length--;
	return true;
}
//4.删除元素
cout << "请输入要删除元素的位置:";
cin >> i;
if (listDelete(list, i))
{
    cout << "删除成功!" << endl;
}
else
{
    cout << "删除失败!" << endl;
}
listPrint(list);

7.链表销毁

void destroyList(SqList& L)
{
	if (L.elems) delete[]L.elems;//释放存储空间
	L.length = 0;
	L.size = 0;
}

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;

#define MAX_SIZE 100

//typedef struct _SqList SqList;
//
//struct _SqList
//{
//	int* elems;//顺序表的基地址
//	int length;//顺序表的长度
//	int size;//顺序表总的空间大小
//};

typedef struct
{
	int* elems;//顺序表的基地址
	int length;//顺序表的长度
	int size;//顺序表总的空间大小
}SqList;

bool initList(SqList& L)//构造一个空的顺序表L
{
	L.elems = new int[MAX_SIZE];//为顺序表分配MAX_SIZE个int元素的空间
	if (!L.elems) return false;

	L.length = 0;
	L.size = MAX_SIZE;
	return true;
}

void listPrint(SqList& L)
{
	cout << "顺序表的存储空间size:" << L.size << ",已保存的元素个数length:" << L.length << endl;
	for (int i = 0; i <= L.length - 1; i++)
	{
		cout << L.elems[i] << " ";
	}
	cout << endl;
}

bool listAppend(SqList& L, int e)
{
	if (L.length == L.size)  return false;//存储空间已满

	L.elems[L.length] = e;
	L.length++;//表长增加1
	return true;
}

bool listInsert(SqList &L, int i, int e)
{
	if (i < 0 || i >= L.length) return false;//i值不合法
	if (L.length == L.size) return false;//存储空间已满

	for (int j = L.length - 1; j >= i; j--)
	{
		L.elems[j + 1] = L.elems[j];//从最后一个元素开始后移,直到下标为i的元素后移
	}

	L.elems[i] = e;//将新元素e放入第i的位置
	L.length++;//表长加1

	return true;
}

bool listDelete(SqList& L, int i)
{
	if (i < 0 || i >= L.length) return false;//删除位置无效

	if (i == L.length - 1)//删除最后一个元素
	{
		L.length--;
		return true; 
	}

	for (int j = i; j < L.length - 1; j++)
	{
		L.elems[j] = L.elems[j + 1];//删除位置的后续元素依次往前移
	}
	L.length--;
	return true;
}

void destroyList(SqList& L)
{
	if (L.elems) delete[]L.elems;//释放存储空间
	L.length = 0;
	L.size = 0;
}

int main()
{
	SqList list;
	int i, e;
	cout << "顺序表的初始化:" << endl;
	//1.初始化
	if (initList(list))
	{
		cout << "顺序表初始化成功!" << endl;
	}

	listPrint(list);

	//2.添加元素
	int count = 0;
	cout << "请输入要添加的元素个数:" << endl;
	cin >> count;

	for (int i = 0; i < count; i++)
	{
		cout << "\n请输入要添加的元素:";
		cin >> e;
		if (listAppend(list, e))
		{
			cout << "添加成功!" << endl;
		}
		else
		{
			cout << "添加失败!" << endl;
		}
	}
	listPrint(list);

	//3.插入元素
	cout << "请输入要插入元素的个数,(先输入插入位置,后输入所插入的元素):" << endl;
	cin >> i >> e;

	if (listInsert(list, i, e))
	{
		cout << "插入成功!" << endl;
	}
	else
	{
		cout << "插入失败!" << endl;
	}
	listPrint(list);

	//4.删除元素
	cout << "请输入要删除元素的位置:";
	cin >> i;
	if (listDelete(list, i))
	{
		cout << "删除成功!" << endl;
	}
	else
	{
		cout << "删除失败!" << endl;
	}
	listPrint(list);

	//5.销毁链表
	destroyList(list);

	system("pause");
	return EXIT_SUCCESS;
}

参考资料来源:

奇牛学院

标签:10,顺序,return,int,elems,length,SqList
From: https://www.cnblogs.com/codemagiciant/p/17477254.html

相关文章

  • NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低
    NETSDK1045当前.NETSDK不支持将.NET6.0设置为目标。请将.NET5.0或更低https://blog.csdn.net/qq_43680827/article/details/123309449vs2019解决NETSDK1045错误一、平台描述二、问题描述三、问题原因四、解决办法一、平台描述系统:Windows10VS:Visual......
  • NET CORE Configuraion 使用详解 获取配置文件参数 读取环境变量、读取配置文件、读取
    NETCOREConfiguraion使用详解获取配置文件参数读取环境变量、读取配置文件、读取Ini配置、读取Xml配置、多源配置读取顺序分析https://blog.csdn.net/qq_32109957/article/details/127998326相关配置<ProjectSdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Ex......
  • C/C++学习(10)关于数组、内联函数、虚函数的错题集锦
    1、顺序存储方式不仅用于存储线性结构,还可以用于存放非线性结构,如完全二叉树是属于非线性结构,但其最佳存储方式是顺序存储方式。 2、数组名有两重属性:1)数据结构的一个对象(数据结构为当前数组),在java中数组就是一个对象。2)某些情况下自动退化成指向第一个元素的常量指针。 3、有两......
  • YOKOGAWA CP451-10
    W;① ⑧ 0 ③0 ① 7 7 ⑦ 5 ⑨YOKOGAWAYNT511DYOKOGAWA PW501YOKOGAWA AIP578 YOKOGAWA AIP171从IntelAtom四核1.9GHz到IntelCeleron2GHz的不同CPU版本可实现应用程序优化的计算能力,因此可视化、图像处理、PLC、运动、机器人和CNC可以在单......
  • 顺序分支循环结构
    一、流程控制理论 #控制实物执行的流程 执行流程分类:顺序结构、分支结构、循环结构 二、必知必会在python中使用缩进就是表示从属关系(如果一行代码是冒号结尾,下一行自动缩进,为了美观通常缩进四个空格,冒号相当于拥有子代码)具有相同缩进量的代码彼此之间是顺序结构,无从......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分4)
    AXI-DMA使用介绍内容概述如何在Zynq平台上使用AXI-DMA进行PS和PL之间的高带宽数据传输。主要包括以下几个部分:AXI-DMA的简介和模式选择AXI-DMA的寄存器配置和编程顺序Vivado工程的创建和IP核的添加Vitis工程的创建和示例代码的运行ILA信号的抓取和分析AXI-DMA的简介......
  • 调整数组顺序使奇数位于偶数前面
    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例:输入:nums= [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4]也是正确的答案之一。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-s......
  • Apikit SaaS 10.9.0 版本更新:空间主页上线,应用模块合并!
    Hi,大家好!EolinkApikitSaaS更新10.9.0版本,本次版本更新主要是对多个应用级资源合并,并基于此简化付费套餐和降低费率。本次应用合并是为了接下来更好的发挥EolinkApikit的优势,提供API全生命周期解决方案,为下半年的重大功能更新做前期准备。本次更新的详细内容如下。1、重大......
  • win10系统开启同时多用户远程连接桌面,支持22H2,版本10.0.19041.2075
    1.打开远程桌面控制并开启多用户连接1)win+r打开运行窗口,输入gpedit.msc,进入“本地组策略编辑器”2)按以下步骤找到远程桌面会话主机:计算机配置-->管理模板-->Windows组件-->远程桌面服务-->远程桌面会话主机-->连接 3)编辑远程桌面会话主机连接 3.1)双击“允许用户通......
  • 经验分享 - 我是如何拿到硅谷顶级科技公司的 10 个 offer ?
    代我太太发文:经过3个月精心准备,我拿到了Google,Facebook,Netflix,linkedin,Snapchat,RokuTV,Amazon,Signal,Wealthfront,ToyotaResearchInstitute一共10个硅谷公司的offer。airbnb结果还没出,uber,dropbox面试体验不好,最后onsite直接withdraw。SoundhoundintuitHR自己说......