问题描述:设计一个算法,从一给定的顺序表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;
}
}
}