问题一:
实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,…,an),逆置为(an,an-1,…,a1)。
1.顺序表的全部逆置
设一个临时变量,将顺序表逆置
<pre name="code" class="html">//顺序表的全部逆置
void reverse_list(Sqlist &L)
{
//就地逆置,设一个临时变量,将顺序表逆置
int i=0,j,k;
for(j=L.length-1;i<=j;i++,j--)
{
k=L.data[i];
L.data[i]=L.data[j];
L.data[j]=k;
}
}
2..顺序表的全部逆置2
折半,将最前面和最后面的交换,之后前面的后移,后面的前移。
<pre name="code" class="html">//顺序表的全部逆置2
void reverse_list (Sqlist &L)
{
int i;
int x;
for(i=0;i<L.length/2;i++) // while(i<L.length) {..........i++;}
{
x=L.data[i];
L.data[i]=L.data[L.length-i-i];
L.data[L.length-1-i]=x;
}
}
</pre><h2>千变万化:</h2><h3>1.将一个顺序表中的第n~m个元素逆置</h3><p></p><p>通过一个临时变量,将顺序表逆置。</p><p></p><pre name="code" class="html">//将一个顺序表中的第n~m个元素逆置
void reverse_date_list(Sqlist &L,int m,int n)
{
int i=m,j=n;
int k;
while(i<j)
{
k=L.data[i];
L.data[i]=L.data[j];
L.data[j]=k;
i++;
j--;
}
}
2.将线性表的前p个元素和后n-p个元素分别逆置
void reverse_date_list(Sqlist &L,int m,int n)
{
int i=m,j=n;
int k;
while(i<j)
{
k=L.data[i];
L.data[i]=L.data[j];
L.data[j]=k;
i++;
j--;
}
}
void shift_reserve(Sqlist &L,,int n,int p)
{
if(p>0 && p<n)
{
reverse(L,0,n-p-1); //将前n-p个元素逆置
reverse(L,n-p,n-1); //将后p个元素逆置
}
}
<h1>问题二:</h1><h2> 从一个顺序表中删除所有元素值为x的元素</h2><h3>1.删除元素值1</h3><p>遍历顺序表建立一个空表,只是新顺序表共享原顺序表的空间</p><div>算法:从头开始遍历,数值不同则放入空表,直至结束;表长为新表的长度
</div>
void delete_elem_list(Sqlist &L,int x)
{
int i,k=0; //k用来记录数值不同的数,将它放到空表中
for(i=0;i<L.length;i++)
{
if(L.data[i]!=x)
{
L.data[k]=L.data[i];
k++;
}
}
L.length=k;
}
2.删除元素值2
遍历顺序表,将数值不同的放到与其相邻的数值相同的前面算法:用一个新变量n记录数值相同的数出现的次数,当当前数和x不同时,将数值不同前移n个位置
void delete_elem_list(Sqlist &L,int x)
{
int i=0,n=0; //n用来记录数值相同的数的个数,也就是数值不同的数的前移位置
while (i<L.length)
{
if(L.data[i]==x)
n++;
else
L.data[i-k]=L.data[i];
i++;
}
L.length-=k;
}
千变万化:
删除线性表中元素值在x~y范围内的所有元素
1.遍历顺序表建立一个空表,只是新顺序表共享原顺序表的空间
算法:从头开始遍历,数值不在范围之内(数值不同)则放入空表,直至结束;表长为新表的长度
void delete_elem_list(Sqlist &L,int x,int y)
{
int i,k=0; //k用来记录数值在范围之内(数值不同)的数,将它放到空表中
for(i=0;i<L.length;i++)
{
if(L.data[i]<x || L.data[i]>y) //if(L.data[i]!=x)
{
L.data[k]=L.data[i];
k++;
}
}
L.length=k;
}
2.遍历顺序表,将数值不同的放到与其相邻的数值相同的前面
算法:用一个新变量n记录数值在范围内(数值相同)的数出现的次数,当当前数不在范围之内时(和x不同时),将数值不同前移n个位置
void delete_elem_list(Sqlist &L,int x,int y)
{
int i=0,n=0; //n用来记录数值在范围之内(数值相同)的数的个数,也就是数值不在范围之内(数值不同)的数的前移位置
while (i<L.length)
{
if(L.data[i]>=x && L.data[i]<=y) //if(L.data[i]==x)
n++;
else
L.data[i-k]=L.data[i];
i++;
}
L.length-=k;
}