顺序表的实现——静态分配(C语言实现)

一、表的定义

我们常说的表一般是指线性表,线性表可以分为两类:一是基于简单数组实现的顺序表;二是链表。今天先简单说一下最简单的顺序表的静态实现。

二、静态顺序表的实现步骤

1、预处理(对需要用到的先进行类型定义和声明)


//预处理
//【1】声明静态顺序表的最大长度
#define MaxSize 10	

//【2】自定义C语言中的bool变量,或者直接包含头文件include <>
#define bool char		
#define true 1
#define false 0

//【3】自定义数据元素的数据类型
typedef int Elemtype;	

//【4】静态顺序表的结构体定义
typedef struct SqList 
{
	Elemtype date[MaxSize];//用静态数组存放数据,开辟了一块大小为MaxSize大小的内存空间
	int length;//顺序表的当前长度
}SqList;

对于这一部分,第二步【2】的bool变量类型也可以直接通过包含#include <stdbool.h>来实现;

2、创建一个顺序表,并对表进行初始化

为了方便阅读,先将主函数的部分写上

int main()
{
	SqList L1;//表示向内存申请一块空间生成静态顺序表,名字叫做L1

	InitialSqList(&L1);//初始化顺序表,


	return 0;
}

先声明一个类型为SqList的变量L1;L1就是我们要的顺序表,对表L1进行初始化:

bool InitialSqList(SqList* L)
{
	L->length = 0;//初始化表长
	for (int i = 0; i < MaxSize; i++)//遍历整个顺序表,清除表中的脏数据
	{
		L->date[i] = 0;
	}
	return true;//初始化成功,返回true
}

对于初始化,里面的对数据初始化这一步可以省略,因为我们在访问这个表时,只是访问到当前表长的位置。因此表长初始化不能省略。到这一步,我们对于创建一个静态顺序表的程序基本实现。接下来就是对表进行输出打印。

3、顺序表的输出

bool SqListPrintf(SqList L)
{
	//<1>判空
	if (L.length == 0)
	{
		printf("这是一个空表!\n");
		return false;
	}
	printf("SqList:\n");//如果不是一个空表,则输出表中的元素

	for (int i = 0; i < L.length; i++)
	{
		printf("%d-->", L.date[i]);
	}
	printf("end\n");
	return true;
}

输出顺序表首先判断当前表长是否为0;为0则是空表,否则输出表中的元素。

三、表ADT

什么是表ADT?简单来说,就是对表中数据元素进行的一些操作的集合,例如:增、删、改、查。1、顺序表的基本操作——增

增:即是添加元素

//在顺序表的第i位的位置插入一个元素e
bool SqListInsert(SqList* L, int i, Elemtype e)
{
	//(1)判断插入位置是否合法
	if (i<1 || i>L->length + 1)
	{
		printf("插入位置不合法!\n");
		return false;
	}
	if (L->length >= MaxSize)
	{
		printf("表已满!\n");
		return false;
	}
	//(2)移动元素,空出待插入的位置
	for (int j = L->length; j >=i; j--)
	{
		L->date[j] = L->date[j - 1];
	}
	//(3)将新元素插入到正确位置
	L->date[i - 1] = e;
	//(4)表长加一
	L->length++;

	return true;//返回true,表示插入成功

}

插入元素需要的一些步骤代码里有详细注释,可自行阅读

2、顺序表的基本操作——删

在顺序表的第i位的位置删除一个元素e,并且返回元素e
bool SqListElemDelete(SqList* L, int i, Elemtype* e)
{
	//(1)判断删除位置是否合法
	if (i<1 || i>L->length + 1)
	{
		printf("删除位置不合法!\n");
		return false;
	}
	if (L->length <=0 )//表中已经没有元素
	{
		printf("表已空!\n");
		return false;
	}
	//(2)将待删除的元素赋值给e
	*e = L->date[i - 1];
	//(3)将第i位以后的元素前移
	for (int j = i; j < L->length; j++)
	{
		L->date[j - 1] = L->date[j];
	}
	//(4)表长减一
	L->length--;

	return true;//表示删除成功
}

