您的位置:首页 > 其它

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

2017-10-15 20:56 609 查看
一、实验目的

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

学会针对具体应用,

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

二、实验内容

建立一个由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”。
对于这个错误,暂时找不到原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: