实验二 单链表实现学生成绩

算法

结构体:用结构体类型来描述单链表的结点,定义了一个数据域和结点指针

无参构造函数:生成头结点,将头结点的指针域置空,生成含头指针的空链表

有参构造函数:用尾插法建立单链表,生成有N个结点的单链表,为每个数组元素建立一个结点,每次将新申请的结点插在终端结点的后面

析构函数:释放结点的存储空间

求长度:设置一个工作指针p和累加器count,当p!=NULL时,指针后移,count加一。

按位查找:设置一个工作指针p和累加器count,当 p!=NULL&&count<i 时,指针后移,count加一。如果p为空值,抛出“位置异常”,否则,返回p的数据域。

按值查找:设置一个工作指针p和累加器count,当p!=NULL时,如果p的数据域为所输入的值x,返回count,指针后移,count加一。

插入:设置一个工作指针p和累加器count,当 p!=NULL&&count<i 时,指针后移,count加一。如果p为空值,抛出“位置异常”,否则,申请一个结点s,其数据域为x,将结点s插入到结点p之后。

删除:设置一个工作指针p和累加器count,当 p!=NULL&&count<i 时,指针后移,count加一。如果p为空值,抛出“位置异常”,否则,创建一个指针q,暂存被删结点,摘链,删除q,返回x。

遍历:设置一个工作指针p,当p!=NULL时,输出p的数据域,指针后移。






源代码

#include
         
         
          
          
using namespace std;

template
          
          
           
           
struct Node
{
	T data;
	Node
           
           
            
             *next;
};

template
            
            
             
             
class Score
{
	public:
		Score();                        //无参构造函数,建立只有头结点的空链表
		Score(T a[],int n);             //有参构造函数,建立有n个元素的单链表
		~Score();                       //析构函数
		int Length();                      //求单链表的长度
		T Get(int i);                      //按位置查找,在单链表中查找第i个结点的元素值
		int Locate(T x);                   //按值查找,在单链表中查找值为x的元素序号
		void Insert(int i,T x);            //在第i个位置插入元素值为x的结点
		T Delete(int i);                   //在单链表中删除第i个结点
		void PrintList();
	private:
		Node
             
             
               *first; }; template 
              
                Score 
               
                 ::Score() { first=new Node 
                
                  ; //生成头结点 first->next=NULL; //头结点的指针域置空 } template 
                 
                   //尾插法建立单链表 Score 
                  
                    ::Score(T a[],int n) { Node 
                   
                     *r,*s; first=new Node 
                    
                      ; r=first; //生成头结点 for(int i=0;i 
                     
                       ;s->data=a[i]; //为每个数组元素建立一个结点 r->next=s;r=s; //将结点S插入到终端结点之后 } r->next=NULL; //单链表建立完毕,将终端结点的指针域置空 } template 
                      
                        Score 
                       
                         ::~Score() { Node 
                        
                          *q; while(first!=NULL) //释放单链表的每一个结点的存储空间 { q=first; //暂存被释放结点 first=first->next; //first指向被释放结点的下一结点 delete q; } } template 
                         
                           void Score 
                          
                            ::Insert(int i,T x) { Node 
                           
                             *p=first,*s; int count=0; while(p!=NULL && count 
                            
                              next; count++; } if(p==NULL) throw"location"; else{ s=new Node 
                             
                               ;s->data=x; s->next=p->next;p->next=s; } } template 
                              
                                T Score 
                               
                                 ::Delete(int i) { Node 
                                
                                  *p=first,*q; T x; int count=0; while(p!=NULL && count 
                                 
                                   next; count++; } if(p==NULL||p->next==NULL) throw"location"; else{ q=p->next;x=q->data; p->next=q->next; delete q; return x; } } template 
                                  
                                    int Score 
                                   
                                     ::Locate(T x) { Node 
                                    
                                      *p=first->next; int count=1; while(p!=NULL) { if(p->data==x) return count; p=p->next; count++; } return 0; } template 
                                     
                                       void Score 
                                      
                                        ::PrintList() { Node 
                                       
                                         *p=first->next; while(p!=NULL) { cout< 
                                        
                                          data<<" "; p=p->next; } cout< 
                                         
                                           int Score 
                                          
                                            ::Length() { Node 
                                           
                                             *p; int count; p=first->next;count=0; while(p!=NULL) { p=p->next; count++; } return count; } template 
                                            
                                              T Score 
                                             
                                               ::Get(int i) { Node 
                                              
                                                *p; int count; p=first->next;count=1; while(p!=NULL&&count 
                                               
                                                 next; count++; } if(p==NULL)throw"location"; else return p->data; } int main() { cout<<"\t ******************学生成绩单链表的实现**************\n"; cout<<"\t ****************************************************\n"; cout<<"\t *------------------------------------------*********\n"; cout<<"\t *****************[1]——输出表长********************\n"; cout<<"\t *****************[2]——按位查找********************\n"; cout<<"\t *****************[3]——按值查找********************\n"; cout<<"\t *****************[4]——插入************************\n"; cout<<"\t *****************[5]——删除************************\n"; cout<<"\t *****************[6]——遍历************************\n"; cout<<"\t *****************[7]——输出主菜单******************\n"; cout<<"\t *****************[8]——退出************************\n"; cout<<"\t *------------------------------------------*********\n"; cout<<"\t ****************************************************\n"; int a[]={34,45,56,67,78,83,89,90,95}; Score 
                                                
                                                  s(a,9); int flag,i,x,t,l; flag=0; while(flag==0) { cout<<"please input the command(1~8):"< 
                                                 
                                                   >t; switch(t) { case 1: l=s.Length(); cout<<"the length is:"< 
                                                  
                                                    < 
                                                   
                                                     >i; x=s.Get(i); cout<<"the number is:"< 
                                                    
                                                      < 
                                                     
                                                       >x; i=s.Locate(x); cout<<"the location is:"< 
                                                      < 
                                                       
                                                         >i; cout<<"the insert number is:"; cin>>x; s.Insert(i,x); cout<<"insert successfully!"< 
                                                        
                                                          >i; s.Delete(i); cout<<"delete successfully!"< 
                                                          
                                                         
                                                        
                                                      
                                                     
                                                    
                                                   
                                                  
                                                 
                                                
                                               
                                              
                                             
                                            
                                           
                                          
                                         
                                        
                                       
                                      
                                     
                                    
                                   
                                  
                                 
                                
                               
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
             
            
            
           
           
          
          
         
         


运行结果:

主界面


输入1,输出表长


输入2,按位查找成绩


输入3,按成绩查找位置


输入6,输出单链表的所有成绩


输入4,将成绩98插入到位置2


输入5,将位于位置5的成绩删除


输入7,输出主界面


输入8,退出程序


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值