顺序表的静态实现

编译器———VS2019

#include "head.h"
#pragma once
#define _CRT_SECURE_NO_WARNINGS//防止scanf会报警

//*************************顺序表的实现---静态分配*******************************

//*************************相关头文件的声明*************************************
#include <stdio.h>
//*************************相关常、变量的定义、初始化*****************************
#define MAXSIZE 6//定义顺表的最大长度
int i = 0;//操作位序
int e = -1;//定义操作元素e的值为-1
int result = 0;//顺序表操作实现后的结果
int operation = 0;//定义相关操作数,便于顺序表的操作

//*************************函数结果状态代码*************************
//C++写的,我只用到了true和false

typedef int Status;//Status是函数返回值类型,其值是函数结果状态代码
typedef int ElemType;//数据元素约定为ElemType,用户在使用该数据类型时自行定义,此处定义为int

//顺序表结构的定义
typedef struct sequencelist
{
	ElemType data[MAXSIZE];//用静态的数组存放数据元素
	int length;//顺序表的当前长度
}SequenceList;//顺序表的类型定义(静态分配方式)

//顺序表相关操作的声明
void Menu();//菜单栏的展示

void InitList(SequenceList* L);//基本操作---初始化一个顺序表

Status ListInsert(SequenceList* L, int i, int e);//基本操作---向表中添加元素

Status ListDeleteOne(SequenceList* L, int i, int& e);//基本操作---删除表中第i个位置的元素

Status ListDeleteTwo(SequenceList& L, int &i, int e);//按照位序删除

Status UpdateElemOne(SequenceList& L, int i, int e);//按照位序更改

Status UpdateElemTwo(SequenceList& L, int i, int e);//按照元素值更改

Status LocateElem(SequenceList& L, int& i, int e);//定位元素的位序

Status GetElem(SequenceList& L, int i, int& e);//按照位序取元素值

Status ListLength(SequenceList& L);//获取顺序表的长度

void TraverseList(SequenceList& L);//顺序表的遍历

void ClearList(SequenceList& L);//顺序表的清空
#include "function.h"
#pragma once
//菜单栏
void Menu()
{
	printf("****************************************************************************\n");
	printf("	1.增		2.删		3.改		4.查\n\n	5.获长		6.遍历		7.置空		8.退出\n");
	printf("****************************************************************************\n");
}


//顺序表相关操作的定义
void  InitList(SequenceList* L)//基本操作---初始化一个顺序表
{
	for (int i = 0; i < MAXSIZE; i++)
	{
		L->data[i] = 0;//将所有数据元素设置为默认初始值,倘若没有设置数据元素的默认值,内存中会有遗留的“脏数据”
	}
	L->length = 0;//顺序表初始化长度为0
}

Status ListInsert(SequenceList* L, int i, int e)//基本操作---顺序表的插入操作,在L的位序i处插入元素e
{
	if (i<1 || i>L->length + 1)//判断i的范围是否有效
	{
		printf("\n当前插入位序不合理,插入无效!\n");
		return false;
	}

	if (L->length >= MAXSIZE)//当前存储空间已满,不能插入
	{
		printf("\n当前存储空间已满,不能插入!\n");
		return false;
	}
	for (int j = L->length; j >= i; j--)//将第i个元素及之后的元素后移
	{
		L->data[j] = L->data[j - 1];//注意位序、数组下标的关系,并从后面的元素依次移动
	}
	L->data[i - 1] = e;//在位置i处放入e
	L->length++;//长度加1
	return true;
}

Status ListDeleteOne(SequenceList* L, int i, int& e)//基本操作---删除表中第i个位置的元素
{
	if (i<1 || i>L->length)//判断i的范围是否有效
	{
		printf("\n当前待删位序不合理,删除无效!\n");
		return false;
	}
	e = L->data[i - 1];//将被删除的元素赋值给e
	for (int j = i; j < L->length; j++)//将第i个位置后的元素前移
	{
		L->data[j - 1] = L->data[j];
	}
	L->length--;//线性表表长减1
	return true;
}

