zl程序教程

您现在的位置是:首页 >  后端

当前栏目

5链表的应用--学生管理系统

2023-09-11 14:21:07 时间

前面介绍过链表,本人觉得链表在运用方面比较重要,下面给出一个实例。

 

学生管理系统

1.实现了链表的创建,以及一些增、删、改、查的基本操作

2.对于信息的存储采用的是文件的读写。将输入的信息保存在.txt中。

 

 

// Student.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include<stdio.h>

#include<time.h>

#include<string.h>

#include<stdlib.h>

#include<conio.h>

 

//学生基本信息

typedef struct Student

{

         int  id;                //学号

         char name[10];                  //姓名

         char sex[3];               //性别

         int chinese;                //语文

         int math;           //数学

         int english         ;        //英语

}Student;

 

//节点类型

typedef struct Node

{

         Student data;

         Node *next;

}Node;

 

Node *head=NULL;

Node *cur=NULL;

 

 

void Loading();                     //加载

void MyTime(int mTime);                   //计时器

void Menu();                         //菜单

void AddStu();                       //增加学生信息

Node* Find(int pos);            //遍历学生信息

void DelStu();                    //删除学生信息

void ChaStu();                       //修改学生信息

void FindStu();                      //查询学生信息

void AllStu();                         //显示全部学生信息

void LoadStu();                          //加载学生信息

void KeepStu();                              //保存学生信息

 

 

 

int _tmain(int argc, _TCHAR* argv[])

{

         system("color 2E");

         Loading();

         Menu();

         system("pause");

         getchar();

         return 0;

}

//计时器

void MyTime(int mTime)

{

         clock_t start,end;

         start=clock();

         end=clock();

         while((end-start)<mTime)

         {

                   end=clock();

         };

 

};

 

//界面加载

void Loading()

{

         printf("\n\n\n\n\n\n\n\n\n\n\n");

         printf("\t\t\t    欢迎进行学生信息系统\n");

         printf("\n\n\n\n\n\n\n\n\n\n\n\n");

         printf("正在加载数据,请稍等。。。");

         MyTime(3000);

};

 

//菜单

void Menu()

{

         system("cls");

         fflush(stdin);

         printf("\t\t********************************************\n");

         printf("\t\t*                                          *\n");

         printf("\t\t*          欢迎使用学生信息系统            *\n");

         printf("\t\t*                                          *\n");

         printf("\t\t********************************************\n");

         printf("\t\t\t1.增加学生信息\n");

         printf("\t\t\t2.删除学生信息\n");

         printf("\t\t\t3.修改学生信息\n");

         printf("\t\t\t4.查询学生信息\n");

         printf("\t\t\t5.显示全部学生信息\n");

         printf("\t\t\t6.加载学生信息\n");

         printf("\t\t\t7.保存学生信息\n");

         printf("\t\t\t8.退出系统\n");

         printf("请输入要操作的编号:(1-8)");

         int ch;

         scanf("%d",&ch);

         switch(ch)

         {

         case 1:

                            AddStu();break;

         case 2:

                            DelStu();break;                             

         case 3:

                            ChaStu();break;                          

         case 4:

                            FindStu();break;                         

         case 5:

                            AllStu();break;

         case 6:

                            LoadStu();break;                       

         case 7:

                            KeepStu();break;

         case 8:    exit(1);

         default:

                   printf("编号不存在,请输入正确的编号\n");

                   MyTime(1000);

         };

         Menu();

};

 

int k=0;

//增加学生信息

void AddStu()

