此文章系列为保存考研复习时的所有代码
顺序表进阶:
- 从顺序表中删除具有最小值的元素(假设唯一)并有函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序为空则显示错误信息并退出运行:
bool DeleteSqlistMin(Seqlist *p,int * x )
{
if(p->size==0)
return false;
int min=p->array[0];
int i=0;int temp=0;
for(i=0;i<p->size;i++)
{
if(min>p->array[i])
{
min=p->array[i];
temp=i;
}
}
p->array[temp]=p->array[p->size-1];
p->size--;//这里答案上写了要删除最后一项,但根据题意,本人认为无伤大雅
return true;
}
- 设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1):
bool ReverseSqlist(Seqlist *L)//由于题目只要求了空间复杂度,所以刚拿到题目就想到了用双循环冒泡法
{
if(L->size==0)
return false;
int temp=0;
int i=0;
int j=0;
for(i=0;i<L->size-1;i++)
for(j=0;j< L->size-i-1;j++)
{
temp=L->array[j];
L->array[j]=L->array[j+1];
L->array[j+1]=temp;
}
return true;
}
bool ReverseSqlist2(Seqlist *L)//标答给出的折半互换法
{
if(L->size==0)
return false;
int temp=0;
int i=0;
for(i=0;i<=L->size/2;i++)
{
temp=L->array[i];
L->array[i]=L->array[L->size-i-1];
L->array[L->size-i-1]=temp;
}
return true;
}
- 对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素:
bool DeleteElem(Seqlist * L,int x )
{
if(L->size==0)
return false;
int count= 0;
int distance =0;
int i=0;
for(i=0;i<L->size-1;i++)
{
if(L->array[i]==x)
{
count++;
}
else
L->array[i-count]=L->array[i];
}
L->size-=count;
return true;
}
- 从有序顺序表中删除旗帜在给定值s与t之间(s<t)的所有元素,如果不合理则显示错误信息并退出运行:
bool DelteBtwElem(Seqlist * L,int s,int t )
{
int count_s=0;
int count_t=0;
for(int i = 0;i<L->size;i++)
{
if(L->array[i]==s)
{
count_s=i;
break;
}
else if(L->array[i]!=s&&i==L->size-1)
{
printf("can not found s! n");
return false;
}
}
for(int i = 0;i<L->size;i++)
{
if(L->array[i]==t&& (L->array[i+1]>L->array[i]||i==L->size-1))
{
count_t=i;
break;
}
else if(L->array[i]!=t&&i==L->size-1)
{
printf("can not found t! n");
return false;
}
}
for(int i = count_t ; i<L->size;i++)
{
L->array[i- count_s -2]=L->array[i+1];
}
L->size-= count_t - count_s +1;
return true;
}