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

问题一:

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







  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值