数据结构-静态线性表C++实现

学习目标:

  • 理解掌握线性表
  • 掌握静态线性表的增,删,改,查。

知识概念(百度百科给的定义)

定义

线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。
在稍复杂的线性表中,一个数据元素可由多个数据项(item)组成,此种情况下常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)。
线性表中的个数n定义为线性表的长度,n=0时称为空表。在非空表中每个数据元素都有一个确定的位置,如用ai表示数据元素,则i称为数据元素ai在线性表中的位序。
线性表的相邻元素之间存在着序偶关系。如用(a1,…,ai-1,ai,ai+1,…,an)表示一个顺序表,则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱 [1] 。

分类

我们说“线性”和“非线性”,只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表。
在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制。

优点

线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

代码实现(code-Cpp)

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MaxSize 10

typedef struct {
	int data[MaxSize];
	int length;
}SqList;

//初始化一个线性表
void InitList(SqList &L)
{
	for (int i = 0; i < MaxSize; i++)//将所有的元素都初始化为0,因为原本存储的都是脏数据。
		L.data[i] = 0;
	L.length = 0;//表长置为0,必做!
}

//插入一个元素,插入位置为第i位,插入值为e
int InsertElement(SqList &L, int i, int e)
{
	if (i<1 || i>L.length + 1)
		return 2;
	if (L.length >= MaxSize)
		return 2;
	for (int j = L.length; j > i; j--)
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
	return 1;
}

//删除线性表中第i位元素。
int DelElement(SqList& L, int i)
{
	if (i<1 || i>L.length + 1)
		return 4;
	if (L.length < 1)
	{
		cout << "此表已经为空" << endl;
		return 4;
	}
	int flag = L.data[i];
	//cout << "第" << i << "个元素" << L.data[i] << "已经删除." << endl;
	for (int j = i; j < L.length; j++)
	{
		L.data[j] = L.data[j + 1];
	}
	L.length--;
	return 3;
}

//修改第i位的值
int AlterElement(SqList& L, int i, int e)
{
	if (i<1 || i>L.length + 1)
		return 6;
	else
	{
		L.data[i - 1] = e;
		return 5;
	}
}

//查看第i位元素的值
int SearchElement(const SqList& L, int i)
{
	if (i<1 || i>L.length + 1)
		return 8;
	else
	{
		cout << "第" << i << "位元素为:" << L.data[i - 1] << endl;
		return 7;
	}
}

//操作执行结果
void IsOk(int ret)
{
	switch (ret)
	{
	case 1:
		cout << "插入成功!" << endl;
		break;
	case 2:
		cout << "插入失败!" << endl;
		break;
	case 3:
		cout << "删除成功!" << endl;
		break;
	case 4:
		cout << "删除失败!" << endl;
		break;
	case 5:
		cout << "修改成功!" << endl;
		break;
	case 6:
		cout << "修改失败!" << endl;
		break;
	case 7:
		cout << "查看成功!" << endl;
		break;
	case 8:
		cout << "查看失败!" << endl;
		break;
	default:
		cout << "不支持的操作类型!" << endl;
		break;
	}
}

//查看目前表的状态。
void ListStatus(const SqList L)
{
	cout << "目前线性表的长度为:" << L.length << endl;
	if (L.length > 0)
		cout << "线性表的首元素为:" << L.data[0] << endl;
	else
		cout << "线性表未添加元素!" << endl;
}

int main()
{
	int ret;
	SqList L1;
	InitList(L1);
	ret = InsertElement(L1, 1, 3);
	IsOk(ret);
	ListStatus(L1);
	ret = InsertElement(L1, 3, 2);
	IsOk(ret);
	ListStatus(L1);
	ret = InsertElement(L1, 2, 2);
	IsOk(ret);
	ListStatus(L1);
	cout << "下面进行删除操作!" << endl;
	ret = DelElement(L1, 1);
	IsOk(ret);
	ListStatus(L1);
	cout << "下面为查看操作!" << endl;
	ret = SearchElement(L1, 1);
	IsOk(ret);
	ListStatus(L1);
	cout << "下面为修改操作!" << endl;
	ret = AlterElement(L1, 1, 9);
	IsOk(ret);
	ListStatus(L1);
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

味堡o_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值