学生课堂经验值管理系统

#include <iostream>
#include <string>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;






typedef struct LNode{   //单链表的存储结构 
	 string no;
	string name;
	int jyz;  //结点的数据域 
	struct LNode *next; //结点的指针域 
}LNode,*Linklist;       //Linklist为指向结构体LNode的指针类型
Status Initlist_L(Linklist &L)//构造一个空的单链表L 
{
	L=new LNode; 
	L->next=NULL;
	return OK;
}
//导入文件建学生经验值表 
//后插法创建单链表
void Createlist_L(Linklist &L,int n)
{   LNode *p,*r;
	L=new LNode;
	L->next=NULL;
	r=L;//尾指针指向头结点
	cout<<"请输入学生的学号、姓名、经验值:\n"; 
	for(int i=0;i<n;i++)
	{
		p=new LNode;
		cin>>p->no;
		cin>>p->name;
		cin>>p->jyz;
		cout<<endl; 
		p->next=NULL;//插入到表尾 
		r->next=p;
		r=p;//r指向新的尾结点 
	} 
}
//插入学生
void Linkinsert_L(Linklist &L,string no1,string name1,int c)
{   LNode *p,*s;
    
    p=L;
	while(p)
	{   if(!(p->next))
	         break;
        else
		    p=p->next;
		
	}
	 
	s=new LNode;  
	s->no=no1;   
	s->name=name1;
	s->jyz=c;
	s->next=NULL;
	p->next=s;
	cout<<"插入成功!\n";
	
} 
//删除学生 
void Listdelete_L(Linklist &L,int d,string key)
{   int flag=0; 
    LNode *p,*q=new LNode;//在这里不能只写LNode *p;
	               //因为后面delete p;(当p不存在时会出错)
				   //因为p还没有分配空间 
    
	p=L;
	switch(d)
	{
		
	    case 1:
		{    //按学号查找 
            while(p)
            {   
            	if(p->next)
            	{   if(p->next->no==key)
				    {
    				  	q=p->next;
					   p->next=q->next;
					   flag=1;
					   break;
    				}
					
            	}
            	
	            p=p->next;
            }
            string s;
            s=flag==1?"成功删除"+q->name+"的所有信息!":"没有找到学号为"+key+"的学生的信息!";
			cout<<s<<endl;
			delete q;
			break;
		}
		case 2://按姓名查找 
		{
			while(p)
			{
				if(p->next)
				{
				    if(p->next->name==key)
					{
						q=p->next;
						p->next=q->next;
						flag=1;
						break;
					}	
				}
				
                p=p->next;
			}
			string s;
			s=flag==1?"成功删除"+q->name+"的所有信息!":"没有找到"+key+"的信息!";
			cout<<s<<endl;
			delete q;
			break; 
		}
		default:
		    break;
	}
}
//显示全部学生的信息						  
void presentstudent(Linklist L)
{
	LNode *p;
	p=L->next;
	int num=0;
	cout<<"学号"<<"姓名"<<"经验值"<<endl; 
	while(p)
	{ 
         cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl;
		 p=p->next;num++; 
	}
	cout<<"已显示出所有学生的信息,总共有"<<num<<"个学生!"<<endl; 
	
}            
//为某学号学生加指定经验值
void Jiajyz(Linklist &L, string no1,int jyz2)

{   
    LNode *p;
	p=L->next;
	while(p&&p->no!=no1) 
	{ 
	    p=p->next;
    }
	if(!p)
	{
		cout<<"该学号不存在!\n";
	}  
	else
	{ p->jyz=p->jyz+jyz2;
	  cout<<"成功为"<<p->no<<"同学增加经验值"<<jyz2<<endl; 
	  cout<<"现该学生的信息如下:\n";
	  cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl; 
	}
}

//为某学号学生减指定经验值
void Jianjyz(Linklist &L, string no2,int jyz2)

{   
    LNode *p;
	p=L->next; 
	while(p&&p->no!=no2) 
	{ 
	    p=p->next;
    }
	if(!p)  
	{
		cout<<"该学号不存在!\n";
	}
	else{
		p->jyz=p->jyz-jyz2;
		cout<<"成功为"<<p->no<<"同学减去经验值"<<jyz2<<endl; 
	    cout<<"该学生的信息如下:\n";
	    cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl; 
	
	}
	
}
// 按姓名查找学生经验值
LNode *Locatename_L(Linklist L,string name1)
{   LNode *p;
	p=L->next;
	while(p&&p->name!=name1)
	   p=p->next; 
    if(!p)
    {
    	cout<<"该学生不存在!"<<endl; 
    }
    else{
        cout<<"该学生的经验值如下:\n";
		cout<<p->no<<" "<<p->name<<" "<<p->jyz<<endl; 
    }
}


