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

  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 }
原文地址:https://www.cnblogs.com/Lee-geeker/p/3360450.html