Status ListDeleteTwo(SequenceList& L, int &i, int e)//按元素值删除
{
	for (int j = 0; j < L.length; j++)
	{
		if (L.data[j] == e)
		{
			i = j + 1;//数组下标为j的元素值等于e,其位序i+1
			for (int k = i; k < L.length; k++)//将第i个位置后的元素前移
			{
				L.data[k - 1] = L.data[k];
			}
			L.length--;//线性表表长减1
			return true;
		}
	}
	printf("\n该元素不存在!\n");
	return false;
}

Status UpdateElemOne(SequenceList& L, int i, int e)//按下标改
{
	if (i<1 || i>L.length)//判断i的范围是否有效
	{
		printf("\n当前更改位序不合理,更改无效!\n");
		return false;
	}
	L.data[i - 1] = e;
	return true;
}

Status UpdateElemTwo(SequenceList& L, int i, int e)//按元素改
{
	int new_e = 0;
	for (int j = 0; j < L.length; j++)
	{
		if (L.data[j] == e)
		{
			printf("\n请输入更改后的元素值————"); scanf("%d", &new_e);
			L.data[j] = new_e;
			return true;
		}
	}
	printf("\n该元素值不存在!\n");
	return false;
}

Status LocateElem(SequenceList& L, int& i, int e)
{
	for (int j = 0; j < L.length; j++)
	{
		if (L.data[j] == e)
		{
			i = j + 1;//数组下标为j的元素值等于e,返回其位序i+1
			return true;
		}
	}
	return false;//退出循环,说明查找失败
}

Status GetElem(SequenceList& L, int i, int& e)
{
	if (i<1 || i>L.length)//判断i的范围是否有效
	{
		printf("\n当前查找位序不合理,查找无效!\n\n");
		return false;
	}
	else
	{
		e = L.data[i - 1];
		return true;
	}
}


Status ListLength(SequenceList& L)
{
	return L.length;
}



void TraverseList(SequenceList& L)
{
	if (L.length)
	{
		for (int i = 0; i < L.length; i++)
		{
			printf("%d	", L.data[i]);
		}
		printf("\n\n");
	}
	else
	{
		printf("\n空表!\n");
	}
}


