一、实验目的
巩固线性表的数据结构的存储方法和相关操作,
学会针对具体应用,
使用线性表的相关知识来解决具体问题。
二、实验内容
建立一个由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”。
对于这个错误,暂时找不到原因。