{

         Node *pt=head;

         system("cls");

         fflush(stdin);   

         int ch,count=0;

         Student stu;`

         if(head==NULL)

         {

                   stu.id=1000;

                   pt=head;

                   k++;

         }

         else

                   {

                            stu.id=1000+k;

                            k++;

                   };

         printf("学生姓名:");

         scanf("%s",&stu.name);

         printf("学生性别(1.男|2.女):");

         scanf("%d",&ch);

         if(ch==1)

                   strcpy(stu.sex,"男");

         else

                   strcpy(stu.sex,"女");

         printf("语文:");

         scanf("%d",&stu.chinese);

         printf("数学:");

         scanf("%d",&stu.math);

         printf("英语:");

         scanf("%d",&stu.english);

         Node *p=(Node *)malloc(sizeof(Node));

         p->data=stu;

         if(head==NULL)

         {

                   head=p;

                   cur=p;

                   p->next=NULL;

         }

         else

         {

                   cur->next=p;

                   p->next=NULL;

                   cur=p;

         };

         printf("增加成功\n");

         printf("是否继续增加:(Y/N)");

         ch=getch();

         if(ch=='Y'||ch=='y')

                   AddStu();

         else

         system("cls");

         Menu();

 

};

 

//查询链表

Node* Find(int pos)//传入要查找的位置

{

         Node* tempTtr=head;

         int iCurPos=0;//标记

         while(tempTtr->next!=NULL&&iCurPos<pos)

         {

                   tempTtr=tempTtr->next;

                   iCurPos++;

         };

         if(tempTtr!=NULL&&pos==iCurPos)

         {

                   return tempTtr;

         }

         else

                   {

                            printf("你要查找的位置超过了范围!\n");

                            MyTime(2000);

                            return NULL ;

                   };

};

//删除学生信息                

void DelStu()

{

         LOOP:

         int num;

         system("cls");

         printf("请输入删除学生信息的序号:");

         scanf("%d",&num);

         Node *p=NULL,*temp=NULL;

         int curPos=0,count=0;

 

         //一个节点

         if(head->next==NULL&&num==1)

                   head=NULL;

 

         else if(!head)

         {

                   system("cls");

                   printf("不存在要数据\n");

                   Menu();

         }

         //多个节点

         else if(head->next!=NULL&&num==1)//删除头节点

         {

                   temp=head;

                   head=head->next;

                   delete temp;

                   count++;

         }

         else

         //删除中间节点

         {

                   p=Find(num-1);            //取到前一位节点

                   if(p==NULL)

                            goto LOOP;

                   Node *tempNew=NULL;

                   tempNew=p->next;

                   p->next=tempNew->next;

                   delete tempNew;

                   count++;

         };

         if(count>0)

                   printf("删除成功\n");

         MyTime(2000);

         system("cls");

         Menu();

};               

 

//修改学生信息

void ChaStu()

{

         int id=0,count=0;                                 //要修改的学生学号

         Node* p=NULL;

         system("cls");

         printf("请输入要修改的学生学号:");

         scanf("%d",&id);

         printf("\n");

         p=head;

         while(p!=NULL)

         {

                   if(p->data.id==id)

                   {

                            printf("语文:");

                            scanf("%d",&p->data.chinese);

                            printf("数学:");

                            scanf("%d",&p->data.math);

                            printf("英语:");

                            scanf("%d",&p->data.english);

                            ++count;

                            break;

                   }

         p=p->next;

         };

         if(count>0)

                   printf("修改成功\n");

         else

                            printf("不存在该学号");

         MyTime(2000);

         system("cls");

         Menu();

};               

 

//

int AllScore(Node *p)

{

         while(p!=NULL)

         {

                    return (p->data.chinese)+(p->data.math)+(p->data.english);

                    p=p->next;

         }

};

int  Adver(Node *p)

{

         while(p!=NULL)

         {

                   return ((p->data.chinese)+(p->data.math)+(p->data.english))/3;

                    p=p->next;

         }

};

//查询学生信息

void FindStu()

{

         int count=0;    

         char cname[10];               //用姓名查询

         Node* p=NULL;

         system("cls");

         printf("请输入要查询的学生姓名:");

         scanf("%s",cname);

         printf("\n");

         p=head;

         while(p!=NULL)

         {

                   if(strcmp(cname,p->data.name)==0)

                   {

                            if(count==0)

                            {

                                     printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n");

                            };

                            printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t",p->data.id,p->data.name,p->data.sex,

                                               p->data.chinese,p->data.math,p->data.english,AllScore(p),Adver(p));

                            count++;

                            break;

                   };

         p=p->next;

         };

         if(count==0)

                   {

                            system("cls");

                            printf("不存在该学生\n");

                            MyTime(2000);

                            system("cls");

                            Menu();

         };

         printf("\n按任意键返回\n");

         int ch=getch();

         Menu();

};                        

 

//显示全部学生信息

void AllStu()

{

         system("cls");

         Node* pp=NULL;

         int count=0;

         if(head==NULL||!head)

         {

                   printf("没有数据");

                   MyTime(2000);

                   system("cls");

                   Menu();

         };

         pp=head;

         while(pp!=NULL)

         {

                   if(count==0)

                            printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n");

                   printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n",pp->data.id,pp->data.name,

                                pp->data.sex,pp->data.chinese,pp->data.math,pp->data.english,AllScore(pp),Adver(pp));

                   pp=pp->next;

                   count++;

                   if(pp==NULL)

                            break;

         };

         printf("\n按任意键返回");

         int ch=getch();

         system("cls");

         Menu();

};               

 

//加载学生信息       

void LoadStu()

{

         system("cls");

         FILE *fp=fopen("Student1.txt","rb");

         if(fp==NULL)

         {

                   printf("加载数据失败");

                   MyTime(2000);

                   Menu();

         };

         Student stu;

         while(fread(&stu,sizeof(Student),1,fp));

         {

                   Node *p=(Node *)malloc(sizeof(Node));

                   p->data=stu;

                   p->next=NULL;

                   if(head==NULL)

                   {

                            head=p;

                            cur=p;

                   }

                   else

                   {

                            cur->next=p;

                            cur=p;

                   };

 

         };

 

         printf("加载成功");

         MyTime(2000);

         system("cls");

         Menu();

};                        

 

//保存学生信息

void KeepStu()

{

         system("cls");

         if(head==NULL)

         {

                   printf("没有数据可保存");

                   MyTime(2000);

                   Menu();

         };

         FILE *fp=NULL;

         fp=fopen("Student1.txt","wb");

         Node *p=head;

         while(p!=NULL)

         {

                   fwrite(&(p->data),sizeof(Student),1,fp);

                   p=p->next;

         };

         printf("保存成功");

         fclose(fp);

         MyTime(2000);

         Menu();

};