//求经验值最高的学生信息
 
void GetHighest(Linklist L)
{
	LNode *Biger=new LNode;//最大的那个数
	LNode *B=new LNode;
	LNode *p=new LNode; 
	p=L->next;
	Biger->jyz=p->jyz;
	Biger->name=p->name;
	Biger->no=p->no;
	Biger->next=NULL;
	while(p)//寻找最高的经验值 
	{
		if(p->next)
		{
			p=p->next;
			if(p->jyz>Biger->jyz)
			{
				Biger->jyz=p->jyz;
				Biger->name=p->name;
				Biger->no=p->no;
				Biger->next=NULL;
			}
		}
		else
			break;
	}
	p=L->next;
	B=Biger;
	while(p)//最高经验值不止一个学生的时候 
	{
		if(p->jyz==Biger->jyz)
		{
			LNode *t=new LNode;
			t->jyz=p->jyz;
			t->name=p->name;
			t->no=p->no;
			t->next=NULL;
			B->next=t;
			B=B->next;
		}
		p=p->next;
	}
	Biger=Biger->next;
	while(Biger)
	{
		cout<<"学号 "<<"姓名 "<<"经验值"<<endl;
		cout<<Biger->no<<" "<<Biger->name<<" "<<Biger->jyz<<" "<<endl;
		Biger=Biger->next;
	}
}
int main()
{   int choose,n1,jyz2,mode;
    string no2,name2,key1;
    
    LNode *p,*la;
	cout<<"	***************************************"<<endl;
	cout<<"*          1-------建立学生经验值表       *"<<endl;
	cout<<"*          2-------输入所有学生的信息           *"<<endl; 
	cout<<"*          3-------插入学生                     *"<<endl;
	cout<<"*          4-------删除学生                     *"<<endl;
	cout<<"*          5-------显示全部学生信息             *"<<endl;
	cout<<"*          6-------为某学号学生加指定经验值     * "<<endl;
	cout<<"*          7-------为某学号学生减指定经验值     *"<<endl;
	cout<<"*          8-------按姓名查找学生经验值         *"<<endl;
	cout<<"*          9-------求经验值最高的学生信息       *"<<endl;
	cout<<"*          0-------存盘并退出                   *"<<endl;
	cout<<"***************************************"<<endl;
	
	choose=-1;
	while(choose!=0)
	{
		cout<<"请选择:";
		cin>>choose;
		switch(choose)
		{
			case 1:
			    if(Initlist_L(la))
			        cout<<"成功建立学生经验值表!\n\n";
                break;
            case 2:
                cout<<"请输入要学生的个数:";
				cin>>n1;
				Createlist_L(la,n1);
				cout<<"成功学生经验值表!"<<endl<<endl;
				break; 
            
            
			case 3:
			     cout<<"请分别输入要插入的学生的学号、姓名、经验值\n";
			     cin>>no2>>name2>>jyz2; 
				 Linkinsert_L(la,no2,name2,jyz2);
				     
				break;
			case 4:
			    { string Key1;
					cout<<"请选择删除方式:"<<endl;
					cout<<"1:按学号删除"<<endl;
					cout<<"2:按姓名删除"<<endl;
					cout<<"请选择1或2"<<endl;
					cin>>mode;
					if(mode==1||mode==2)
					{
						string s=mode==1?"请输入要删除学生的学号!":"请输入要删除学生的姓名!";
						cout<<s<<endl;
						cin>>key1;
						Listdelete_L(la,mode,key1);
						 
					}
					else
					{
						cout<<"请输入合法数字!"<<endl;
					}
					break;
				}
            case 5:
		    {
    			presentstudent(la);
    			break;
    		}
    		case 6:
    		{   cout<<"请输入学生的学号:"; 
			    cin>>no2;
		    	cout<<"请输入要增加的经验值:";
                cin>>jyz2;
                Jiajyz(la,no2,jyz2);
                break;
		    }
		    case 7:
		    {   cout<<"请输入学生的学号:";
			    cin>>no2; 
    			cout<<"请输入要减少的经验值:";
                cin>>jyz2;
                Jianjyz(la,no2,jyz2);
				break; 
    		}
    		case 8:
    		{
		    	cout<<"请输入要查找的学生:";
		    	cin>>name2;
		    	Locatename_L(la,name2);
		    	break;
    		}
    		case 9:
    		{
		    	GetHighest(la);
				break; 
		    }
		    default:
		        break;
			     
		}
		
	}
	return 0;
} 
				  
				   
				    
		
	
	 
  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值