資料結構實驗一:順序表的建立與操作實現、順序表實現約瑟夫環問題

_lijian_發表於2018-04-01

一、順序表的建立與操作實現:

建立 n 個元素的順序表,實現輸出,插入,刪除,查詢等功能。例項程式碼如下:

#include <iostream>
using namespace std;
const int N=10;
class SeqList{
private:
	int data[N];
	int length;
public:
	SeqList(){length=0;}
	SeqList(int d[],int n);
	~SeqList(){}
	void Insert(int n,int x);
	void Delete(int n);
	void Locate(int x);
	void print();
};
SeqList::SeqList(int d[],int n){
	if (n>=N)
		throw "傳入的引數n超出範圍";
	for (int i=0;i<n;i++)
	{
		data[i]=d[i];
	}
	length=n;
}
void SeqList::Insert(int n,int x){
	if (n>N) throw "上溢";
	if (n<1||n>length+1) throw "插入位置非法";
		for (int i=length;i>=n;i--)
		{
			data[i]=data[i-1];
		}
		data[--n]=x;
		length++;
}
void SeqList::Delete(int n){
	if (length==0) throw "下溢";
	if (n<1||n>length) throw "刪除位置非法";
	for (int i=n;i<length;i++){
		data[i-1]=data[i];
	}
	length--;
}
void SeqList::Locate(int x){
	for (int i=0;i<length;i++){
		if (data[i]==x)
			cout<<"查詢到"<<x<<"這個資料,在第"<<++i<<"位"<<endl;
	}
}
void SeqList::print(){
	for (int i=0;i<length;i++){
		cout<<data[i]<<' ';
	}
	cout<<endl;
}
int main(){
	int a[6]={1,2,6,8,9,5};
	SeqList list(a,6);
	cout<<"初始資料為:"<<endl;
	try {
		list.print();}
	catch(char *s)
	{
		cout<<s<<endl;
	}

	cout<<"在第一個資料處插入5:"<<endl;
	try {
		list.Insert(1,5);}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	list.print();

	cout<<"查詢資料6:"<<endl;
	try {
		list.Locate(6);}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	list.print();

	cout<<"刪除第一個資料:"<<endl;
	try {
		list.Delete(5);}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	list.print();
	return 0;
}


結果截圖:



二、使用順序表實現約瑟夫環問題:

例項程式碼如下:

#include <iostream>
using namespace std;
const int N=100;
class Joseph{
private:
	int a[N];//開闢一個順序表
	int count;//計數器
public:
	Joseph(int n){	
		for (int i=0;i<n;i++)       //給n個人編號
		a[i]=i+1;
	};
	~Joseph(){};
	void Locate(int n,int m,int count);
	void Delete(int n,int i);
};
void Joseph::Locate(int n,int m,int count){
	int k=n;//k儲存總人數
	for (int i=0;i<k;i++){
		static int j=0;//定義j為靜態變數,保持上一次的值
		for (;;j++,count++){
			if (j==n)
				j=0;     //當到第n個人報數後,回到第一個人
			if (count==m){
				cout<<a[j]<<' ';//輸出出圈的編號
				Delete(n,j);//出圈,刪除該位置
				n--;//人數減一
				break;//跳出迴圈
			}	
		}
		count=1;//計數器初始化
	}
}
void Joseph::Delete(int n,int i){
	for (int j=i;j<n-1;j++)
		a[j]=a[j+1];
}
int main (){
	int n,m;
	cout<<"請輸入人數n,密碼m:"<<endl;
	cin>>n>>m;
	Joseph J(n);
	cout<<"出圈的順序為:"<<endl;
	J.Locate(n,m,1);
	return 0;
}


相關文章