【数据结构】天勤线性表问题

问题描述:设计一个算法,从一给定的顺序表L中删除下标i<j(j<=j,包括i,j)的所有元素。

void deleteAtoB(LinkList *List, int i, int j)
{
	if (i<0 || j>(List->length) - 1 || j < i)
	{
		cout << "location illegal!" << endl;
		return;
	}

	int now = j + 1;
	int difference = j - i + 1;//两数之差
	while (now < List->length)
	{
		List->data[now - difference] = List->data[now];
		now++;
	}
	List->length -= difference;

}

问题描述:有一个顺序表L,设计一个算法,将L中所有小于表头元素的整数放在前半部分,大于表头元素的整数部分放在后半部分。

void move(LinkList *List)
{
	int flag = 1;
	int head = 0;
	int tail = List->length - 1;

	while (head < tail)
	{
		//第一次从右边往左边扫,直到扫描的元素小于head对应的元素
		if (flag == 1)
		{
			//条件不能是大于 等于有两种情况 
			//一种是扫描到了自己 需要结束 
			//一种是扫描到了相同的项
			//因此碰到等于的时候 要停下来 判断下是不是头尾相遇了
			while (List->data[tail] > List->data[head])
			{
				tail--;
			}
			if (head < tail)//如果没有重合,说明发现了比head所指元素要小的数字
			{
				//交换
				int temp = List->data[head];
				List->data[head] = List->data[tail];
				List->data[tail] = temp;
			}
			else
			{
				return;
			}
			flag = 0;
		}
		else
		{
			while (List->data[head] < List->data[tail])//如果head小于等于tail,就继续扫,直到head大于tail,就交换
			{
				head++;
			}
			//循环结束的情况有 1.头有大于尾的元素2.头等于尾(头等于尾要嘛是头尾相遇,要嘛是有相同的项)
			if (head < tail)//如果没有重合,说明发现了比head所指元素要小的数字
			{
				//交换
				int temp = List->data[head];
				List->data[head] = List->data[tail];
				List->data[tail] = temp;
			}
			else
			{
				return;
			}
			flag = 1;
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值