顺序表:数组

数组

实际应用中以表的形式出现,数组中的元素是同一类型的。
一维数组又称向量,二维数组又称矩阵。
多维数组通过行优先或列优先描述,可以映射为一维数组。

在数组中第i个位置插入值为x的新元素
template <class T>
boolean Array<T>::Insert(T&x,int i)
{
    //在数组中第i个位置插入值为x的新元素
    //若插入成功,则返回TRUE,否则返回FALSE
    if(ArrayLength==ArraySize)  //数组存储空间已满 
    {
  	cerr<<"overflow"<<endl;
  	return FALSE;
     } 
    else if(i<0||i>ArrayLength)  //插入位置错 
    {
  	cerr<<"position error"<<endl;
  	return FALSE;
    } 
    else
    {
  	for(int j=ArrayLength-1;j>=i;j--)
  	{
            array[j+1]=array[j]; //后移 
            array[i]=x;    	 //插入 
            ArrayLength++;   	 //数组长度增1 
            return TRUE;
        }
    } 
} 
删除数组中的第i个元素
template <class T>
boolean Array<T>::Remove(int i)
{
     //删除第i个元素,若删除成功,则返回TRUE,否则返回FALSE
     if(ArrayLength==0)  
     {
 	 cerr<<"Array is empty"<<endl;
 	 return FALSE;
     }
     //空向量
     else if(i<0||i>ArrayLength-1)
     {
	 cerr<<"position error"<<endl;
	 return FALSE;
     }
     //删除位置错
     else
     {
 	 for(int j=i;j<ArrayLength-1;j++) //前移 
 	 {
               array[j]=array[j+1];
 	 }
 	 ArrayLength--;      		  //数组长度减1 
 	 return TRUE; 
     }
}  

数组的应用

集合的并运算(将两个数组合并为一个数组)
template <class T>
void Union(Array<T> &Va,Array<T> &Vb)
{
    //把数组Vb合并到Va中,重复元素只留一个
    int n=Va.GetLength();
    int m=Vb.GetLength();
    for(int i=0;i<m;i++)
    {
        T x=Vb.Getnode(i)	//从Vb中取一元素
        int k=Va.Find(x);	//在Va中查找同值元素
        if(k==-1)		//若找不到同值元素
        {
            Va.Insert(x,n);	//则插入到Va的最后
            n++;
        }
    }
}
集合的交运算
template <class T>
void Intersection(Array<T> &Va,Array<T> &Vb)
{
    //求Va和Vb中的相同元素,存入Vb
    int n=Va.GetLength();
    int m=Vb.GetLength();
    int i=0;
    while(i<m)
    {
        T x=Vb.Getnode(i) //从Vb中取一元素
        int k=Va.Find(x); //在Va中查找同值元素
        if(k==-1)	  //若找不到等值元素
        {
            Vb.Remove(i); //则从Vb中删去该元素
            m--;
        }
        else		  //否则,在Vb中保留该元素
        {
            i++;
        }
    }
}
约瑟夫问题

设n个人围成一个圆圈,按一指定方向,从第s个人开始报数,报数到m为止,报数为m的人出列,然后从下一个人开始重新报数,报数为m的人又出列…,直到所有的人全部出列为止。Josephus问题要对任意给定的n,s和m,求按出列次序得到的人员顺序表。
分析
依初始位置,顺序地给这n个人每个人一个编号(可以是数字的,也可以是符号的)。Josephus问题就是要按报数出列的方法将人员序编号重新排列。将这n个人存入一个数组P中,,某个人出列即把对应的数组元素从数组中删除。每删去一个数组元素后就将后面的所有元素前移,同时把这个删去的元素插到数组最后的位置上,然后对前n-1个数组元素重复上述过程。
当数组P中所有的元素都删去一次后,数组P中存放的就是报数出列的人员顺序。

//模拟Josephus问题求解
void Josephus(Array<int>&P,int n;int s;int m)
{
    //将人员编号存入数组P中
    int k=1;
    for(int i=0;i<n;i++)
    {
  	P.Insert(k,i);
  	k++;
    } 
    int s1=s;
    for(int j=n;j>=1;j--)
    {
  	s1=(s1+m-1)%j;
  	if(s1==0)
  	{
            s1=j;
  	} 
  	int w=P.Getnode(s1-1);
  	P.Remove(s1-1);
  	P.Insert(w,n-1);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【执珪】瑕瑜·夕环玦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值