数据结构第二天

一、对数据结构进行深入学习

1、顺序表加入按顺序查找

// 删除数据:根据数值删除数据
// s    :要删除的顺序表
// data: 要删除的数据
// 返回值:成功返回 TRUE,失败返回FALSE,其他返回ERROR
BOOL Delete_data(Sqe* s,Data data);

BOOL Delete_data(Sqe* s,Data data)
{
	if(NULL == s)
		return ERROR;
	
	int i;
	for(i = 0 ; i < s->Size; i++)
	{
		if(s->pData[i] == data)
		{	
			Delete_pos(s,i);
			return TRUE;
		}
	}
	
	return FALSE;
}

2、顺序表加入按数据查找

// 查找数据:根据数值查找数据
// [in]s    :要查找的顺序表
// [in]data: 要查找的数据
// [out]pIndex:查找到的元素下标
// 返回值:成功返回 TRUE,失败返回FALSE,其他返回ERROR
BOOL Find_Data(Sqe* s,Data data,int *pIndex);

BOOL Find_Data(Sqe* s,Data data,int *pIndex)
{
	if(NULL == s)
		return ERROR;
	
	int i;
	for(i = 0 ; i < s->Size; i++)
	{
		if(s->pData[i] == data)
		{	
			*pIndex = i;
			return TRUE;
		}
	}
	
	return FALSE;
}

3、修改某个数据

// 修改数据:根据数值修改数据
// [in]s   :要修改的顺序表
// [in]data: 要修改成的数据
// [in]index:要修改的下标
// 返回值:成功返回 TRUE,失败返回FALSE,其他返回ERROR
BOOL Modify_Data(Sqe* s, int index, Data data);

BOOL Modify_Data(Sqe* s, int index, Data data)
{
	if(NULL == s || index < 0 || index > s->Size)
		return ERROR;
	
	s->pData[index] = data;
	
	return TRUE;
}


4、合并两张表

// 合并顺序表	(从大到小排序)
// [in]s1:要合并的第一个顺序表
// [in]s2: 要合并的第二个顺序表
// 返回值:成功返回 s3,失败返回NULL
Sqe * Merge(Sqe *s1,Sqe *s2);

Sqe * Merge(Sqe *s1,Sqe *s2)
{
	if(NULL == s1 || NULL == s2)
		return NULL;
	
	//s3的创建
	Sqe *s3 = (Sqe *)malloc(sizeof(Sqe)/sizeof(char));		
	if(NULL == s3)
	{
		return NULL;
	}
	s3->pData=(Data *)malloc(sizeof(Data)/sizeof(char)*(s1->Size + s2->Size));
	if(NULL == s3->pData )
	{
		free(s3);
		return NULL;
	}	
	s3->MaxSize = s1->Size + s2->Size;
	s3->Size    = s1->Size + s2->Size;
	
	//给s3填入数据
	int i = 0;
	int j = 0;
	int k = 0;
	while(i < s1->Size && j < s2->Size)				//有一个结束,就不用判断了
	{
		if(s1->pData[i] < s2->pData[j])
			s3->pData[k++] = s1->pData[i++];
		else
			s3->pData[k++] = s2->pData[j++];
	}
	
	while(i < s1->Size)								//其中 一个到头后将剩下一个数组中的值全部给s3
		s3->pData[k++] = s1->pData[i++];
	while( j < s2->Size)
		s3->pData[k++] = s2->pData[j++];
	
	return s3;
}

二、单链表

1、链表存储有两个域,一个存放数据,一个存放要指向的地址
在这里插入图片描述2、链表的优点:避免删除添加大量数据使数据大量移动
3、单链表的分类:
头指针式链表
头结点式链表(经常使用这种)
4、一组单链表在内存中的形式
在这里插入图片描述5、单链表按位置插入
先看一张图
在这里插入图片描述这样就能明白插入时要找前一个结点。
核心的代码
在这里插入图片描述6、单链表逆序
提示:可以运用两个指针实现
在这里插入图片描述核心代码

	Node *pre = ls->head->next;			//第一个结点
	Node *cur = pre->next;				//要换的结点
	Node *tmp;							//保存指向下一个地址
	
	while(cur)
	{
		tmp = cur->next;
		cur->next = pre;
		
		pre = cur;
		cur = tmp;
	}
	
	ls->head->next->next = NULL;
	ls->head->next = pre;
	

7、一些链表题目的思路
(1)两个链表相交找到相交的点
找到长度长的链表,让长的链表先走长度差值的步数。在同时走遇到的第一个交点就是两个链表的交点。
(2)找到链表倒数第K个值
先让一个指针走K,再同时匀速走,当第一个走完,第二个指针就在倒数第K的位置
(3)判断链表有没有环
让2个指针以不同的速度走,如果相遇则有环。
(4)如果有环,判断环的点在哪
让2个指针以不同的速度走,如果相遇则有环。在交点的地方设一个指针P3,起点设一个指针P4。匀速走当他们相交就是交点处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值