• 【链表+内存池】学生管理系统


      1 #include<iostream>
      2 #include<iomanip>
      3 
      4 using namespace std;
      5 
      6 
      7 typedef struct _DATA_
      8 {
      9     int iAge;
     10     int iGrade;
     11     char szName[20];
     12 }Data,*pData;
     13 
     14 
     15 
     16 typedef struct _NODE_
     17 {
     18     Data DataTemp;
     19     _NODE_* pNext;
     20     
     21 }Node,*pNode;
     22 
     23 
     24 class CList
     25 {
     26 public:
     27     CList()
     28     {
     29         m_pHead = m_pTail = NULL;
     30 
     31         m_iNodeCount = 0;
     32     }
     33     ~CList()
     34     {
     35 
     36     }
     37 
     38     pNode CreateNode(Data DataTemp, CList& CFreeListObj);
     39     void LinkNode(pNode pNodeTemp);
     40 
     41     void RemoveNode(pNode pNodeTemp,CList& CFreeListObj);
     42 
     43     int GetNodeCount();
     44 
     45     bool RecycleNode(pNode pNodeTemp);
     46 
     47     pNode AllocateNode();
     48         
     49     void InitList()
     50     {
     51         m_pHead = m_pTail = NULL;
     52         m_iNodeCount = 0;
     53 
     54     }
     55     
     56     bool DestroyList();
     57     void TravelList()
     58     {
     59         pNode pNodeTemp = m_pHead;
     60         while(pNodeTemp != NULL)
     61         {
     62             cout<<"Name: "<<setw(12)
     63                 <<pNodeTemp->DataTemp.szName<<"  "
     64                 <<"Age: "<<pNodeTemp->DataTemp.iAge<<endl;
     65             pNodeTemp = pNodeTemp->pNext;
     66         
     67         }
     68     }
     69 
     70 /*    void operator = (CList& CListTemp)
     71     {
     72         this->m_pHead = CListTemp.m_pHead;
     73         this->m_pTail = CListTemp.m_pTail;
     74         this->m_iNodeCount = CListTemp.m_iNodeCount;
     75     }
     76 */
     77     friend class CFile;
     78 
     79 private:
     80     pNode m_pHead;
     81     pNode m_pTail;
     82 
     83     int m_iNodeCount;
     84 };
     85 
     86 
     87 
     88 class CFile :public CList
     89 {
     90 public:
     91 
     92     FILE* m_fp;
     93     char m_szFileRoute[256];
     94 
     95     CFile()
     96     {
     97         m_fp = NULL;
     98 
     99         memset(m_szFileRoute,0,sizeof(char)*256);
    100     }
    101 
    102     int  GetFileLen();
    103 
    104     pNode GetHead()
    105     {
    106         return m_pHead;
    107     }
    108 
    109 
    110     void GetFileRoute(char* szRoute);
    111 
    112     void FileRead(char* szRoute,CList& CFreeListObj);
    113 
    114     void FileWrite(char* szRoute,CList& CFreeListObj);
    115 
    116 protected:
    117 private:
    118 };
    119 
    120 int CFile::GetFileLen()
    121 {
    122     
    123     int nLen = 0;
    124     
    125     fseek(m_fp,0L,SEEK_END);   
    126     nLen = ftell(m_fp);   // 获得文件大小
    127     rewind(m_fp);    //再将文件流指针定位开头
    128 
    129     return nLen;
    130 }
    131 
    132 void CFile::GetFileRoute(char* szRoute)
    133 {
    134     strcpy(m_szFileRoute,szRoute);
    135 }
    136 
    137 
    138 void CFile::FileRead(char* szRoute,CList& CFreeListObj)
    139 {
    140     GetFileRoute(szRoute);
    141     
    142     m_fp = fopen(m_szFileRoute,"r");
    143     
    144     if (m_fp==NULL)
    145     {
    146         m_fp = fopen(m_szFileRoute,"w");
    147 
    148         fclose(m_fp);
    149 
    150 
    151         return;
    152         
    153         
    154     }
    155     else  // 代表文件存在
    156     {
    157         
    158         int nLen = GetFileLen();
    159         
    160         if (nLen==0)  // 文件中没有数据
    161         {
    162             
    163             fclose(m_fp);
    164 
    165             return;
    166         }
    167         
    168         else   // 文件有数据
    169         {
    170         
    171 
    172             //
    173 
    174             int i = 0;
    175 
    176             Data DataTemp = {0};
    177             pNode pNodeTemp = NULL;
    178             for (i=0;i<nLen/sizeof(Data);i++)
    179             {
    180 
    181                 fread(&DataTemp,sizeof(Data),1,m_fp);
    182 
    183                 pNodeTemp = CreateNode(DataTemp,CFreeListObj);
    184 
    185                 LinkNode(pNodeTemp);
    186 
    187             }
    188                 
    189             fclose(m_fp);
    190 
    191             return;
    192             
    193         }
    194         
    195     }
    196 }
    197 
    198 void CFile::FileWrite(char* szRoute,CList& CFreeListObj)
    199 {
    200 
    201     GetFileRoute(szRoute);
    202     m_fp = fopen(m_szFileRoute,"w");
    203     pNode pNodeHead = GetHead();
    204     pNode pNodeTemp = pNodeHead;
    205 
    206 
    207     while (pNodeTemp!=NULL)
    208     {
    209         fwrite(&(pNodeTemp->DataTemp),sizeof(Data),1,m_fp);
    210 
    211         pNodeTemp = pNodeTemp->pNext;
    212     }
    213 
    214 
    215     fclose(m_fp);
    216 }
    217 
    218 
    219 
    220 
    221 pNode CList::CreateNode(Data DataTemp, CList& CFreeListObj)
    222 {
    223     pNode pNodeTemp = NULL;
    224 
    225     int iNodeCount = CFreeListObj.GetNodeCount();
    226 
    227     if(iNodeCount > 0)
    228     {
    229         pNodeTemp = CFreeListObj.AllocateNode();
    230         cout<<"FreeList."<<endl;
    231 
    232     }
    233     else
    234     {
    235         pNodeTemp = new Node;
    236     //    cout<<"New."<<endl;
    237     }
    238 
    239 
    240     if(pNodeTemp != NULL)
    241     {
    242         pNodeTemp->DataTemp = DataTemp;
    243         pNodeTemp->pNext = NULL;
    244 
    245 
    246         m_iNodeCount++;
    247 
    248         return pNodeTemp;
    249     }
    250     else
    251     {
    252         return NULL;
    253     }        
    254 }
    255 
    256 
    257 void CList::LinkNode(pNode pNodeTemp)
    258 {
    259 
    260     if(m_pHead == NULL)
    261     {
    262         m_pHead = m_pTail = pNodeTemp;
    263     }
    264     else
    265     {
    266         m_pTail->pNext = pNodeTemp;
    267         m_pTail = pNodeTemp;
    268     }
    269 }
    270 
    271 void CList::RemoveNode(pNode pNodeTemp,CList& CFreeListObj)    
    272 {
    273     if(pNodeTemp == m_pHead)
    274     {
    275         m_pHead = m_pHead->pNext;
    276     }
    277 
    278     else if(pNodeTemp==m_pTail)
    279     {
    280         pNode pNodePre = m_pHead;
    281         while(pNodePre->pNext!=pNodeTemp)
    282         {
    283             pNodePre = pNodePre->pNext;
    284         }
    285 
    286         pNodePre->pNext = NULL;
    287         m_pTail = pNodePre;        
    288     }
    289 
    290     else
    291     {
    292         pNode pNodePre = m_pHead;
    293         while(pNodePre->pNext!=pNodeTemp)
    294         {
    295             pNodePre = pNodePre->pNext;
    296         }
    297 
    298         pNodePre->pNext = pNodeTemp->pNext;    
    299     }
    300 
    301 
    302     m_iNodeCount--;
    303 
    304     if(m_iNodeCount==0)
    305     {
    306         m_pTail = NULL;
    307     }
    308 
    309 
    310     if(!CFreeListObj.RecycleNode(pNodeTemp))
    311     {
    312 
    313         cout<<"Error"<<endl;
    314     }
    315 
    316 }
    317 
    318 int CList::GetNodeCount()
    319 {
    320     if(m_pHead==NULL)
    321     {
    322         return 0;
    323     }
    324 
    325     else
    326     {
    327         return m_iNodeCount;
    328     }
    329 }
    330 
    331 
    332 bool CList::RecycleNode(pNode pNodeTemp)        //头插法
    333 {
    334     if(pNodeTemp!=NULL)
    335     {
    336         pNodeTemp->pNext = m_pHead;
    337 
    338         m_pHead = pNodeTemp;
    339 
    340         m_iNodeCount++;
    341 
    342         return true;
    343     }
    344 
    345     return false;
    346 
    347 }
    348 
    349 pNode CList::AllocateNode()            //从内存池的头部取结点
    350 {
    351     if(m_pHead == m_pTail)
    352     {
    353 
    354         m_pTail = NULL;
    355     }
    356 
    357     pNode pNodeTemp = m_pHead;
    358 
    359     m_pHead = m_pHead->pNext;
    360 
    361     pNodeTemp->pNext = NULL;
    362 
    363     m_iNodeCount--;
    364 
    365     return pNodeTemp;
    366 }
    367 
    368         
    369 bool CList::DestroyList()
    370 {
    371     if(m_pHead == NULL)
    372     {
    373         return false;
    374     }
    375 
    376     pNode pNodeDel = m_pHead;
    377     
    378     while(pNodeDel != NULL)
    379     {
    380         m_pHead = pNodeDel->pNext;
    381 
    382         free(pNodeDel);
    383 
    384         pNodeDel = m_pHead;
    385 
    386         m_iNodeCount--;
    387     }
    388 
    389     return true;
    390 }
    391 
    392 
    393 
    394 
    395 int main()
    396 {
    397 
    398     CList CFreeListObj;
    399 
    400     CFile CStudent[4];
    401 
    402     CFile CGraduated;
    403 
    404     CStudent[0].GetFileRoute("Student1.txt");
    405     CStudent[1].GetFileRoute("Student2.txt");
    406     CStudent[2].GetFileRoute("Student3.txt");
    407     CStudent[3].GetFileRoute("Student4.txt");
    408 
    409     CGraduated.GetFileRoute("Graduation.txt");
    410 
    411     int i = 0;
    412 
    413     CStudent[0].FileRead("Student1.txt",CFreeListObj);
    414     CStudent[1].FileRead("Student2.txt",CFreeListObj);
    415     CStudent[2].FileRead("Student3.txt",CFreeListObj);
    416     CStudent[3].FileRead("Student4.txt",CFreeListObj);
    417     
    418     i = 0;
    419     pNode pNodeTemp = NULL;
    420     bool bOK = true;
    421 
    422     char iMethod = 0;
    423     int iGrade = 0;
    424     int iTemp = 0;
    425 
    426     Data DataTemp = {0};
    427 
    428 
    429     while(bOK)
    430     {
    431         cout<<"┏┅┅┅┅┅┅┅┅┅┅┅┅┅┓"<<endl
    432             <<"┠       学生管理系统       ┨"<<endl
    433             <<"┠           V1.0           ┨"<<endl
    434             <<"┗┅┅┅┅┅┅┅┅┅┅┅┅┅┛"<<endl;
    435         cout<<"┏┅┅┅┅┅┅┅┅┅┅┅┅┅┓"<<endl
    436             <<"┠    1.录入学生信息        ┨"<<endl
    437             <<"┠    2.查看全体学生信息    ┨"<<endl
    438             <<"┠    3.大四学生毕业处理    ┨"<<endl
    439             <<"┠    4.查看毕业学生信息    ┨"<<endl
    440             <<"┠    5.保存学生信息        ┨"<<endl
    441             <<"┠    6.退出管理系统        ┨"<<endl
    442             <<"┗┅┅┅┅┅┅┅┅┅┅┅┅┅┛"<<endl;
    443 
    444         cin>>iMethod;
    445 
    446 
    447         switch(iMethod)
    448         {
    449 
    450         case '1':
    451             cout<<"Input Student's Information:"<<endl;
    452             cout<<"Grade:";
    453             cin>>iGrade;
    454             DataTemp.iGrade = iGrade;
    455             cout<<"Name:";
    456             cin>>DataTemp.szName;
    457             cout<<"Age:";
    458             cin>>DataTemp.iAge;
    459             
    460             
    461             pNodeTemp = CStudent[iGrade-1].CreateNode(DataTemp,CFreeListObj);
    462 
    463             CStudent[iGrade-1].LinkNode(pNodeTemp);    
    464             
    465             switch(iGrade)
    466             {
    467 
    468             case 1:
    469                 CStudent[iGrade-1].FileWrite("Student1.txt",CFreeListObj);
    470                 break;
    471             case 2:
    472                 CStudent[iGrade-1].FileWrite("Student2.txt",CFreeListObj);
    473                 break;
    474             case 3:
    475                 CStudent[iGrade-1].FileWrite("Student3.txt",CFreeListObj);
    476                 break;
    477             case 4:
    478                 CStudent[iGrade-1].FileWrite("Student4.txt",CFreeListObj);
    479                 break;
    480             default:
    481                 break;
    482             }
    483             
    484 
    485             break;
    486     
    487 
    488         case '2':
    489         
    490                 i = 0;
    491                 CStudent[i].InitList();
    492                 CStudent[i].FileRead("Student1.txt",CFreeListObj);
    493                 cout<<"Gread: "<<i+1<<endl;
    494                 cout<<endl
    495                     <<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    496                 CStudent[i++].TravelList();
    497                 cout<<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    498 
    499                 CStudent[i].InitList();
    500                 CStudent[i].FileRead("Student2.txt",CFreeListObj);
    501                 cout<<"Gread: "<<i+1<<endl;
    502                 cout<<endl
    503                     <<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    504                 CStudent[i++].TravelList();
    505                 cout<<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    506 
    507                 CStudent[i].InitList();
    508                 CStudent[i].FileRead("Student3.txt",CFreeListObj);
    509                 cout<<"Gread: "<<i+1<<endl;
    510                 cout<<endl
    511                     <<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    512                 CStudent[i++].TravelList();
    513                 cout<<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    514 
    515                 CStudent[i].InitList();
    516                 CStudent[i].FileRead("Student4.txt",CFreeListObj);
    517                 cout<<"Gread: "<<i+1<<endl;
    518                 cout<<endl
    519                     <<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    520                 CStudent[i++].TravelList();
    521                 cout<<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    522             break;
    523         case '3':
    524 
    525             CGraduated.FileRead("Graduation.txt",CFreeListObj);
    526 
    527             pNodeTemp = CStudent[3].GetHead();
    528 
    529             while(pNodeTemp!=NULL)
    530             {
    531                 CGraduated.CreateNode(pNodeTemp->DataTemp,CFreeListObj);
    532                 CGraduated.LinkNode(pNodeTemp);
    533                 pNodeTemp = pNodeTemp->pNext;
    534             }
    535 
    536             CGraduated.FileWrite("Graduation.txt",CFreeListObj);
    537             CGraduated.DestroyList();
    538 
    539             
    540             CStudent[0].FileWrite("Student2.txt",CFreeListObj);
    541             CStudent[1].FileWrite("Student3.txt",CFreeListObj);
    542             CStudent[2].FileWrite("Student4.txt",CFreeListObj);
    543             CStudent[0].InitList();
    544             CStudent[0].FileWrite("Student1.txt",CFreeListObj);
    545         
    546             break;
    547 
    548         case '4':
    549             cout<<endl
    550                 <<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    551             CGraduated.InitList();
    552             CGraduated.FileRead("Graduation.txt",CFreeListObj);
    553             CGraduated.TravelList();
    554             cout<<"┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅"<<endl;
    555             CGraduated.InitList();
    556             break;
    557 
    558         case '5':
    559 
    560 
    561             CStudent[0].FileWrite("Student1.txt",CFreeListObj);
    562             CStudent[1].FileWrite("Student2.txt",CFreeListObj);
    563             CStudent[2].FileWrite("Student3.txt",CFreeListObj);
    564             CStudent[3].FileWrite("Student4.txt",CFreeListObj);
    565             
    566             system("cls");
    567             break;
    568 
    569         case '6':
    570             
    571             CStudent[0].FileWrite("Student1.txt",CFreeListObj);
    572             CStudent[1].FileWrite("Student2.txt",CFreeListObj);
    573             CStudent[2].FileWrite("Student3.txt",CFreeListObj);
    574             CStudent[3].FileWrite("Student4.txt",CFreeListObj);
    575             
    576             cout<<"Successful Exit."<<endl;
    577             bOK = false;
    578             break;
    579 
    580         default:
    581             cout<<"Input Error. "<<endl;
    582             break;
    583         }
    584 
    585 
    586     }
    587 
    588     return 0;
    589 }
  • 相关阅读:
    排球训练营
    TP5中手机端和PC端判断
    N550JV无法休眠,休眠自动重启的原因及解决方法
    HTML标签全称
    HTML思维导图
    HTML基础
    Web项目流程
    VsCode使用之HTML 中 CSS Class 智能提示
    MyEclipse崩溃 Java was started but returned exit code=-1073740791
    Python 类的特殊成员方法
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3360450.html
Copyright © 2020-2023  润新知