#include <iostream>
using namespace std;
const int M=100;
struct SNode
{
int data;
int next;
}SList[M];
class Student
{
public:
Student();
Student(int a[],int n);
~Student();
int Length(); //表长
int Locate(int x); //按值查找
void Input(int i,int x); //插入
int Delete(int i); //删除
void Print(); //遍历操作
private:
int first,avail;
};
Student::Student()
{
for(int i=0;i<M-1;i++)
SList[i].next=i+1; //结点的next域指向下一节点
SList[M-1].next=0; //目前静态链表为空,最后一个元素的next为0;
}
Student::Student(int a[],int n)
{
if(n<0||n>M)
throw"输入错误";
for(int i=0;i<M;i++)
{
SList[i].next=i+1;
}
SList[M-1].next=-1;
first=0;
avail=1;
SList[first].next=-1;
for(int j=0;j<n;j++)
{
int s=avail; //空闲链的第一个结点
avail=SList[avail].next; //空闲链的头指针后移
SList[s].data=a[j]; //将数组填入下标为s的结点
SList[s].next=SList[first].next; //将下标为s的结点插入到下一个结点
SList[first].next=s;
}
}
Student::~Student()
{}
int Student::Length()
{
if(SList[1].next==0)
return 0;
int i=1;
int count=-1;
while(i!=0)
{
count++;
i=SList[i].next;
}
return count;
}
int Student::Locate(int x)
{ if(SList[first].next==-1)
throw"成绩为空";
int p=first,count=0;
while(SList[p].next!=-1)
{
if(SList[p].data==x) return count;
p=SList[p].next;
count++;
}
return 0;
}
void Student::Input(int i,int x)
{
if(i<0||i>M)
throw"参数非法";
int s=avail;
int p=first;
if(p==-1)
throw"参数非法"; //空链
for(int count=0;count<i-1;count++)
{
p=SList[p].next;
}
avail=SList[avail].next; //空闲链的头指针后移
SList[s].data=x; //将x填入下标为s的结点
SList[s].next=SList[p].next; //将下标为s的结点插到下标为p的结点后面
SList[p].next=s;
}
int Student::Delete(int i)
{if(i<0||i>M)
throw"参数非法";
int p=first;
if(p==-1)
throw"参数非法";//空链
for(int count=0;count<i-1;count++)
{
p=SList[p].next;
}
int q=SList[p].next; //暂存被删结点的下标
SList[p].next=SList[q].next; //摘链
SList[q].next=avail; //将结点q插在空闲链avail的最前端
avail=q; //空闲链头指针avail指向结点q
return 0;
}
void Student::Print()
{int p=SList[first].next;
while(p!=-1)
{ cout<<"第"<<p<<"个学生成绩:"<<SList[p].data<<endl;
p=SList[p].next;
}
cout<<endl; }
void main()
{int i;
int r[5]={80,90,70,60,50};
Student L(r,5);
cout<<"录入学生信息:"<<endl;
L.Print();
cout<<endl;
cout<<"在第2个位置插入85"<<endl;
L.Input(2,85);
cout<<"插入后学生成绩为:"<<endl;
L.Print();
cout<<endl;
cout<<"学生成绩为85的位置:"<<endl;
cout<<L.Locate(85)<<endl;
cout<<"删除第一个学生成绩"<<endl;
L.Delete(1);
cout<<"删除后学生成绩为:"<<endl;
L.Print();}