学生管理系统(list)

学生管理系统:学习了一点文件指针的操作和链表操作,以前总想搞下子,刚好碰到同学要做这个,自己瞎搞了一通。

实现功能:数据添加,查找,删除,插入,修改只是在查找加几句就没写。

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
using namespace std;

const int INF=0x3f3f3f3f;
const double eps=1e-10;
const double PI=acos(-1.0);
#define maxn 500
#define LEN sizeof(struct student)

struct student
{
    char number[20]; //学号
    char name[20];   //姓名
    char sex[5];    //性别
    char classn[20]; //班级
    int score1;     //数学分数
    int score2;     //英语分数
    int score3;     //计算机分数
    struct student *next;    //结构体指针
};
FILE *r;
FILE *w;
void Menu()//主菜单
{
    system("cls");
    printf("************学生成绩管理系统****************\n");
    printf("            1-文件读出学生信息\n");
    printf("            2-手动输入学生信息读入到文件\n");
    printf("            3-按学号查询学生信息\n");
    printf("            4-按学号删除学生信息\n");
    printf("            5-按学号从小到大插入学生信息\n");
    printf("            6-浏览显示全部学生成绩\n");
    printf("            0-退出\n");
    printf("输入功能编号\n");
}
struct student *tail;
struct student *input()
{
    struct student *head,*p1,*p2;
    //开辟一个LEN大小的空间,并让p1,p2指针指向它
    p2=p1=(struct student *)malloc(LEN);
    //将头指针置为NULL
    head=NULL;
    //创建链表节点并给节点的元素赋值
    //printf("请输入学生的学号和姓名:");
    //while(~scanf("%ld %s",&p1->num,p1->name);
    while(~fscanf(r,"%s%s%s%s%d%d%d",p1->number, p1->name, p1->sex, p1->classn, &p1->score1, &p1->score2, &p1->score3))
    {
        //n=n+1;
        if(NULL==head)
        {
            head=p1;
        }
        else
        {
            p2->next=p1;
        }
        p2=p1;
        p1=(struct student *)malloc(LEN);
//        printf("请输入学生的学号和姓名:");
//        scanf("%ld %s",&p1->num,p1->name);
    }
    //将尾节点的指针置为NULL
    p2->next=NULL;
    tail = p2;
    printf("从文件读出信息完毕\n");
    printf("可以继续输入功能编号\n");
    return head;
}
struct student * Add(struct student * head)
{
    struct student *p1,*p2;
    //开辟一个LEN大小的空间,并让p1,p2指针指向它
    p2=p1=(struct student *)malloc(LEN);

    //创建链表节点并给节点的元素赋值
    printf("添加学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数\n");
    printf("输入:2333 代表添加结束\n");
    p2 = head;

    while(1)
    {

        scanf("%s",p1->number);
        if(strcmp(p1->number,"2333") == 0)
            break;
        scanf("%s%s%s%d%d%d",p1->name,p1->sex,p1->classn,&p1->score1,&p1->score2,&p1->score3);
        struct student *pp = p1;
        if(NULL==head)
        {
            head=p1;
        }
        else
        {
            p2->next=p1;
        }
        p2=p1;
        p1=(struct student *)malloc(LEN);
        fprintf(w,"%s %s %s %s %d %d %d\n",pp->number, pp->name, pp->sex, pp->classn, pp->score1, pp->score2, pp->score3);
    }
    //将尾节点的指针置为NULL
    printf("添加信息到文件完毕\n");
    printf("可以继续输入功能编号\n");
    p2->next=NULL;
    return head;
}

