用链表做一个学生管理系统

  //Student.cpp
#include<iostream>   using  namespace  std;
   struct  Stu
{
     char  no[10];
     char  name[16];
     int  math;
     int  chi;
     double  ave;
};
   class  Student
{ public :
     Stu st;
     Student * next; public :
     Student(){}
     Student(Stu s)
     {
         st=s;
         next=NULL;
         st.ave=(st.math+st.chi)/2.0;
     }
     void  setst(Stu s)
     {
         st=s;
         st.ave=(st.math+st.chi)/2.0;
     }
     Stu getst()
     {
         return  st;
     }
     void  show()
     {
         cout<< "----------------------------" <<endl;
         cout<< "学号:" <<st.no<<endl;
         cout<< "姓名:" <<st.name<<endl;
         cout<< "数学成绩:" <<st.math<<endl;
         cout<< "语文成绩:" <<st.chi<<endl;
         cout<< "平均成绩:" <<st.ave<<endl;
         cout<< "----------------------------" <<endl;
     }
};
   
   
   
   //main.cpp
#include<fstream>
#include"Student.cpp"   using  namespace  std;
   
Student * create_List(); void  traverse_List(Student * pHead); bool  is_empty(Student * pHead); int  length_List(Student * pHead); bool  insert_List(Student * pHead, int  position,Stu st); bool  delete_List(Student * pHead, int  position,Stu * st); void  sort_List(Student * pHead);  void  menu_select(); void  handle_menu( int  s); void  outFile();
Student * inFile(); void  delFile();
   
Student * pHead;
   
   void  main()
{
     menu_select();
}
   void  menu_select()
{
     int  s;
     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<<endl;
     cout<< "左边数字对应功能选择,请选择1-9:" ;
     cin>>s;
     handle_menu(s);
}
   void  handle_menu( int  s)
{
     switch  (s)
     {
     case  1:
         {
            system ( "cls" );
            pHead=create_List();
            system ( "cls" );
            menu_select();
            break ;
         }
     case  2:
         {
            if (NULL==pHead)
            {
                cout<< "记录总条数为零" <<endl;
                getchar ();
                getchar ();
                system ( "cls" );
                menu_select();
            }
            system ( "cls" );
            sort_List(pHead);
            traverse_List(pHead);
            getchar ();
            getchar ();
            system ( "cls" );
            menu_select();
            break ;
         }
     case  3:
         {
            if (pHead!=NULL)
            {
                system ( "cls" );
                outFile();
                system ( "cls" );
                menu_select();
            }
            system ( "cls" );
            menu_select();
            break ;
         }
     case  4:
         {
            system ( "cls" );
            pHead=inFile();
            system ( "cls" );
            menu_select();
            break ;
         }
     case  5:
         {
            system ( "cls" );
            delFile();
            system ( "cls" );
            menu_select();
            break ;
         }
     case  6:
         {
            if (NULL==pHead)
            {
                cout<< "记录总条数为零" <<endl;
                getchar ();
                getchar ();
                system ( "cls" );
                menu_select();
            }
            system ( "cls" );
            int  num;
            Stu st;
            traverse_List(pHead);
            cout<< "您想在哪条记录后插入,请输入序号:" ;
            cin>>num;
            cout<< "编辑要插入的记录:" <<endl;
            cout<< "学号:" ;
            cin>>st.no;
            cout<< "姓名:" ;
            cin>>st.name;
            cout<< "数学成绩:" ;
            cin>>st.math;
            cout<< "语文成绩:" ;
            cin>>st.chi;
            if (insert_List(pHead,num-1,st))
            {
                cout<< "插入成功!" <<endl;
            }
            else
            {
                cout<< "插入失败!" <<endl;
            }
            getchar ();
            getchar ();
            system ( "cls" );
            menu_select();
            break ;
         }
     case  7:
         {
            if (NULL==pHead)
            {
                cout<< "记录总条数为零" <<endl;
                getchar ();
                getchar ();
                system ( "cls" );
                menu_select();
            }
            int  num;
            Stu * st=(Stu *) malloc ( sizeof (Stu));
            traverse_List(pHead);
            cout<<endl<< "请输入您要删除的记录的序号:" ;
            cin>>num;
            if (delete_List(pHead,num,st))
            {
                cout<<endl<< "成功删除的记录如下:" <<endl;
                cout<< "学号:" <<st->no<<endl<< "姓名:" <<st->name<<endl;
            }
            else
            {
                cout<< "删除失败!" <<endl;
            }
            getchar ();
            getchar ();
            system ( "cls" );
            menu_select();
            break ;
         }
     case  8:
         {
            if (NULL!=pHead)
            {
                system ( "cls" );
                cout<< "记录总条数:" <<length_List(pHead)<< "条" <<endl;
                getchar ();
                getchar ();
                system ( "cls" );
                menu_select();
            }
            else
            {
                cout<< "记录总条数为零" <<endl;
                getchar ();
                getchar ();
                system ( "cls" );
                menu_select();
            }
            break ;
         }
     case  9:
         {
            system ( "cls" );
            cout<< "成功退出!" <<endl;
            exit (0);
            break ;
         }
     }
}
   
   void  delFile()
{
     ofstream fileout;
     fileout.open( "c:\\kcsj.txt" ,ios_base::out);
     fileout<< "" ;
     fileout.close();
}
   
   
Student * inFile()
{
     Student * pHead=(Student *) malloc ( sizeof (Student));
     if (NULL==pHead)
     {
         cout<< "分配失败,程序终止!" <<endl;
         exit (0);
     }
     Student * pTail=pHead;
     pTail->next=NULL;
     ifstream in( "c:\\kcsj.txt" );
     if  (!in.is_open())
     {
         cout <<  "Error opening file" <<endl; 
         exit (0);
     }
     while  (!in.eof())
     {
         Stu st;
         in.read( reinterpret_cast < char  *>(&st),  sizeof (st));
         if  (in.fail()) 
         {
            break ;
         }
         Student * pNew= new  Student();
         if (NULL==pNew)
         {
            printf ( "分配失败,程序终止\n" );
            exit (0);
         }
         pNew->setst(st);
         pTail->next=pNew;
         pNew->next=NULL;
         pTail=pNew;
     }
     in.close();
     return  pHead;
}
   
   void  outFile()
{
     ofstream out;
    out.open( "c:\\kcsj.txt" ,ios_base::out|ios_base::app|ios::binary);
     if (!out)
     {
         cout<< "文件不存在,退出时别忘记保存文件!" <<endl;
         out.close();
         out.open( "stu.dat" ,ios_base::out|ios::binary);
     }
     else
     {  
         out.close();
        out.open( "c:\\kcsj.txt" ,ios_base::out|ios_base::app|ios::binary);
     }
     Student * temp=pHead->next;
     while (temp!=NULL)
     {
         Stu st=temp->getst();
         out.write( reinterpret_cast < char  *>(&st),  sizeof (st));
         temp=temp->next;
     }   
     out.close();
}
   
