数据结构(一)顺序表2:顺序表的就地逆置和顺序表中删除元素值

来源:互联网 发布:cc域名注册哪里便宜 编辑:程序博客网 时间:2024/05/17 07:03

问题一:

 实现顺序表的就地逆置,即利用原表的存储空间将线性表(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">//顺序表的全部逆置2void 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;}







0 0