void Serach(struct student * head)
{
    struct student *p1,*p2;
    p1=head;
    printf("输入需要查询的学号");
    char number[20];
    scanf("%s",number);
    if(NULL==head)
    {
        printf("链表为空!\n");
        return ;
    }
    //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
    //如果找到相应节点,或者已经遍历到尾节点就跳出循环
    while(strcmp(p1->number,number) != 0&&p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    if(strcmp(p1->number,number) == 0)
    printf("%s%9s%5s%6s%9d%9d%9d\n",p1->number,p1->name,p1->sex, p1->classn, p1->score1, p1->score2, p1->score3);
    else
    printf("链表中没有要查询的元素.\n");
    printf("可以继续输入功能编号\n");
}

struct student * Delete(struct student * head)
{
    struct student *p1;
    struct student *p2;
    p1=head;
    //判断链表是否为空
    printf("输入需要删除的学号");
    char number[20];
    scanf("%s",number);
    if(NULL==head)
    {
        printf("链表为空!\n");
        return head;
    }
    //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
    //如果找到相应节点,或者已经遍历到尾节点就跳出循环
    while(strcmp(p1->number,number)!=0&&p1->next!=NULL)
    {
        p2=p1;
        p1=p1->next;
    }
    //判断是否找到相应节点
    if(strcmp(p1->number,number) == 0)
    {
        //要删除的节点是不是链表的第一个节点
        //如果是,就将头指针指向该节点的后一个节点
        //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点
        if(head==p1)
        {
            head=p1->next;
        }
        else
        {
            p2->next=p1->next;
        }
        //n=n-1;
        printf("%s 节点已删除.\n",number);
    }
    else
    {
        printf("链表中没有要删除的元素.\n");
    }
    printf("可以继续输入功能编号\n");
    return head;
}

struct student *Insert(struct student * head)
{
    struct student *p0;
    struct student *p1;
    struct student *p2;

    p1=head;
    //判断链表是否为空,如果是空链表,就将新节点作为第一个节点
    printf("插入学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数\n");
    printf("输入:1333 代表插入结束\n");
    while(1)
    {
        p0=(struct student *)malloc(LEN);
        scanf("%s",p0->number);
        if(strcmp(p0->number,"1333") == 0)
            break;
        scanf("%s%s%s%d%d%d",p0->name,p0->sex,p0->classn,&p0->score1,&p0->score2,&p0->score3);
        if(NULL==head)
        {
            head=p0;
            p0->next=NULL;
        }
        else
        {
            //遍历每一个节点中的学号,与新学号比较大小
            //如果找到一个学号比新学号大,就将新学号的节点插入它之前
            //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部
            while(strcmp(p0->number,p1->number) > 0&&(p1->next!=NULL))
            {
                p2=p1;
                p1=p1->next;
            }
            //找到一个比新学号大的节点
            if(strcmp(p0->number, p1->number) <= 0)
            {
                //判断该节点是否为头节点,如果是,则将新节点设置为头节点
                if(p1==head)
                {
                    head=p0;
                }
                else
                {
                    p2->next=p0;
                }
                  p0->next=p1;
            }
            else
            {
                p1->next=p0;
                p0->next=NULL;
            }
        }
        printf("%s 插入成功!\n", p0->number);
    }
    printf("插入结束!\n");
    printf("可以继续输入功能编号\n");
    return head;
}

void Print(struct student *head)
{
    struct student * p;
    p=head;

    //判断链表是否为空
    if(NULL==head)
    {
        printf("链表为空!\n");
        return ;
    }
    else
    {
        //循环打印链表中的元素
        //printf("%d 个记录分别为:\n",n);
        while(p!=NULL)
        {
            printf("%s %s\n",p->number,p->name);
            //指针指向下一个节点
            p=p->next;
        }
    }
    printf("可以继续输入功能编号\n");
}

int main()
{
    Menu();
    int num;
    struct student *head =NULL;
    struct student *stu;
    tail = NULL;
    while(1)
    {
        scanf("%d", &num);
        Menu();
        if(num == 0)
            break;
        switch(num)
        {
            case 1://fopen("student.txt","r");//在根目录中
                    r = fopen("C:\\Users\\JONE\\Desktop\\student.txt", "r");
                    if (r==NULL) puts("null");
                    head = input();
                    fclose(r);
                    break;
            case 2:
                    w = fopen("C:\\Users\\JONE\\Desktop\\myfile.txt", "w");
                    if(w==NULL) puts("null");
                    if(head == NULL)
                        head = Add(tail);
                    else
                        tail = Add(tail);
                    fclose(w);
                    break;
            case 3:
                    Serach(head);
                    break;
            case 4:
                    head = Delete(head);
                    break;
            case 5:
                    head = Insert(head);
                    break;
            case 6:
                    Print(head);
                    break;
        }
    }
    return 0;
}
时间: 2024-10-19 04:06:21

学生管理系统(list)的相关文章

学生管理系统(jsp+mysql)

1.实验目的 通过使用 Java Web 技术设计一个简单的数据库管理系统,了解前台页面和后 台编辑页面的区别,掌握 Web 服务器与 MySQL 数据库的连接和数据库操作的方 法,掌握使用 JSP 编写后台代码的方法. 2.实验内容和要求 开发一个学生管理系统,完成学生信息的查看.增加.删除和修改等功能. 对于客户端增加和修改信息页面,要使用 javascript 进行必要的数据的非空验证. 自行添加一些 css,使得页面和字体更加美观. 3.实验步骤及实验结果 (1)打开 MySQL,新建一

用链表写的学生管理系统 成绩的录入与查询都已经是实现了

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct teacher { char name[32]; int math; int english; int data; struct Node *next; }SLIST; int Creat_SList(); int SList_Print(); int SLis

c语言学生管理系统链表(dev vs2012下可以运行)

struct student { char name[10]; char sex[5]; long int num;//学号 int xuhao; int age; float score[3]; float averange; char DJ;//存放等级哦 struct student *next; };//定义结构体变量保存 名字 性别 年龄 成绩] 结构体声明 int n;//存放学生人数 int man;//存放统计的男生数 float JY(float a)//校验成绩使范围0-10

Mysql学生管理系统:表的建立,外键一对多,多对多关系,中间关联表的建立

学生管理系统 管理员注册/登录/注销 注册班级(班级详细信息) 注册学生信息 查看班级信息/查看老师资料 教师注册/注销  查看教师资料  查看学生资料  根据名称/班级/ 查看学生详细信息--支持模糊 注册科目 管理员(admini) ad_id(管理员id)     ad_number(管理员账号) ad_pass(管理员密码)    ad_yn(管理员是否禁用) create table admini( ad_id int PRIMARY KEY AUTO_INCREMENT,-- 主键自

微信南通大学教务学生管理系统_用户体验

刚开始我还没关注南通大学教务学生管理系统的时候都是经常用电脑登陆然后上去查课表或者成绩什么的,但是用电脑也挺不方便的,因为每次都输用户名和密码,挺烦的.后来关注微信之后觉得还挺方便的,(图片是盗用同学的,因为我的手机屏幕没那么大,不能一下子把整张图一次性截下),但是我想说的他的缺点也就是它的一张图片实在太长了,让人看的眼花,一下子不能马上找到自己想查的是什么,而且我们要查的内容都是通过输入字母和数字组成的,如果一下子记不住字母和数字,还要往上翻页去看一眼什么字母或者数字,才能继续输入.(我不知道

精美学生管理系统

半个学期即将完美结束,精美的学生管理系统也终于亮相啦,哈哈! 话不多说,切入正题. 首先,要了解完成学生管理系统的步骤: 总共有几个模块,我就逐一讲解: 一:完成登录页面模块 判断“登录”是否成功的代码: 1 private void btnLogin_Click(object sender, EventArgs e) 2 { 3 string str = DBHelper.str; 4 SqlConnection con = new SqlConnection(str); 5 string s

【php】1、学生管理系统-欢迎界面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

简单的学生管理系统

简单的学生管理系统 一,主要功能: 1,添加学生信息: 2,添加的学生信息显示在线型布局中: 3,把学生信息保存在xml文件中: 4,把保存在mxl中的学生信息取出来解析显示在界面: 二,主要知识点: 1,layout_weight的使用: 2,pull解析xml文件,xml序列化: 3,保存数据到sd卡: 4,动态添加控件刷新界面: 三,界面原型如下图: 四,代码展示: 1,界面xml文件,activity_main.xml <LinearLayout xmlns:android="ht

Servlet实例开发---学生管理系统

Servlet总结 本程序采用Servlet开发技术,MVC分层,所有程序在设计时都要接口为操作的标准,主要逻辑操作只有增删改查. 具体实现操作请看源代码. 本程序采用的是MYSQL数据库,需加入相应的jar包 目录结构 首先贴上底层数据层: 连接数据库 package com.student.dbc ; import java.sql.* ; public class DatabaseConnection { private static final String DBDRIVER = "or

函数调用实例:学生管理系统(前面的优化版),可以弹出窗口。

1 package classwork308; 2 /* 3 * 学生管理系统 4 */ 5 import javax.swing.JOptionPane; 6 7 public class Method_StudentManage { 8 9 /*****管理账号*****/ 10 public static String[] manager={"a","b"}; 11 /*****管理密码*****/ 12 public static int [] passwo