3、表的基本操作——查(按值查找)

对于改就不写了,先查查到元素,再将要修改的元素进行重修赋值即可

查找顺序表中元素e的位置,并返回该元素在顺序表的为位序
int SqListElemFind(SqList L, Elemtype e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (e == L.date[i])
			return i + 1;
	}
	return 0;
}

最后是完整的代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

//预处理
//【1】声明静态顺序表的最大长度
#define MaxSize 10	

//【2】自定义C语言中的bool变量,或者直接包含头文件include <>
#define bool char		
#define true 1
#define false 0

//【3】自定义数据元素的数据类型
typedef int Elemtype;	

//【4】静态顺序表的结构体定义
typedef struct SqList 
{
	Elemtype date[MaxSize];//用静态数组存放数据,开辟了一块大小为MaxSize大小的内存空间
	int length;//顺序表的当前长度
}SqList;

//【5】顺序表的初始化
bool InitialSqList(SqList* L)
{
	L->length = 0;//初始化表长
	for (int i = 0; i < MaxSize; i++)//遍历整个顺序表,清除表中的脏数据
	{
		L->date[i] = 0;
	}
	return true;//初始化成功,返回true
}

//顺序表的输出
bool SqListPrintf(SqList L)
{
	//<1>判空
	if (L.length == 0)
	{
		printf("这是一个空表!\n");
		return false;
	}
	printf("SqList:\n");//如果不是一个空表,则输出表中的元素

	for (int i = 0; i < L.length; i++)
	{
		printf("%d-->", L.date[i]);
	}
	printf("end\n");
	return true;
}

//顺序表的基本操作
//【6】顺序表的插入(按位插入)
//在顺序表的第i位的位置插入一个元素e
bool SqListInsert(SqList* L, int i, Elemtype e)
{
	//(1)判断插入位置是否合法
	if (i<1 || i>L->length + 1)
	{
		printf("插入位置不合法!\n");
		return false;
	}
	if (L->length >= MaxSize)
	{
		printf("表已满!\n");
		return false;
	}
	//(2)移动元素,空出待插入的位置
	for (int j = L->length; j >=i; j--)
	{
		L->date[j] = L->date[j - 1];
	}
	//(3)将新元素插入到正确位置
	L->date[i - 1] = e;
	//(4)表长加一
	L->length++;

	return true;//返回true,表示插入成功

}

//【7】顺序表的删除(按位删除)
//在顺序表的第i位的位置删除一个元素e,并且返回元素e
bool SqListElemDelete(SqList* L, int i, Elemtype* e)
{
	//(1)判断删除位置是否合法
	if (i<1 || i>L->length + 1)
	{
		printf("删除位置不合法!\n");
		return false;
	}
	if (L->length <=0 )//表中已经没有元素
	{
		printf("表已空!\n");
		return false;
	}
	//(2)将待删除的元素赋值给e
	*e = L->date[i - 1];
	//(3)将第i位以后的元素前移
	for (int j = i; j < L->length; j++)
	{
		L->date[j - 1] = L->date[j];
	}
	//(4)表长减一
	L->length--;

	return true;//表示删除成功
}

//【8】顺序表的查找(按值删除)
//查找顺序表中元素e的位置,并返回该元素在顺序表的为位序
int SqListElemFind(SqList L, Elemtype e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (e == L.date[i])
			return i + 1;
	}
	return 0;
}

int main()
{
	SqList L1;//表示向内存申请一块空间生成静态顺序表,名字叫做L1

	InitialSqList(&L1);//初始化顺序表,

	for (int i = 1; i < 5; i++)
	{
		SqListInsert(&L1, i, i * i);
	}

	SqListInsert(&L1, 3, 20);//插入元素

	//int e;
	//SqListElemDelete(&L1, 1, &e);

	SqListElemFind(L1, 20);//查找元素
	

	SqListPrintf(L1);

	//printf("被删除的元素是:%d", e);
	printf("该元素在顺序表中的位序是:%d", SqListElemFind(L1, 20));
	
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

想吐泡泡啊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值