创建学生成绩的间接寻址

一.实验目的 
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。

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

三.源代码

#include<iostream>    
using namespace std;    
    
const int Maxsize = 100;    
    
template<class T>    
struct Node {    
    T data;    
    Node<T> *next;    
};    
    
template<class T>    
class inadd{    
    public:    
        inadd();//无参构造函数    
        inadd(T score[],int n);//有参构造函数    
        virtual ~inadd();//析构函数    
        void print();//遍历操作    
        T get(int i);//按位查找操作    
        int Locate(T x);//按值查找操作    
        void insert(int i,T x);//插入操作    
        T Delete(int i);//删除操作    
        bool changeList(int i, T x);  //改变某一结点的值 i为节点的位置,x为替换的值    
    private:    
        Node<T> *first; //头指针    
        int length; //结点数量    
        Node<T> *address[Maxsize];  //结点指针数组    
};    
    
template<class T>    
inadd<T>::inadd()    
{    
    first=new Node<T>;    
    first->next=NULL;    
}    
    
template<class T>    
inadd<T>::inadd(T score[],int n)    
{    
    if (n > Maxsize) throw("溢出");    
    Node<T> *s;    
    first = new Node<T>;first->next=NULL; //初始化一个空链表      
    for(int i=n-1;i>=0;i--)      
    {      
        s=new Node<T>;s->data=score[i];  //为每个数组元素建立一个结点      
        s->next=first->next;first->next=s;  //将结点s插入头结点之后      
    }    
}    
    
template<class T>    
inadd<T>::~inadd()                 //析构函数      
{    
    Node<T> *q;    
    while(first!=NULL)    
    {    
        q=first;    
        first=first->next;    
        delete q;    
    }    
}      
    
template<class T>        
void inadd<T>::insert(int i,T x)      
{      
    Node<T>*p,*s;int count;      
    p=first;count=0;      
    while(p!=NULL&&count<i-1)      
    {      
        p=p->next;      
        count++;      
    }      
    if(p==NULL)throw"位置非法";    
    s=new Node<T>;s->data=x;    
    s->next=p->next;    
    p->next=s;    
    length++;    
}    
    
template<class T>        
T inadd<T>::Delete(int i)    
{    
    Node<T> *q,*p; T x; int count;      
    p=first;count=0; //注意P指针要指向头结点      
    while(p!=NULL&&count<i-1)   //此操作目的是找到i-1个结点    
    {    
        p=p->next;    
        count++;      
    }    
    if(p==NULL||p->next==NULL)throw"位置";  //结点p不存在或p后继结点不存在    
    else{    
        q=p->next;x=q->data;  //暂存被删结点      
        p->next=q->next;      
        delete q;      
        return x;    
    }    
}      
      
template<class T>        
T inadd<T>::get(int i)      
{    
    Node<T>*p;int count;    
    p=first->next;count=1;    
    while(p!=NULL&&count<i)    
    {p=p->next;count++;}    
    if(p==NULL)throw"位置非法";    
    else return p->data;    
}      
      
template<class T>        
int inadd<T>::Locate(T x)      
        {      
            Node<T>*p;int count =1;      
            p=first->next;      
            while(p!=NULL)      
            {      
                if(p->data==x)return count;      
                p=p->next;      
                count++;      
            }      
            return 0;      
        }      
      
template<class T>        
void inadd<T>::print()      
        {      
            Node<T>*p;      
            p=first->next;      
            while(p!=NULL)      
            {cout<<p->data<<"  ";;      
            p=p->next;      
            }      
        }    
    
void main()      
{      
    float score[5]={55,66,77,88,99};      
    inadd<float>student(score,5);    //创建对象      
    cout<<"学生数据结构成绩"<<endl;        
    student.print();        
    cout<<endl<<endl<<"在位置4插入成绩67,结果如下:"<<endl;        
    student.insert(4,67);        
    student.print();        
    cout<<endl<<endl<<"在位置3删除成绩为:"<<student.Delete(3)<<endl<<"删除后结果如下:"<<endl;        
    student.print();        
    cout<<endl<<endl<<"位置5的成绩为:"<<student.get(5)<<endl;        
    cout<<endl<<endl<<"成绩88所在位置为:"<<student.Locate(88)<<endl;      
}    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值