数据结构(顺序表)- 数组

采用类的实现方式

数组实现

#include <iostream>
using namespace std;
class Array
{
	int *array;//数组
	int ArraySize,ArrayLength;//数组大小,数组元素个数
public:
	Array(int sz)//进行初始化
	{
		ArraySize = sz;
		ArrayLength = 0;
		array = new int[ArraySize];
	}
	~Array(void)
	{
		delete[] array;
	}
	int GetLength(void)//得到数组的长度
	{
		return ArrayLength;
	}
	int Getnode(int i)//取数组第i个结点
	{
		return (i < 0 || i >= ArrayLength) ? NULL : array[i];
	}
	int find(int &x)//查找结点
	{
		for(int i = 0; i < ArrayLength; i++)
		{
			if(array[i] == x)
			{
				return i;
			}
		}
		return -1;
	}
	bool insert(int x, int i)//插入结点
	{
		if(ArrayLength == ArraySize || i < 0 || i > ArrayLength)
		{
			return false;
		}
		else
		{
			for(int j = ArrayLength - 1; j >= i; j--)
			{
				array[j+1] = array[j];
			}
			array[i] = x;
			ArrayLength++;
			return true;
		}
	}
	bool Remove(int i)//删除第i位元素
	{
		if(ArrayLength == 0 || i < 0 || i > ArrayLength - 1)
		{
			return false;
		}
		else
		{
			for(int j = i; j < ArrayLength - 1; j++)
			{
				array[j] = array[j + 1];
			}
			ArrayLength--;
			return true;
		}
	}
		
};


int main()
{
	Array s1(100);
	s1.insert(6,0);
	cout << s1.Getnode(0);
	return 0;
}

利用数组实现并运算和交运算

并运算 

//如果要用模板T的方式 加上模板即可
void Union(Array &Va, Array &Vb)
{
	//把数组Vb合并成一个数组 
	int n = Va.GetLength();
	int m = Vb.GetLength();
	for(int i = 0; i < m; i++)
	{
		int x = Vb.Getnode(i); // 从Vb中取一个元素
		int k = Va.find(x);//  从Va中查找同值元素
		if (k == -1)
		{
			Va.insert(x,n);//插到Va的最后
			n++;
		}
	}
}

int main()
{
	Array s1(100);
	Array s2(100);
	for(int i = 0; i < 6; i++)
	{
		s1.insert(i,i);
	}
	for(int j = 0; j < 5; j++)
	{
		s2.insert(2+j,j);
	}
	Union(s1,s2);
	for(int i = 0; i < s1.GetLength(); i++)
	{
		cout << s1.Getnode(i) << " ";
	}

	return 0;
}

 在前面的基础上修改main函数和添加void函数即可。

交运算

void Intersection(Array &Va, Array &Vb)
{
	//求Va和Vb中相同的元素,并存入Vb
	int n = Va.GetLength();
	int m = Vb.GetLength();
	int i = 0;
	while(i < m)
	{
		int x = Vb.Getnode(i);//从Vb中取元素
		int k = Va.find(x);//在Va中查找同值元素
		if(k == -1)//找到则保留该元素,否则Vb中删去该元素
		{
			Vb.Remove(i);
			m--;	
		}	
		else
		{
			i++;
		}
	}
}

int main()
{
	Array s1(100);
	Array s2(100);
	for(int i = 0; i < 6; i++)
	{
		s1.insert(i,i);
	}
	for(int j = 0; j < 5; j++)
	{
		s2.insert(2+j,j);
	}
	Intersection(s1,s2);
	for(int i = 0; i < s2.GetLength(); i++)
	{
		cout << s2.Getnode(i) << " ";
	}

	return 0;
}

对约瑟夫问题求解,将n个人存入一个数组P中,出列则将该元素删除。

约瑟夫问题

void JosePhus(Array P, int n, int s, int m)//n个人围成一圈,从第s人开始报数,报到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);//把出列的人放在队伍的最后,所有元素都删除一次后则P存放的就是报数出列的人员顺序
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值