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


学生管理系统

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();
};