静态链表来表示学生成绩

#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();}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值