数据结构绪论及线性表的实践

/*****************************************************************************************************
*第一章 绪论
*数据结构: data structure
*数据: data
*数据元素: data element
*算法: algorithm
*时间复杂度: time complexity
*空间复杂度: space complexity
*时间复杂度比较:
*O(1) < O( logn) < O(n) < O(nlogn) < O(n²)
*O(2^n) < O(n!) < O(n^n)
*****************************************************************************************************/

/*****************************************************************************************************
*第二章 线性表
*线性表:						linear list
*线性链表:						link list
*循环链表:						circular linked lists
*双向循环链表:					double circular linked list
*****************************************************************************************************/


/*****************************************************************************************************
*顺序存储的线性表
*概念:
*顺序存储的线性表是将逻辑上相邻的节点存储在物理位置相邻的存储单元中,通常用数组来实现顺序存储的线性表,简称:顺序线性表
*顺序存储的线性表的基本操作有:插入、删除、查找、遍历等
*****************************************************************************************************/
//=======================================================顺序线性表BEGIN====================================================
#define MAX 100				//线性表可能的最大长度
typedef struct
{
	char element[MAX];		//存放线性表数据
	int num;				//数据个数
}LIST;


/*****************************************************************************************************
*函数名称:sequenceListInsert
*功能描述:插入元素,要在长度为n的顺序线性表的第m个元素之前插入一个新的数据元素x,需要将第n到第m(共n-m+1)个元素向后移动一个位置,从而空出一个位置放入新增加的数据元素
*输入参数:LIST*:现有列表		int m:插入位置		char x:插入数据
*返 回 值:-1:线性表已满,无法插入		-2:插入位置有误,MAX<=m<0		-3:线性表元素个数有误		0:插入成功
*作    者:zj
*日    期:2024-12-12
*备    注:
*****************************************************************************************************/
int sequenceListInsert(LIST* list, const int m, const char x)
{
	int curNum = list->num;

	if ( curNum >= MAX)
	{
		return -1;
	}

	if (m < 1 || m >= MAX)
	{
		return -2;
	}

	if (curNum < 0)
	{
		return -3;
	}

	while ( curNum >= m )
	{
		list->element[curNum--] = list->element[curNum];
	}
	list->element[m - 1] = x;
	list->num++;
	return 0;
}


/*****************************************************************************************************
*函数名称:sequenceListDelete
*功能描述:删除元素,在顺序线性表中要删除第m个元素,需要将第m+1到第n(共n-m)个元素依次向前移动一个位置,填补被删除元素的位置
*输入参数:LIST*:现有列表	m:删除位置
*返 回 值:-1:顺序线性表元素个数有误		-2:删除元素下标有误		0:删除成功
*作    者:zj
*日    期:2024-12-12
*备    注:
*****************************************************************************************************/
int sequenceListDelete(LIST* list, int m)
{
	int curNum = list->num;
	if (curNum < 0)
	{
		return -1;
	}

	if (m < 1 || m >= MAX)
	{
		return -2;
	}

	while ( m < curNum )
	{
		list->element[m-1] = list->element[m++];
	}
	list->num--;
	return 0;
}


/*****************************************************************************************************
*函数名称:sequenceListFind
*功能描述:查找元素,在一个顺序线性表中查找特定值的数据元素,可以从第一个元素开始,逐个与需查找的值比较。(顺序查找)
*输入参数:LIST*:现有顺序线性表		x:待查找元素
*返 回 值:-1:未查找到		查找到后返回下标
*作    者:zj
*日    期:2024-12-12
*备    注:
*****************************************************************************************************/
int sequenceListFind(LIST* list, char x)
{
	int curNum = list->num;
	if (curNum < 0)
	{
		return -1;
	}

	for (int i = 0; i < curNum; i++)
	{
		if (list->element[i] == x)
		{
			return i + 1;
		}
	}

	return -1;
}


/*****************************************************************************************************
*函数名称:sequenceListUnion
*功能描述:计算source与target的并集,将结果保存到target中
*输入参数:target:目标集合	source:需要合并的集合
*返 回 值:无
*作    者:zj
*日    期:2024-12-12
*备    注:
*****************************************************************************************************/
void sequenceListUnion(LIST* target, LIST* source)
{
	for (int i = 0; i < source->num; i++)
	{
		if (sequenceListFind(target, source->element[i]) == -1)
		{
			sequenceListInsert(target, target->num + 1, source->element[i]);
		}
	}
}


//=======================================================顺序线性表END====================================================


/*****************************************************************************************************
*线性表-向前链表的存储结构
*概念:
*它不要求逻辑上相邻的元素在物理地址上也相邻,因此可以避免顺序线性表的弱点
*向前链表的基本操作有:插入、删除、查找、遍历等
*****************************************************************************************************/

//======================================================向前链式线性表BEGIN====================================================

/*****************************************************************************************************
*数据域info存放线性表元素的值,指针域link保存下一个元素的指针
*****************************************************************************************************/
typedef struct node
{
	char info;							//数据域
	struct node *link;					//指针域
}NODE;

//======================================================向前链式线性表END====================================================

//=============================================================测试代码BEGIN========================================================
void printList(LIST *list)
{
	for (int i = 0; i < list->num; i++)
	{
		std::cout << list->element[i];
	}
	std::cout << std::endl;
}

void printNode(NODE* head)
{
	NODE* it = head->link;
	while (it)
	{
		std::cout << it->info ;
		it = it->link;
	}
	std::cout << std::endl;
}

int main(int argc, char **argv)
{
	for (int i = 0; i < argc; i++)
	{
		std::cout << argv[i] << std::endl;
	}

	LIST *list = new LIST;
	LIST *list1 = new LIST;
	list->num = 0;
	memset(list->element, 0, MAX);
	list1->num = 0;
	memset(list1->element, 0, MAX);
	for (int i = 0; i < 10; i++)
	{
		sequenceListInsert(list, i, i + '0');
	}

	printList(list);

	sequenceListDelete(list, 2);
	printList(list);

	sequenceListInsert(list1, 1, ']');
	sequenceListUnion(list, list1);
	printList(list);
	system("pause");
	return 0;
}
//=============================================================测试代码END========================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五_谷_丰_登

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

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

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

打赏作者

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

抵扣说明:

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

余额充值