Student * create_List()
{
     int  len;
     Student * pHead=(Student *) malloc ( sizeof (Student));
     if (NULL==pHead)
     {
         cout<< "分配失败,程序终止!" <<endl;
         exit (0);
     }
     Student * pTail=pHead;
     pTail->next=NULL;
     cout<< "请输入要存储的学生人数:" ;
     cin>>len;
     for ( int  i=0;i<len;i++)
     {
         Stu st;
         cout<< "请输入第" <<i+1<< "个学生的学号:" ;
         cin>>st.no;
         cout<< "请输入第" <<i+1<< "个学生的姓名:" ;
         cin>>st.name;
         cout<< "请输入第" <<i+1<< "个学生的数学成绩:" ;
         cin>>st.math;
         cout<< "请输入第" <<i+1<< "个学生的语文成绩:" ;
         cin>>st.chi;
         Student * pNew= new  Student();
         if (NULL==pNew)
         {
            printf ( "分配失败,程序终止\n" );
            exit (0);
         }
         pNew->setst(st);
         pTail->next=pNew;
         pNew->next=NULL;
         pTail=pNew;
     }
     return  pHead;
}
   void  traverse_List(Student * pHead)
{
     int  i=1;
     Student * temp=pHead->next;
     while (temp!=NULL)
     {
         cout<<endl<< "序号:" <<i<<endl;
         temp->show();
         temp=temp->next;
         i++;
     }
}   
   bool  is_empty(Student * pHead)
{
     if (NULL==pHead->next)
     {
         return  true ;
     }
     else
     {
         return  false ;
     }
}
   int  length_List(Student * pHead)
{
     int  len=0;
     Student * temp=pHead->next;
     while (temp)
     {
         len++;
         temp=temp->next;
     }
     return  len;
}
   bool  insert_List(Student * pHead, int  position,Stu st)
{
     int  i=0;
     Student * p=pHead;
   
     while (NULL!=p&&i<position-1)
     {
         p=p->next;
         i++;
     }
     if (i>position-i||NULL==p)
     {
         return  false ;
     }
     Student * pNew=(Student *) malloc ( sizeof (Student));
     if (NULL==pNew)
     {
         cout<< "分配失败,程序终止" <<endl;
         exit (0);
     }
     pNew->setst(st);
     pNew->next=p->next;
     p->next=pNew;
     return  true ;
}
   bool  delete_List(Student * pHead, int  position,Stu * st)
{
     int  i=0;
     Student * p=pHead;
   
     while (NULL!=p->next&&i<position-1)
     {
         p=p->next;
         i++;
     }
     Student * q=p->next;
     *st=q->getst();
     p->next=p->next->next;
     free (q);
     q=NULL;
     return  true ;
}
   void  sort_List(Student * pHead)
{
     Student * p,* q;
     Stu temp;
     int  i,j;
     int  len=length_List(pHead);
     for (i=0,p=pHead->next;i<len-1;i++,p=p->next)
     {
         for (j=i+1,q=p->next;j<len;j++,q=q->next)
         {
            if (q->st.ave>p->st.ave)
            {
                temp=q->st;
                q->st=p->st;
                p->st=temp;
            }
         }
     }   
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值