数据结构-顺序表(静态分配存储空间)

数据结构-顺序表(静态分配存储空间)

线性表的顺序存储就称为顺序表。它是用一组地址上连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。通过物理位置相邻的办法来表现出其逻辑上的相邻关系。

(1)顺序表的结构定义(使用数组)

结构型定义:(静态分配存储空间)

/** * 静态分配存储空间 */
#define MaxSize 100 //表示有MaxSize个位置
typedef struct {
   
	int data[MaxSize];   //定义一个数组空间,得到一片连续的存储空间,用于存储数据
	int length;  //记录线性表当前的长度,即已有多少个数据
}SeqList;  //自定义的顺序表类型为SeqList

创建顺序表

/** * 创建顺序表,输入数据存入顺序表的数组空间中 * @param L 代表顺序表,使用引用类型 * @param n 需要插入的元素个数 */
int Create_SeqList(SeqList& L, int n) {
   
	if (n > MaxSize)   //需要插入的数据不能大于数组的长度
		return 0;
	for (int i = 0; i < n; ++i)
		scanf_s("%d", &L.data[i]);   //vs2019里推荐使用的,用法和 scanf() 一样,但是更安全
	L.length = n;   //记录创建的顺序表长度
	return 1;
}

参数L使用引用类型,这样函数对其进行的所有操作在主函数中都是直接生效的。

输出顺序表

/** * 输出顺序表 * @param L 顺序表 */
void Print_SeqList(SeqList L) {
   
	for (int i = 0; i < L.length; i++)
		printf("%d ", L.data[i]);
	printf("\n");
}

在顺序表中插入元素

/** * 在已有数据的顺序表(静态分配存储空间)中插入一个数据 * @param L 顺序表 * @param location 需要插入在第location个位置 * @param elem 插入的元素值 * @return 1表示插入成功,0表示插入失败 */
int InsertElem_SeqList(SeqList& L, int location, int elem) {
   
	if (location < 1 || location > L.length + 1 || L.length >= MaxSize) //判断插入的位置是否有效
		return 0;
	for (int i = L.length; i >= location; --i) //将元素从后往前依次向后移动一个位置
		L.data[i] = L.data[i - 1];
	L.data[location - 1] = elem;  //插入元素
	L.length++;
	return 1;
}

在顺序表中删除一个元素

/** * 删除指定位置的元素,同时将删除的数据带出 * @param L 顺序表L,引用类型 * @param location 删除第location个位置的元素 * @param elem 引用型,用于带出删除的元素值 * @return 返回1表示插入成功,返回0表示插入失败 */
int DeleteElem_SeqList(SeqList& L, int location, int& elem) {
   
	if (location < 1 || location > L.length)  //判断删除的位置是否有效
		return 0;
	elem = L.data[location - 1];
	for (int i = location; i < L.length; ++i)   //将元素从前往后一次向前移一个位置
		L.data[i - 1] = L.data[i];
	L.length--;
	return 1;
}

注意:这里参数中的elem是引用型,在主函数中调用该函数后,elem的值就会改变,在主函数中再使用elem就是改变后的值。

在顺序表中查找一个元素

/** * 在顺序表中查找第一个元素值为elem的元素,返回其为第几个元素 * @param L 顺序表L * @param elem 要查找的元素值 * @return 0表示未找到,i+1表示在第i+1个位置 */
int LocateElem_SeqList(SeqList L, int elem) {
   
	for (int i = 0; i < L.length; ++i)
	{
   
		if (L.data[i] == elem)
		{
   
			return i + 1;		//下标为i的元素值为elem,其为第i+1个位置
		}
	}
	return 0;   //跳出循环,说明未找到
}

完整测试程序

#include <stdio.h>
/** * 静态分配存储空间 */
#define MaxSize 100 //表示有MaxSize个位置
typedef struct {
   
	int data[MaxSize];   //定义一个数组空间,得到一片连续的存储空间,用于存储数据
	int length;  //记录线性表当前的长度,即已有多少个数据
}SeqList;  //自定义的顺序表类型为SeqList

/** * 创建顺序表,输入数据存入顺序表的数组空间中 * @param L 代表顺序表,使用引用类型 * @param n 需要插入的元素个数 */
int Create_SeqList(SeqList& L, int n) {
   
	if (n > MaxSize)   //需要插入的数据不能大于数组的长度
		return 0;
	for (int i = 0; i < n; ++i)
		scanf_s("%d", &L.data[i]);   //vs2019里推荐使用的,用法和 scanf() 一样,但是更安全
	L.length = n;   //记录创建的顺序表长度
	return 1;
}

