实验2.5 运用间接寻址实现对数据的基本操作

一、实验目的

巩固线性表的数据结构的存储方法和相关操作,

学会针对具体应用,

使用线性表的相关知识来解决具体问题。

二、实验内容

建立一个由n个学生成绩的顺序表,
n的大小由自己确定,
每一个学生的成绩信息由自己确定,
实现数据的对表进行插入、删除、查找等操作。分别输出结果。
三 、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义;

2、相关操作的算法表达;

3、完整程序;

4、总结、运行结果和分析。

5、总体收获和不足,疑问等。

四、实验算法(参考书本第45页)

1、采用C++的模板机制

const int MaxSize=100;
template<class DataType>
struct Node
{
	DataType data;
};
 
 template<class DataType>
 class indirectaddressLink
 {
 	public:
 		indirectaddressLink(DataType a[],int n);
		~indirectaddressLink(){};
 		void Insert(int i,int x);
 		int Locate(DataType x);
 		DataType Delete(int i);
 		void PrintList();
 	private:
 		Node<DataType>*address[MaxSize];
		int length;
 };

2、新建indirectaddressLink类声明

template<class DataType>
 indirectaddressLink<DataType>::indirectaddressLink(DataType a[],int n)
 {
 	for(int i=0;i<n;i++)
 	{
 		address[i]=new Node<DataType>;
 		address[i]->data=a[i];
	 }
	 length=n;
 }

3、插入

template<class DataType>
void indirectaddressLink<DataType>::Insert(int i,int x)
{
	if(i<=length&&i>0)
	{
		for(int j=length;j>=i;j--)
		{
			address[j]=address[j-1];
		}
		address[i-1]->data=x;
		length++;}
	else{
	throw"位置";
	}
 } 

4、删除

template<class DataType>
DataType indirectaddressLink<DataType>::Delete(int i)
{
	if(i<=length&&i>=0)
	{
		int x=address[i-1]->data;
		for(int j=i;j<length;j++)
		{
			address[j-1]=address[j];
		}
		length--;
		return x;
	}
	else
	{
	throw"位置";
	}
}

5、定义

 template<class DataType>
  int indirectaddressLink<DataType>::Locate(DataType x)
  {
  	int i=0;
  	for(i;i<length;i++)
  	{
  		if(address[i]->data==x)
  		{return i+1;
		}
	  }
	  return 0;
  }
 
 template<class DataType>
 void indirectaddressLink<DataType>::PrintList()
 {
 	for(int i=0;i<length;i++)
 	{
 		cout<<address[i]->data<<endl;
	 }
 }

6、主函数

int main()
 {
 	int r[5]={87,68,74,90,80};
 	indirectaddressLink<int>L(r,5);
 	cout<<"执行插入成绩操作前数据为:"<<endl;
 	L.PrintList();
 	try
 	{
 		L.Insert(2,70);
	 }
	 catch(char*s)
	 {
	 	cout<<s<<endl;
	 }
	 cout<<"执行插入成绩操作后数据为:"<<endl;
	 L.PrintList();
	 cout<<"值为74的元素位置为:";
	 cout<<L.Locate(74)<<endl;
	 cout<<"执行删除第一个学生成绩操作前数据为:"<<endl;
	 L.PrintList();
	 try
	 {
	 	L.Delete(1);
	  } 
	  catch(char*s)
	  {
	  cout<<s<<endl;
	  }
	  cout<<"执行删除成绩操作后数据为:"<<endl;
	  L.PrintList(); 
	  return 0;
 }

五、实验代码

#include<iostream>
 #include<string>
 using namespace std;
const int MaxSize=100;
template<class DataType>
struct Node
{
	DataType data;
};
 
 template<class DataType>
 class indirectaddressLink
 {
 	public:
 		indirectaddressLink(DataType a[],int n);
		~indirectaddressLink(){};
 		void Insert(int i,int x);
 		int Locate(DataType x);
 		DataType Delete(int i);
 		void PrintList();
 	private:
 		Node<DataType>*address[MaxSize];
		int length;
 };
 
 template<class DataType>
 indirectaddressLink<DataType>::indirectaddressLink(DataType a[],int n)
 {
 	for(int i=0;i<n;i++)
 	{
 		address[i]=new Node<DataType>;
 		address[i]->data=a[i];
	 }
	 length=n;
 }

template<class DataType>
void indirectaddressLink<DataType>::Insert(int i,int x)
{
	if(i<=length&&i>0)
	{
		for(int j=length;j>=i;j--)
		{
			address[j]=address[j-1];
		}
		address[i-1]->data=x;
		length++;}
	else{
	throw"位置";
	}
 } 
   
template<class DataType>
DataType indirectaddressLink<DataType>::Delete(int i)
{
	if(i<=length&&i>=0)
	{
		int x=address[i-1]->data;
		for(int j=i;j<length;j++)
		{
			address[j-1]=address[j];
		}
		length--;
		return x;
	}
	else
	{
	throw"位置";
	}
}
  
  template<class DataType>
  int indirectaddressLink<DataType>::Locate(DataType x)
  {
  	int i=0;
  	for(i;i<length;i++)
  	{
  		if(address[i]->data==x)
  		{return i+1;
		}
	  }
	  return 0;
  }
 
 template<class DataType>
 void indirectaddressLink<DataType>::PrintList()
 {
 	for(int i=0;i<length;i++)
 	{
 		cout<<address[i]->data<<endl;
	 }
 }
 
 int main()
 {
 	int r[5]={87,68,74,90,80};
 	indirectaddressLink<int>L(r,5);
 	cout<<"执行插入成绩操作前数据为:"<<endl;
 	L.PrintList();
 	try
 	{
 		L.Insert(2,70);
	 }
	 catch(char*s)
	 {
	 	cout<<s<<endl;
	 }
	 cout<<"执行插入成绩操作后数据为:"<<endl;
	 L.PrintList();
	 cout<<"值为74的元素位置为:";
	 cout<<L.Locate(74)<<endl;
	 cout<<"执行删除第一个学生成绩操作前数据为:"<<endl;
	 L.PrintList();
	 try
	 {
	 	L.Delete(1);
	  } 
	  catch(char*s)
	  {
	  cout<<s<<endl;
	  }
	  cout<<"执行删除成绩操作后数据为:"<<endl;
	  L.PrintList(); 
	  return 0;
 }

六、实验运行结果


七、实验总结和心得

间接寻址是将数组和指针结合起来的一种方法,
它将数组中存储数据元素的单元改为存储指向该元素的指针。
实验中删除操作和插入操作其实是类似的。 虽然调试了出来,
可是发现实验结果中原本的数字“68”变成了需要插入的数字“70”。
对于这个错误,暂时找不到原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值