数据结构中顺序表的建立,初始化,插入,按位置删除,按值删除,逆置;

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#define MaxSize 100//定义顺序表最大长度
#define ElemType int//把int命名为ElemType
typedef struct
{
	ElemType data[MaxSize];//顺序表元素
	int length;            //顺序表当前长度
}SqList;

int InitList(SqList& L)
{
	memset(L.data, 0, sizeof(L));//初始化数据为0
	L.length = 0;                //初始化长度为0
	return 0;
}

bool CreateList(SqList& L, int n)   //创建顺序表函数 初始化前n个数据
{
	printf("初始化顺序表,请输入顺序表的元素:\n");
	if (n<0 || n>MaxSize)
		false;
	for (int i = 0; i < n; i++)
	{
		scanf_s("%d", &L.data[i]);
		L.length++;
	}
	return true;
}

bool InsertList(SqList& L, int i, ElemType e)
{
	if (i<1 || i>L.length + 1) //判断位置是否有效
	{
		printf("位置无效!!!\n");
		return false;
	}
	if (L.length >= MaxSize)//判断存储空间是否已满
	{
		printf("当前存储空间已满!!!\n");
		return false;
	}
	for (int j = L.length; j >= i; j--)//位置i及之后元素后移
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
	return true;
}



bool DeleteLest_i(SqList& L, int i)        //按位置删除元素
{
	if (i<1 && i>L.length)         //判断i是否合法
		return false;
	else
	{
		for (int j = i; j < L.length; j++)
		{
			L.data[j - 1] = L.data[j];            //删除元素后面的所有元素前移一个单位
		}
		L.length--;                //长度减一
		return true;
	}
}

void DeleteList_x(SqList& L, ElemType x)          //按值删除元素
{
	int count = 0, i = 0;//count记录元素x的值有几个
	while (i < L.length) 
	{
		if (x == L.data[i])
			count++;
		else
			L.data[i - count] = L.data[i];//元素前移count个单位
		i++;
	}
	if (count == 0)       //没有该值时
		printf("没有该值!\n\n");
	L.length = L.length - count; //总长减count
}


void ReverseList(SqList& L)//元素逆置,空间复杂度为O(1)
{
	ElemType temp;
	for (int i = 0; i < L.length / 2; i++)
	{
		temp = L.data[i];
		L.data[i] = L.data[L.length - i - 1];
		L.data[L.length - i - 1] = temp;
	}
}

void Print(SqList L)//打印元素的值
{
	printf("打印顺序表的值:");
	for (int i = 0; i <L.length; i++)
	{
		printf("%d  ", L.data[i]);
	}
	printf("\n");
}
int main()  //主函数
{
	SqList L;

	while (1)
	{

		printf("\n请输入接下来的操作:\n");
		printf("1:初始化顺序表,并输入初始值:\n");
		printf("2:插入元素:\n");
		printf("3:打印元素:\n");
		printf("4:按位置删除元素:\n");
		printf("5:按值删除元素:\n");
		printf("6:元素逆置:\n");
		printf("-1:退出:\n");
		printf("\n\n");
		int n = 0, i = 0, e = 0;
		int x, in = 0, elem = 0;
		scanf_s("%d",&x);
		if (x == -1)
			break;
		switch (x)
		{
		case 1://初始化
			InitList(L);
			printf("请输入顺序表的长度:");
			scanf_s("%d", &n);
			CreateList(L, n);
			printf("\n");
			break;
		case 2:
			printf("\n输入插入的位置和元素:");
			scanf_s("%d%d", &i, &e);
			InsertList(L, i, e);
			break;
		case 3:
			Print(L);
			break;
		case 4:
			printf("请输入删除的位置:");
			scanf_s("%d", &in);
			DeleteLest_i(L, in);
			break;
		case 5:
			printf("请您输入要删除的元素的值:");
			scanf_s("%d", &elem);
			DeleteList_x(L, elem);
			break;
		case 6:
			ReverseList(L);
			break;
		}
	}


	return 0;
}

 

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值