/** * 输出顺序表 * @param L 顺序表 */
void Print_SeqList(SeqList L) {
   
	for (int i = 0; i < L.length; i++)
		printf("%d ", L.data[i]);
	printf("\n");
}

/** * 在已有数据的顺序表(静态分配存储空间)中插入一个数据 * @param L 顺序表 * @param location 需要插入在第location个位置 * @param elem 插入的元素值 * @return 1表示插入成功,0表示插入失败 */
int InsertElem_SeqList(SeqList& L, int location, int elem) {
   
	if (location < 1 || location > L.length + 1 || L.length >= MaxSize) //判断插入的位置是否有效
		return 0;
	for (int i = L.length; i >= location; --i) //将元素从后往前依次向后移动一个位置
		L.data[i] = L.data[i - 1];
	L.data[location - 1] = elem;  //插入元素
	L.length++;
	return 1;
}

/** * 删除指定位置的元素,同时将删除的数据带出 * @param L 顺序表L,引用类型 * @param location 删除第location个位置的元素 * @param elem 引用型,用于带出删除的元素值 * @return 返回1表示插入成功,返回0表示插入失败 */
int DeleteElem_SeqList(SeqList& L, int location, int& elem) {
   
	if (location < 1 || location > L.length)  //判断删除的位置是否有效
		return 0;
	elem = L.data[location - 1];
	for (int i = location; i < L.length; ++i)   //将元素从前往后一次向前移一个位置
		L.data[i - 1] = L.data[i];
	L.length--;
	return 1;
}

/** * 在顺序表中查找第一个元素值为elem的元素,返回其为第几个元素 * @param L 顺序表L * @param elem 要查找的元素值 * @return 0表示未找到,i+1表示在第i+1个位置 */
int LocateElem_SeqList(SeqList L, int elem) {
   
	for (int i = 0; i < L.length; ++i)
	{
   
		if (L.data[i] == elem)
		{
   
			return i + 1;		//下标为i的元素值为elem,其为第i+1个位置
		}
	}
	return 0;   //跳出循环,说明未找到
}

/** * 主函数 * @return 结束 */
int main() {
   
	/** * 创建静态分配存储空间的顺序表L时 */
	SeqList L;

	/* 创建顺序表――输入数据 */
	int n;
	printf("输入需要创建的表的长度:\n");
	scanf_s("%d", &n);
	printf("输入表中的元素:\n");
	Create_SeqList(L, n);
	printf("创建顺序表完成:\n");
	Print_SeqList(L);

	/* 插入元素――指定插入位置和值 */
	int elemLoc;
	int elem;
	printf("输入需要插入的位置和元素的值:\n");
	scanf_s("%d %d", &elemLoc, &elem);
	InsertElem_SeqList(L, elemLoc, elem);
	printf("插入数据完成:\n");
	Print_SeqList(L);

	/* 删除元素――指定删除位置 */
	printf("输入需要删除的位置:\n");
	scanf_s("%d", &elemLoc);
	DeleteElem_SeqList(L, elemLoc, elem);
	printf("删除数据完成:\n");
	Print_SeqList(L);
	printf("删除的元素为:%d\n", elem);

	/* 查找指定元素值的位置 */
	printf("输入要查找的值:\n");
	scanf_s("%d", &elem);
	if (LocateElem_SeqList(L, elem))
	{
   
		printf("值为%d的元素在第%d个位置", elem, LocateElem_SeqList(L, elem));
	}
	else {
   
		printf("未找到\n");
	}

	return 0;

}

创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢谢!

全部评论

相关推荐

2024-12-29 11:08
湖南工业大学 Java
程序员牛肉:简历没什么大问题了。 而且不要再换项目了。三月份就开暑期实习了,现在都一月份了。实在来不及重新开一下项目了。把一个项目写完或许很快,但是把一个项目搞懂吃透并不简单。所以不要换项目了,把你简历上面的两个项目好好挖一挖吧。 具体 体现在:你能不能流利的说出你的项目的每一个功能点代码实现?你能不能说出在这块除了A技术之外,还有其他技术能够实现嘛?如果有其他技术能够实现,那你这块为什么选择了你当前用的这个技术?
投递牛客等公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务