您的位置:首页 > 编程语言 > C语言/C++

c用链表实现学生成绩管理系统 MIS

2013-11-25 08:56 946 查看
//

//  main.c

//  Homework001学生成绩管理系统

//

//  Created by LC on 13-11-22.

//  Copyright (c) 2013年 mac. All rights reserved.

//

// 学生成绩管理系统

/*

 1.录入学生信息

 2.打印学生信息

 3.保存学生信息

 4.读取学生信息

 5.统计所有学生人数

 6.查找学生信息

 7.修改某个学生的信息

 8.删除学生信息

 */

#include <stdio.h>

#include <stdlib.h>

typedef struct _Student{
   char name[10];
   int age;
   int number;
   int score;
}Student;

typedef struct _Node{
   Student stu;//学生信息
   struct
_Node * next;//指向下一个学生
}Node;

Node * head=NULL;//定义第一个学生

//函数声明
void inputStudent();//录入学生信息
void printStudent();//打印学生信息
void saveStudent();//保存学生信息
void readStudent();//读取学生信息
int countStudent();//统计所有学生人数
Node* findStudent();//查找学生信息
void modifyStudent();//修改学生信息
void deleateStudent();//删除学生信息
int main(int argc,const
char * argv[])
{

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

    printf("LC工作室2013作品V1.0\n");
   while (1) {

        printf("\n请选择功能列表:");

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

        printf("\n1.录入学生信息");

        printf("\n2.打印学生信息");

        printf("\n3.保存学生信息");

        printf("\n4.读取学生信息");

        printf("\n5.统计所有学生人数");

        printf("\n6.查找学生信息");

        printf("\n7.修改学生信息");

        printf("\n8.删除学生信息");
       printf("\n0.退出系统");

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

       char c;
       scanf(" %c",&c);
       switch (c) {
           case
'1':
               inputStudent();
               break;
           case
'2':
               printStudent();
               break;
           case
'3':
               saveStudent();
               break;
           case
'4':
               readStudent();
               break;
           case
'5':
               printf("学生的总人数为%d",
countStudent());
               break;
           case
'6':
            {  Node *ptr;
                ptr=findStudent();
               if (ptr!=NULL) {
                     printf("\n学号%d,姓名%s,年龄%d,成绩%d",ptr->stu.number,ptr->stu.name,ptr->stu.age,ptr->stu.score);
                }
               break;
            }
           case
'7':
               modifyStudent();
               break;
           case
'8':
               deleateStudent();
               break;
           case
'0':
               return
0;
               break;
           default:
               break;
        }
    }
   return
0;
}

