一、实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。
#include<iostream>
using namespace std;
const int MaxSize=100;
template<typename T>
struct SNode
{
T data;
int next;//指针域,不是指针类型
};
template<typename T>
class SLL
{
public:
SLL();//无参构造函数
SLL(T a[],int n);//带参数的构造函数
virtual ~SLL();//析构函数
void Print();//遍历操作
T Get(int i);//按位查找
int Locate(T x);//按值查找
void Insert(int i,T x);//插入操作
void Delete(int i);//删除操作
private:
SNode<T>snode[MaxSize];//节点
int first;//头指针
int avail;//空闲链
int length;//长度
};
template<typename T>
SLL<T>::SLL(T a[],int n)
{
length=0;
for(int i=0;i<MaxSize;i++)
{
snode[i].next=i+1;
}
snode[MaxSize-1].next=-1;
avail=2;
first=1;
snode[first].next=-1;
for(int j=n-1;j>=0;j--)
{
if(avail==-1)
{
break
}
int s=avail;
avail=snode[avail].next;
snode[s].data=a[j];
snode[s].next=snode[first].next;
snode[first].next=s;
length++;
}
}
template<typename T>
SLL<T>::~SLL()
{
}
template<typename T>
T SLL<T>::Get(int i)
{
if(i<=0||i>length) throw"位置非法";
int p=first;
for(int j=0;j<i;j++)
{
p=snode[p].next;
}
return snode[p].data;
}
template<typename T>
int SLL<T>::Locate(T x)
{
int count=0;
int p=first;
while(snode[p].next!=-1)
{
p=snode[p].next;
if(snode[p].data == x) return count+1;
count++;
}
return -1;
}
template<typename T>
void SLL<T>::Insert(int i, T x)
{
if(i<0||i>length) throw"位置非法";
int p=first;
for(int j=1;j<i;j++)
{ p=snode[p].next; /*或者p=node[p].next*/}
int s =snode[avail].next;
snode[avail].data=x;
snode[avail].next=snode[p].next;
snode[p].next=avail;
avail=s;
length++;
}
template<typename T>
void SLL<T>::Delete(int i)
{
if(i<0||i>length+1) throw"位置非法";
int p=first;
for(int j=1;j<=i;j++)
{ p=snode[p].next; }
int q=snode[p].next;
T e=snode[p].data;
snode[p].next=snode[q].next;
snode[q].next=avail;
avail=q;
length--;
}
void main()
{
}