一、实验目的
巩固线性表的数据结构的存储方法和相关操作,
学会针对具体应用,
使用线性表的相关知识来解决具体问题。
二、实验内容
建立一个由n个学生成绩的顺序表,
n的大小由自己确定,
每一个学生的成绩信息由自己确定,
实现数据的对表进行插入、删除、查找等操作。分别输出结果。
三 、实验步骤
1、依据实验内容分别说明实验程序中用到的数据类型的定义;
2、相关操作的算法表达;
3、完整程序;4、总结、运行结果和分析。
5、总体收获和不足,疑问等。
四、实验算法(参考书本第43~45页)
1、采用C++的模板机制
const int MaxSize=100; //100只是示例数据,可以根据实际问题具体定义
template<class DataType>
struct Node
{
DataType data; //DataType 表示不确定的数据类型
int next; //指针域,注意不是指针类型
};
template<class DataType>
class static_LinkList
{
public:
static_LinkList();
static_LinkList(DataType a[],int n);
~static_LinkList(){};
void Insert(int i,int x);
int Locate(DataType x);
DataType Delete(int i);
void PrintList();
private:
Node<DataType>data[MaxSize];
int frist;
int avail;
};
2、
新建static_linklist类声明
template<class DataType>
static_LinkList<DataType>::static_LinkList()
{
frist=0;
avail=0;
data[0].next=-1;
for(int i;i<MaxSize-1;i++)
{
data[i].next=i+1;
}
data[MaxSize-1].next=-1;
}
template<class DataType>
static_LinkList<DataType>::static_LinkList(DataType a[],int n)
{
int s;
if(n>=MaxSize||n<=0)
{
throw"位置";
}
frist=0;
data[0].next=avail=1;
for(int i=0;i<MaxSize-1;i++)
{
data[i].next=i+1;
}
data[MaxSize-1].next=-1;
for(int i=0;i<n;i++)
{
s=avail;
data[s].data=a[i];
avail=data[avail].next;
}
data[s].next=-1;
}
3、插入
template<class DataType>
void static_LinkList<DataType>::Insert(int i,int x)
{
int s;
s=avail;
avail=data[avail].next;
data[s].data=x;
for(int p=0;p<MaxSize-1;p++)
{
if(p==i)
{
data[s].next=data[p].next;
data[p].next=s;
}
}
}
4、删除
template<class DataType>
DataType static_LinkList<DataType>::Delete(int i)
{
if(i>0&&i<MaxSize)
{
int q;
i=i-1;
q=data[i].next;
data[i].next=data[q].next;
data[q].next=avail;
avail=q;
return data[q].data;
}
else
{
throw"位置";
}
}
5、定义
template<class DataType>
int static_LinkList<DataType>::Locate(DataType x)
{
int count;
count=data[frist].next;
for(count;count!=-1;count++)
{if(data[count].data==x)
{
return count;
}
}
return 0;
}
template<class DataType>
void static_LinkList<DataType>::PrintList()
{
int p;
p=data[frist].next;
while(p!=-1)
{
cout<<data[p].data<<endl;
p=data[p].next;
}
}
6、主函数
int main()
{
int r[5]={87,68,74,90,80};
static_LinkList<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>
using namespace std;
const int MaxSize=100;
template<class DataType>
struct Node
{
DataType data;
int next;
};
template<class DataType>
class static_LinkList
{
public:
static_LinkList();
static_LinkList(DataType a[],int n);
~static_LinkList(){};
void Insert(int i,int x);
int Locate(DataType x);
DataType Delete(int i);
void PrintList();
private:
Node<DataType>data[MaxSize];
int frist;
int avail;
};
template<class DataType>
static_LinkList<DataType>::static_LinkList()
{
frist=0;
avail=0;
data[0].next=-1;
for(int i;i<MaxSize-1;i++)
{
data[i].next=i+1;
}
data[MaxSize-1].next=-1;
}
template<class DataType>
static_LinkList<DataType>::static_LinkList(DataType a[],int n)
{
int s;
if(n>=MaxSize||n<=0)
{
throw"位置";
}
frist=0;
data[0].next=avail=1;
for(int i=0;i<MaxSize-1;i++)
{
data[i].next=i+1;
}
data[MaxSize-1].next=-1;
for(int i=0;i<n;i++)
{
s=avail;
data[s].data=a[i];
avail=data[avail].next;
}
data[s].next=-1;
}
template<class DataType>
void static_LinkList<DataType>::Insert(int i,int x)
{
int s;
s=avail;
avail=data[avail].next;
data[s].data=x;
for(int p=0;p<MaxSize-1;p++)
{
if(p==i)
{
data[s].next=data[p].next;
data[p].next=s;
}
}
}
template<class DataType>
DataType static_LinkList<DataType>::Delete(int i)
{
if(i>0&&i<MaxSize)
{
int q;
i=i-1;
q=data[i].next;
data[i].next=data[q].next;
data[q].next=avail;
avail=q;
return data[q].data;
}
else
{
throw"位置";
}
}
template<class DataType>
int static_LinkList<DataType>::Locate(DataType x)
{
int count;
count=data[frist].next;
for(count;count!=-1;count++)
{if(data[count].data==x)
{
return count;
}
}
return 0;
}
template<class DataType>
void static_LinkList<DataType>::PrintList()
{
int p;
p=data[frist].next;
while(p!=-1)
{
cout<<data[p].data<<endl;
p=data[p].next;
}
}
int main()
{
int r[5]={87,68,74,90,80};
static_LinkList<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;
}
六、实验运行结果
七、实验总结和心得
静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表的指针。
运用s=avail可以不用申请新结点,而是利用空闲链的第一个结点。
在插入和删除操作时,只需要修改游标,不需要移动表中的元素,
从而改进了在顺序表中
插入和删除操作需要移动大量元素的缺点。