(C语言)数据结构-线性表之静态顺序表基本操作的实现(增、删、改、查)

静态顺序表(使用定长数组存储元素)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define SIZE  100
#define TRUE 1
#define FALSE 0
typedef int ElemType;
/*
静态顺序表:使用定长数组存储元素
缺陷:给小了不够用,给大了可能浪费,非常不实用
*/

struct SeqList
{
	ElemType elem[SIZE];	//定长数组
	size_t  length;			//有效数据个数
};
typedef struct SeqList SeqList;

//函数声明
SeqList* InitList();							//初始化顺序表 执行函数返回一个顺序表L
int CreateList(SeqList* L, size_t n);			//参数:顺序表L 长度n 功能:创建顺序表,从键盘输入n个数 存入顺序表L中 成功返回1
int	ListLength(SeqList* L);						//返回顺序表L的长度
ElemType GetListElem(SeqList* L, int i);		//参数:顺序表L 位置i 功能:返回顺序表L中第i个元素的值
int InsList(SeqList* L, int i, ElemType e);		//参数:顺序表L 位置i 元素e 功能:在L中第i个位置插入新的数据元素e,L的长度+1
int UpdList(SeqList* L, int i, ElemType e);		//参数:顺序表L 位置i 元素e 功能:修改顺序表L的第i个元素的值为e 成功返回1 否则为0
ElemType DelList(SeqList* L, int i);			//参数:顺序表L 位置i 功能:删除顺序表L的第i个元素,并返回被删除元素e的值
int LocateList(SeqList* L, ElemType e);			//参数:顺序表L 元素e 功能:查询元素e在顺序表L中所在的位置,查询到返回元素的位置i 否则返回FALSE
void ClearList(SeqList* L);						//将顺序表L置为空表
int EmptyList(SeqList* L);						//判断顺序表是否为空,如果顺序表L为空则返回TRUE 否则返回FALSE

/***
*	函数名称:SeqList* InitList()
*	函数功能:初始化顺序表
*	入口参数:none
*	出口参数:L
*	返回类型:SeqList*
***/
SeqList* InitList() {
	//定义顺序表L
	SeqList *L;
	//分配内存空间
	L = (SeqList*)malloc(sizeof(SeqList));
	//判断内存空间是否分配成功
	//给空的顺序表设置长度为0
	if (L) L->length = 0;
	//返回顺序表L
	return L;
}

/***
*	函数名称:int CreateList(SeqList *L, size_t n)
*	函数功能:创建顺序表,从键盘输入n个数 存入顺序表L中
*	入口参数:SeqList *L, size_t n
*	出口参数:0|1(成功返回1 失败返回0)
*	返回类型:int
***/
int CreateList(SeqList *L, size_t n)
{
	//判断初始化的数据个数据是否溢出 或该顺序表已经创建过
	if (n >= SIZE || L->length > 0) return FALSE;
	//从键盘输入n个数存入顺序表array数组中 每次长度+1
	for (size_t i = 0; i < n; i++) {
		scanf("%d", &L->elem[i]);
		L->length++;
	}
	//初始化成功返回1
	return TRUE;
}

/***
*	函数名称:int	ListLength(SeqList *L)
*	函数功能:返回顺序表L的长度(元素个数)
*	入口参数:SeqList *L
*	出口参数:L->length
*	返回类型:int
***/
int	ListLength(SeqList *L)
{
	//返回顺序表的长度
	return L->length;
}
//

/***
*	函数名称:ElemType GetListElem(SeqList* L, int i) 
*	函数功能:返回顺序表L中第i个元素的值
*	入口参数:SeqList* L, int i
*	出口参数:L->elem[i]
*	返回类型:ElemType
***/
ElemType GetListElem(SeqList* L, int i) 
{
	//判断要返回的元素是否超出顺序表长度
	if (i > L->length) return FALSE;
	//返回顺序表L中第i个元素的值
	return L->elem[i - 1];
}

/***
*	函数名称:int InsList(SeqList* L, int i, ElemType e) 
*	函数功能:在L中第i个位置插入新的数据元素e,L的长度+1
*	入口参数:SeqList* L, int i, ElemType e
*	出口参数:none
*	返回类型:none
***/
int InsList(SeqList* L, int i, ElemType e)
{
	//判断插入位置是否有效 存储空间是否已满
	if (i < 1 || i > L->length || L->length == SIZE) {
		return FALSE;
	}
	//将位置i后面的元素后移
	for (size_t j = L->length; j >= i; j--)
		L->elem[j] = L->elem[j - 1];
	//在i的位置插入元素e
	L->elem[i - 1] = e;
	//顺序表长度+1
	L->length++;
	return TRUE;
}

/***
*	函数名称:int UpdList(SeqList* L, int i, ElemType e)
*	函数功能:修改顺序表L的第i个元素的值为e
*	入口参数:SeqList* L, int i, ElemType e
*	出口参数:1|0
*	返回类型:int
***/
int UpdList(SeqList* L, int i, ElemType e)
{
	//判断插入位置是否有效 存储空间是否已满
	if (i < 1 || i > L->length) {
		return FALSE;
	}
	//修改第i个元素的值为e
	L->elem[i - 1] = e;
	return TRUE;
}

/***
*	函数名称:ElemType DelList(SeqList* L, int i)
*	函数功能:删除顺序表L的第i个元素,并返回被删除元素e的值
*	入口参数:SeqList* L, int i
*	出口参数:ElemType e
*	返回类型:ElemType
***/
ElemType DelList(SeqList* L, int i)
{
	//判断要删除元素的位置是否有效
	if (i < 1 || i > L->length) {
		return FALSE;
	}
	//获取要删除的元素e用于返回
	ElemType e = L->elem[i - 1];
	//从i的位置循环位移覆盖顺序表L中的元素
	for (size_t j = i; j < L->length; j++)
	{
		L->elem[j - 1] = L->elem[j];
	}
	//顺序表长度-1
	L->length--;
	//返回被删除的元素e
	return e;
}

