静态链表建立学生成绩

实验内容:     

建立一个由n个学生成绩的顺序表,n的大小由自己确定,每一个学生的成绩信息由自己确定,实现数据的对表进行插入、删除、查找等操作。分别输出结果。 

代码:

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


猜你喜欢

转载自blog.csdn.net/CHENCHWT/article/details/80169575