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

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

(1)顺序表的结构定义:

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

/**
 * 动态分配存储空间
 */
#define InitSize 100  //动态分配存储空间时,不限制最大,只给定一个初始值
#define ListIncrement 10  //分配增量
typedef	struct
{
	int* data;   //指向所分配的存储空间的基地址
	int length;  //当前的长度,已经存储元素后占用的长度
	int listsize;  //当前分配的存储空间的大小,若不足,可再进行分配
}SeqList;

初始化顺序表

/**
 * 初始化顺序表,动态分配存储空间
 * @param L 顺序表L,引用型
 */
void Init_SeqList(SeqList& L) {
	L.data = (int*)malloc(sizeof(int) * InitSize);
	L.length = 0;
	L.listsize = InitSize;
}

创建顺序表

/**
 * 创建顺序表时,动态分配存储空间,当需要插入的元素个数大于初始的空间大小时,可继续申请空间
 * @param  L 顺序表L,引用型
 * @param  n 需要插入的元素个数
 * @return   0表示失败,1表示成功
 */
int Create_SeqList(SeqList& L, int n) {
	if (n > L.listsize)
	{
		/*
		指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小),在原有的空间上增加空间
		 */
		int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));
		if (newbase)
		{
			L.data = newbase;   //新基址
			L.listsize += ListIncrement;  //增加存储容量
		}
		else {
			return 0;
		}
	}
	/*
	存入数据
	 */
	for (int i = 0; i < n; ++i)
	{
		scanf_s("%d", &L.data[i]);
	}
	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)
	{
		return 0;
	}
	if (L.length >= L.listsize)		//当前存储空间已满,增加分配
	{
		int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));
		if (newbase)
		{
			L.data = newbase;
			L.listsize += ListIncrement;
		}
	}
	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;
}

完整测试函数

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
/**
 * 动态分配存储空间
 */
#define InitSize 100  //动态分配存储空间时,不限制最大,只给定一个初始值
#define ListIncrement 10  //分配增量
typedef	struct
{
	int* data;   //指向所分配的存储空间的基地址
	int length;  //当前的长度,已经存储元素后占用的长度
	int listsize;  //当前分配的存储空间的大小,若不足,可再进行分配
}SeqList;

/**
 * 初始化顺序表,动态分配存储空间
 * @param L 顺序表L,引用型
 */
void Init_SeqList(SeqList& L) {
	L.data = (int*)malloc(sizeof(int) * InitSize);
	L.length = 0;
	L.listsize = InitSize;
}

/**
 * 创建顺序表时,动态分配存储空间,当需要插入的元素个数大于初始的空间大小时,可继续申请空间
 * @param  L 顺序表L,引用型
 * @param  n 需要插入的元素个数
 * @return   0表示失败,1表示成功
 */
int Create_SeqList(SeqList& L, int n) {
	if (n > L.listsize)
	{
		/*
		指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小),在原有的空间上增加空间
		 */
		int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));
		if (newbase)
		{
			L.data = newbase;   //新基址
			L.listsize += ListIncrement;  //增加存储容量
		}
		else {
			return 0;
		}
	}
	/*
	存入数据
	 */
	for (int i = 0; i < n; ++i)
	{
		scanf_s("%d", &L.data[i]);
	}
	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)
	{
		return 0;
	}
	if (L.length >= L.listsize)		//当前存储空间已满,增加分配
	{
		int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));
		if (newbase)
		{
			L.data = newbase;
			L.listsize += ListIncrement;
		}
	}
	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;
}

/**
 * 主函数
 * @return 结束
 */
int main() {

	/**
	 * 创建动态分配存储空间的L时
	 */
	SeqList L;
	Init_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);

	return 0;

}

在这里插入图片描述

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值