/***
*	函数名称:int LocateList(SeqList* L, ElemType e)
*	函数功能:查询元素e在顺序表L中所在的位置,查询到返回元素的位置i 否则返回FALSE
*	入口参数:SeqList* L, ElemType e
*	出口参数:i|FALSE
*	返回类型:int
***/
int LocateList(SeqList* L, ElemType e)
{
	for (size_t i = 0; i < L->length; i++)
	{
		if (L->elem[i] == e) 
		return i + 1;
	}
	return FALSE;
}

/***
*	函数名称:void DestroyList(SeqList* L) 
*	函数功能:销毁顺序表L
*	入口参数:SeqList* L
*	出口参数:none
*	返回类型:void
***/
void DestroyList(SeqList* L) 
{
	//销毁顺序表L
	free(L);
}

/***
*	函数名称:void ClearList(SeqList* L)
*	函数功能:将顺序表L置为空表
*	入口参数:SeqList* L
*	出口参数:none
*	返回类型:void
***/
void ClearList(SeqList* L)
{
	L->length = 0;
}


/***
*	函数名称:int EmptyList(SeqList* L) 
*	函数功能:如果顺序表L为空则返回TRUE 否则返回FALSE
*	入口参数:none
*	出口参数:none
*	返回类型:none
***/
int EmptyList(SeqList* L) 
{
	//空表返回TRUE 非空返回FALSE
	return L->length > 0 ? FALSE : TRUE;
}
void ShowList(SeqList *L) 
{
	for (size_t i = 0; i < L->length; i++)
	{
		printf("%d ", L->elem[i]);
	}
	printf("\n");
}
int main() {
	SeqList *L;
	//初始化
	L = InitList();
	int choice,n,i;
	ElemType e;
	while (1)
	{
		printf("\n********1.创建顺序表			2.插入一个元素到顺序表*********\n");
		printf("********3.从顺序表删除一个元素		4.修改顺序表中元素的值*********\n");
		printf("********5.查找元素首次出现的位置	6.查找顺序表中第i个元素的值****\n");
		printf("********7.获取顺序表的长度		8.清空顺序表*******************\n");
		printf("********9.显示顺序表的值		10.退出程序********************\n");
		printf("请输入选项:");
		scanf("%d", &choice);
		if (choice == 10) break;
		switch (choice)
		{
		case 1:
			printf("请输入要创建的元素个数(3):");
			scanf("%d", &n);
			printf("请分别输入%d个元素的值(1 2 3):", n);
			if (CreateList(L, n)) {
				printf("顺序表创建成功!\n");
			}
			else {
				printf("顺序表创建失败!(要创建的元素个数过多或该顺序表已经创建过)\n");
			}
			break;
		case 2:
			if (EmptyList(L)) {
				printf("当前顺序表为空,请先创建!\n"); break;
			}
			else {
				printf("请输入要插入的位置和插入的值 例如第五个位置插入1(5 1):");
				scanf("%d %d", &i,&e);
				if (InsList(L, i, e))
					printf("插入成功!\n");
				else
					printf("插入失败,请检查插入的位置是否正确!\n");
				break;
			}
		case 3:
			if (EmptyList(L)) {
				printf("当前顺序表为空,请先创建!\n"); break;
			}
			printf("请输入要删除的元素位置(2):");
			scanf("%d", &i);
			if (e = DelList(L, i))
				printf("元素%d删除成功!\n",e);
			else
				printf("元素%d删除失败,查看要删除的元素位置是否正确!\n",e);
			break;
		case 4:
			if (EmptyList(L)) {
				printf("当前顺序表为空,请先创建!\n"); break;
			}
			printf("请输入要修改的位置和修改的值 例如第5个元素改为1(5 1):");
			scanf("%d %d", &i, &e);
			if (UpdList(L,i,e)) {
				printf("修改成功!\n");
			}
			else {
				printf("修改失败,请检查要修改的元素位置是否正确!\n");
			}
			break;
		case 5:
			if (EmptyList(L)) {
				printf("当前顺序表为空,请先创建!\n"); break;
			}
			printf("请输入要查询的元素:");
			scanf("%d",&e);
			if (i = LocateList(L, e)) {
				printf("查找成功,元素%d首次出现在第%d个位置!\n", e, i);
			}
			else {
				printf("查找失败!元素%d不在该顺序表内!\n",e);
			}
			break;
		case 6:
			if (EmptyList(L)) {
				printf("当前顺序表为空,请先创建!\n"); break;
			}
			printf("请输入要查询的元素位置:");
			scanf("%d", &i);
			if (e = GetListElem(L, i)) {
				printf("查询成功,第%d个元素的值为:%d\n",i,e);
			}
			else {
				printf("查询失败,请检查要查询的元素位置是否正确!\n");
			}
			break;
		case 7:
			printf("当前顺序表长度为:%d\n", ListLength(L));
			break;
		case 8:
			ClearList(L);
			if (EmptyList(L))
				printf("顺序表清空成功!\n");
			else
				printf("顺序表清空失败!\n");
			break;
		case 9:
			if (EmptyList(L)) {
				printf("当前顺序表为空,请先创建!\n"); break;
			}
			else {
				printf("当前顺序表的元素为:");
				ShowList(L);
				break;
			}
		default:
			system("cls");
			printf("请从新选择正确的选择!\n");
			break;
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

孑然R

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

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

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

打赏作者

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

抵扣说明:

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

余额充值