//1.录入学生信息
void inputStudent(){

    printf("\n请输入学生信息,姓名学号
年龄
成绩\n");
   Node * p;

   //p指向最后一个学生
    p=head;
   while (head!=NULL&&p->next!=NULL)
{
        p=p->next;
    }

   //为新的学生分配一个空间
   Node * newnode=(Node *)malloc(sizeof(Node));
    newnode->next=NULL;
   if(head==NULL)
    {
       head=newnode;
        p=head;
    }
   else
    {
        p->next=newnode;//p的下一个节点为newnode
    }

   //输入新的学生数据
   scanf(" %s %d %d %d",newnode->stu.name,&newnode->stu.number,&newnode->stu.age,&newnode->stu.score);

    printf("\n数据添加成功........");
}

//2.打印学生信息
void printStudent(){

    printf("\n打印所有学生信息");
   Node *p;

    p=head;//指向第一个学生
   while (p!=NULL) {//打印学生信息
       printf("\n学号%d,姓名%s,年龄%d,成绩%d",p->stu.number,p->stu.name,p->stu.age,p->stu.score);
        p=p->next;
    }

    
}

//3.保存学生信息
void saveStudent(){
   printf("\n");
   FILE *fp;

    //打开文件

    fp=fopen("//Users//mac//Desktop//studentMMS.txt","w");
   if (fp==0) {
       printf("打开文件失败");
       return;
    }

    //写入数据
   Node *p;
    p=head;
   while (p!=NULL) {
       fprintf(fp,
"%d %s %d %d \n",p->stu.number,p->stu.name,p->stu.age,p->stu.score);
        p=p->next;
    }

    printf("数据保存成功");

    //关闭文件
   fclose(fp);

    return;
}

//4.读取学生信息
void readStudent(){

   //首先删除链表中的残余信息然后从文件读出数据
   Node *p,*p2;
    p=head;
    p2=p;
   while (p2!=NULL) {//逐个删除链表中的数据
        p=p->next;
       free(p2);
        p2=p;
    }
   head=NULL;
   FILE *fp;

    //打开文件

    fp=fopen("//Users//mac//Desktop//studentMMS.txt","r");
   if (fp==0) {
       printf("打开文件失败");
       return;
    }

    

    //读出数据
    while (!feof(fp)) {
       Node *temp=(Node *)malloc(sizeof(Node));//分配空间以存储数据
       fscanf(fp,
"%d %s %d %d\n",&temp->stu.number,temp->stu.name,&temp->stu.age,&temp->stu.score);//从文件中读取数据

        
       if(head==NULL)//类似函数1创建链表
        {
           head=temp;
            p=head;
        }
       else
        {
            p->next=temp;//p的下一个节点为temp
            p=p->next;
            p->next=NULL;
        }

        
    }

    //关闭文件
   fclose(fp);

    
    return;

}

//5.统计所有学生人数
int countStudent(){

    
   int number=0;

    readStudent();//先把文件中的数据读到链表中
   Node *p;
    p=head;

    
   while (p!=NULL) {
        number++;
        p=p->next;
    }

    
   return number;

    
}

//6.查找学生信息
Node* findStudent(){

    
   int student_num;

    printf("\n请输入要查找学生的学号:\n");
   scanf("%d",&student_num);

    

    readStudent();//先把文件中的数据读到链表中
   Node *p;
    p=head;//p指向链表
   while (p!=NULL) {
       if (p->stu.number==student_num) {
           return p;
        }
        p=p->next;
    }

    if(p==NULL){//遍历完链表也没找到信息
       printf("没有该学生信息");
    } 

    

    returnNULL;
}

//7.修改某个学生的信息

void modifyStudent()//通过链表来实现学生信息的修改,但是这种方法不太合适。
    {
       int student_num;

        printf("\n请输入要修改学生信息的学号:\n");
       scanf("%d",&student_num);

    

        readStudent();//先把文件中的数据读到链表中
       Node *p;
        p=head;
       while (p!=NULL) {
           if (p->stu.number==student_num) {

                printf("请输入要修改学生的信息姓名
学号
年龄 成绩\n");
               scanf(" %s %d %d %d",p->stu.name,&p->stu.number,&p->stu.age,&p->stu.score);
               printf("修改成功!");
               break;

                
            }
            p=p->next;
        }

 
       if (p==NULL) {
           printf("没有该学生的信息!");
        }

   

    

        
   return ;
}

//删除学生信息
void deleateStudent(){

    
   int student_num;

    printf("\n请输入要删除学生信息的学号:\n");
   scanf("%d",&student_num);

    

    readStudent();//先把文件中的数据读到链表中

    
   Node *p,*p2;
    p=head;

        //判断是否是头结点
       if (head->stu.number==student_num)
{
            p2=head;
           head=head->next;//头指针指向删除元素后的首元素
           free(p2);       
//释放结点
           return;
        }

    //若不是头结点

    
   while (p->next!=NULL) {

        
       if (p->next->stu.number==student_num)
{
            p2=p->next;
            p->next=p->next->next;//删除该结点指针跳过此节点
           free(p2);              
//释放结点
           return;
        }
        p=p->next;//p指向下一个结点
       if(p->next==NULL){//判断是否到了链表的结尾
           break;
        }
    }
   if(p->next==NULL){ //输出提示信息
       printf("没有该学生信息");
    }

    return;

   
}
//注:前面写过这个系统可是有很多不满意的地方,现在用链表重做了这个管理系统,现没发现什么bug

 如果有什么问题欢迎指正,交流学习 ————LC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息