void ClearList(SequenceList& L)
{
	if (L.length)
	{
		for (int i = 0; i < MAXSIZE; i++)
		{
			L.data[i] = 0;
		}
		L.length = 0;
		printf("\n\n成功置空\n\n");
	}
	else
	{
		printf("\n当前顺序表已是置空状态,无需置空!\n");
	}
}
C++.cpp
#include "head.h"
#include "function.h"
//主函数的入口
int main()
{
	Menu();//菜单栏的输出
	SequenceList L;//声明一个顺序表,在内存中分配存储顺序表L的空间,包括MAXSIZE*sizeof(ElemType)和存储length的空间

	InitList(&L);//初始化顺序表

	while (true)
	{
		printf("请选择相关操作数————"); scanf("%d", &operation);
		switch (operation)
		{
		case 1:
			printf("\n\n********************###您当前正在进行顺序表的插入操作###********************\n");
			printf("请输入待插入的位序————"); scanf("%d", &i);
			printf("\n");
			printf("请输入待插入的元素————"); scanf("%d", &e);
			result = ListInsert(&L, i, e);
			if (result)
			{
				printf("\n插入成功!\n\n");
			}
			else
			{
				printf("\n插入失败!\n\n");
			}
			break;

		case 2:
			printf("\n********************###您当前正在进行顺序表的删除操作###********************\n");
			printf("\n*************************************\n");
			printf("\n1.按位序进行删除\n\n2.按给定的元素值进行删除\n\n3.退出删除操作\n");
			printf("\n\n*************************************\n");
			while (true)
			{
				printf("请选择相关操作数(当前处于删除状态)————"); scanf("%d", &operation);
				if (operation == 1)
				{
					printf("\n**********###按位序进行删除###**********\n");
					printf("请输入待删位序————"); scanf("%d", &i);
					result = ListDeleteOne(&L, i, e);
					if (result)
					{
						printf("\n删除成功,该位序所对应的元素为%d\n\n",e);
					}
					else
					{
						printf("\n删除失败!\n\n");
					}
				}
				else if (operation == 2)
				{
					printf("\n**********###按元素值进行删除###**********\n\n");
					printf("请输入待删元素值————"); scanf("%d", &e);
					result = ListDeleteTwo(L, i, e);
					if (result)
					{
						printf("\n删除成功,待删元素所对应的位序为%d\n\n",i);
					}
					else
					{
						printf("\n删除失败!\n\n");
					}
				}
				else if (operation == 3)
				{
					printf("\n成功退出顺序表的删除操作!\n\n");
					break;
				}
				else
				{
					printf("\n当前所输入的操作数无效,请按照指定的操作数进行输入!\n\n");
				}
			}
			break;
		case 3:
			printf("\n******************###您当前正在进行顺序表的更改操作###******************\n");
			printf("\n*************************************\n");
			printf("\n1.按位序进行更改\n\n2.按给定的元素值进行更改\n\n3.退出更改操作\n");
			printf("\n*************************************\n");
			while (true)
			{
				printf("请选择相关操作数(当前处于更改状态)————"); scanf("%d", &operation);
				if (operation == 1)
				{
					printf("\n**********###按位序进行更改###**********\n");
					printf("请输入待改位序————"); scanf("%d", &i);
					printf("请输入更新后的数值————"); scanf("%d", &e);
					result = UpdateElemOne(L, i, e);
					if (result)
					{
						printf("\n更改成功!\n\n");
					}
					else
					{
						printf("\n更改失败!\n\n");
					}
				}
				else if (operation == 2)
				{
					printf("请输入待改元素值————"); scanf("%d", &e);
					result = UpdateElemTwo(L, i, e);
					if (result)
					{
						printf("\n更改成功\n\n");
					}
					else
					{
						printf("\n更改失败!\n\n");
					}
				}
				else if (operation == 3)
				{
					printf("\n成功退出顺序表的更新操作!\n\n");
					break;
				}
				else
				{
					printf("\n当前所输入的操作数无效,请按照指定的操作数进行输入!\n");
				}
			}
			break;
		case 4:
			printf("\n******************###您当前正在进行顺序表的查找操作###******************\n");
			printf("\n*************************************\n");
			printf("\n1.按位序进行查找\n\n2.按给定的元素值进行查找\n\n3.退出查找操作\n");
			printf("\n*************************************\n");
			while (true)
			{
				printf("请选择相关操作数(当前处于查找状态)————"); scanf("%d", &operation);
				if (operation == 1)
				{
					printf("\n**********###按位序进行查找###**********\n");
					printf("\n请输入待查位序————"); scanf("%d", &i);
					result = GetElem(L, i, e);
					if (result)
					{
						printf("\n查找成功,该位序所对应的元素值为%d\n\n", e);
					}
					else
					{
						printf("\n查找失败!\n\n");
					}
				}
				else if (operation == 2)
				{
					printf("请输入待查元素值————"); scanf("%d", &e);
					result = LocateElem(L, i, e);
					if (result)
					{
						printf("\n查找成功,该元素所对应的位序为%d\n\n", i);
					}
					else
					{
						printf("\n查找失败!\n\n");
					}
				}
				else if (operation == 3)
				{
					printf("\n成功退出顺序表的查找操作!\n\n");
					break;
				}
				else
				{
					printf("\n当前所输入的操作数无效,请按照指定的操作数进行输入!\n\n");
				}
			}
			break;
		case 5:
			printf("\n******************###您当前正在进行顺序表的获长操作###******************\n");
			result = ListLength(L);
			printf("当前顺序表的长度为————%d\n\n", result);
			break;

		case 6:
			printf("\n******************###您当前正在进行顺序表的遍历操作###******************\n");
			TraverseList(L);
			break;

		case 7:
			printf("\n******************###您当前正在进行顺序表的置空操作###******************\n");
			ClearList(L);
			break;
		case 8:
			printf("\n成功退出程序!\n");
			return 0;
		default:
			printf("当前所输入的操作数无效,请按照指定的操作数进行输入!\n\n");
		}		
	}
}

运行结果图
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.赵德柱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值