C语言实现简单学生信息管理系统

学生信息管理系统的功能有,也可以自己增加或者改进一些函数功能。

在main函数里调用这8个函数

学生信息包含姓名、年龄、学号、成绩,需要定义一个结构体(结构体是全局变量,所以需要全局声明):

typedef struct _student{
    char name[20];
    int age;
    int stuNum;
    int score;
}student;

需要有一个存储数据的空间,所以使用单链表存储,定义如下:

typedef struct _Node{
    student stu1;
    struct _Node* pNext;
}Node;

此时需要给链表一个头:

Node *g_head=NULL;

录入学生信息:

1)创建一个新节点,结点里包括结构体数据,和下一个指针。
2)需要判断头结点是不是空的,如果是空的,则此时需要将新节点付给头结点,如果不是空的,那么该结点的下一个指针=头结点(头插法,能用就行)。
3)然后就输入数据scanf("%s",&p->stu1.age);
4)最后提示一下该学生信息输入完毕!
5)现在只输入了一个学生信息,此时只需要在主函数里写一个循环就可以无限调用该函数进行数据录入。

void input(){
    printf("请输入学生信息\t\n");
    Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
    pNewNode->pNext=NULL;
    
    if(g_head==NULL){
        g_head=pNewNode;
    }
    else{
        pNewNode->pNext=g_head;
        g_head=pNewNode;
    }
    printf("请输入姓名: ");
    scanf("%s",pNewNode->stu1.name);
    printf("请输入年龄: ");
    scanf("%d",&pNewNode->stu1.age);
    printf("请输入学号 : ");
    scanf("%d",&pNewNode->stu1.stuNum);
    printf("请输入成绩 : ");
    scanf("%d",&pNewNode->stu1.score);
printf("该学生信息输入完毕!\n\n");
}

查看信息:

1)需要对链表进行遍历然后printf;
2)新建一个结点指针然后 Node* p=g_head; while(p!=NULL){ printf p=p->next}(注:以上代码只是功能的描述)

代码:

void printdate(){
    Node* p=g_head;
    printf("\t姓名\t年龄\t学号\t成绩\n");
    while(p!=NULL)
    {
        printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        p=p->pNext;
    }
}

保存信息:

1)先用文件指针指向一个要使用的文件,
2)便利所有链表的数据,将遍历的数据写入文件指针指向的文件里

void save(){
    FILE *fp=fopen("E:\\stu.data","w");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        fwrite(&p->stu1,1,sizeof(student),fp);
        p=p->pNext;
    }
    fclose(fp);
    printf("文件保存成功!\n");
}

文件读取:

1)先用文件指针指向一个使用的文件,
2)这里需要开辟链表来将读取到的数据写入链表里的数据里的结构体里,
3)需要判断一下是否读取到了数据,将文件里的数据先读到结构体数组里
4)然后while循环里 ,,将结构体数组里的数据复制给链表,
5)需要将每一个节点排好队列,这里用头插法,每复制一个就会开辟一个结点,

代码:

void rs(){
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
    }
    printf("文件读取成功!\n 查看文件请按2\n");
    student stu;
    
    while(fread(&stu,1,sizeof(student),fp)){
        Node* pNewNode=(Node*)malloc(sizeof(Node));
        pNewNode->pNext=NULL;

        memcpy(pNewNode,&stu,sizeof(student));

        if(g_head==NULL){
            g_head=pNewNode;

        }
        else{
            pNewNode->pNext=g_head;
            g_head=pNewNode;

        }
    }
    }

统计人数:

1)遍历链表的时候定义一个整型数组自加最后输出

void count(){
    int a=0;
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        p=p->pNext;
        a++;
    }
    printf("总人数%d",a);
}

查找学生:

1)定义整型数据,输入学号,先遍历再if判断输入的学号和p->stu1.num是否相等,相等的话输出:

void find(){
    int num;
    printf("请输入要查找的学生学号: \n");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){
        if(p->stu1.stuNum==num){
            printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        }
        p=p->pNext;
    }
printf("无该学生信息");
}

修改信息:

1)定义整型数据,输入学号,先遍历再if判断输入的学号和p->stu1.num是否相等,相等的话重新输入:

void change(){
    int num;
    printf("请输入要修改的学生的学号: ");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){

        if(p->stu1.stuNum==num){
            printf("请输入姓名: \n");
            scanf("%s",p->stu1.name);
            printf("请输入年龄: \n");
            scanf("%d",&p->stu1.age);
            printf("请输入学号: \n");
            scanf("%d",&p->stu1.stuNum);
            printf("请输入成绩: \n");
            scanf("%d",&p->stu1.score);
            printf("信息更改完毕!");
        }

        p=p->pNext;
    }
    if(p==NULL){
        printf("该学生不存在!\n");
    }

}

删除信息:

1)思路是先遍历,找到了free就可以了,
2)需要定义两个节点指针,如果找到了是头结点直接将头结点付给定义的节点,然后free,
如果不是头结点,将该节点付给定义的节点,p->next=p->next->next;
然后free

void del(){
    int num;

    printf("请输入要删除的学号");
    scanf("%d",&num);
    Node* p=g_head;
    Node*p1,*p2;
    if(p->stu1.stuNum==num){
        p1=p->pNext;

        free(p1);

    }
    if(p->pNext!=NULL){
        p2=p->pNext;
        p->pNext=p->pNext->pNext;
        free(p2);
    }
printf("学号为%d的信息删除成功!\n",num);

}

下面是完整代码:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _student{
    char name[20];
    int age;
    int stuNum;
    int score;
}student;

typedef struct _Node{
    student stu1;
    struct _Node* pNext;
}Node;

Node *g_head=NULL;
void menu(){
    printf("------------------\n");
    printf("- 1录入信息-\n");
    printf("- 2查看信息-\n");
    printf("- 3保存信息-\n");
    printf("- 4读取信息-\n");    
    printf("- 5统计人数-\n");
    printf("- 6查找信息-\n");
    printf("- 7修改信息-\n");
    printf("- 8删除信息-\n");
    printf("- 0退出-\n");
    printf("退出不要直接点叉,请按0退出!\n查看文件之前请先读取文件!\n");
}
void input(){
    printf("请输入学生信息\t\n");
    Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
    pNewNode->pNext=NULL;
    
    if(g_head==NULL){
        g_head=pNewNode;
    }
    else{
        pNewNode->pNext=g_head;
        g_head=pNewNode;
    }
    printf("请输入姓名: ");
    scanf("%s",pNewNode->stu1.name);
    printf("请输入年龄: ");
    scanf("%d",&pNewNode->stu1.age);
    printf("请输入学号 : ");
    scanf("%d",&pNewNode->stu1.stuNum);
    printf("请输入成绩 : ");
    scanf("%d",&pNewNode->stu1.score);
printf("该学生信息输入完毕!\n\n");
}

void printdate(){
    Node* p=g_head;
    printf("\t姓名\t年龄\t学号\t成绩\n");
    while(p!=NULL)
    {
        printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        p=p->pNext;
    }
}

void save(){
    
    FILE *fp=fopen("E:\\stu.data","w");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        fwrite(&p->stu1,1,sizeof(student),fp);
        p=p->pNext;

    }
    fclose(fp);
    printf("文件保存成功!\n");
}

void rs(){
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
    }
    printf("文件读取成功!\n 查看文件请按2\n");
    student stu;
    
    while(fread(&stu,1,sizeof(student),fp)){
        Node* pNewNode=(Node*)malloc(sizeof(Node));
        pNewNode->pNext=NULL;

        memcpy(pNewNode,&stu,sizeof(student));

        if(g_head==NULL){
            g_head=pNewNode;

        }
        else{
            pNewNode->pNext=g_head;
            g_head=pNewNode;

        }
    }
    }

void count(){
    int a=0;
    FILE* fp=fopen("E:\\stu.data","r");
    if(fp==NULL){
        printf("文件打开失败");
        return;
    }
    Node* p=g_head;
    while(p!=NULL){
        p=p->pNext;
        a++;
    }
    printf("总人数%d",a);
}

void find(){
    int num;
    printf("请输入要查找的学生学号: \n");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){
        if(p->stu1.stuNum==num){
            printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
        }
        p=p->pNext;
    }
printf("have not");
}

void change(){
    int num;
    printf("请输入要修改的学生的学号: ");
    scanf("%d",&num);
    Node* p=g_head;
    while(p!=NULL){

        if(p->stu1.stuNum==num){
            printf("请输入姓名: \n");
            scanf("%s",p->stu1.name);
            printf("请输入年龄: \n");
            scanf("%d",&p->stu1.age);
            printf("请输入学号: \n");
            scanf("%d",&p->stu1.stuNum);
            printf("请输入成绩: \n");
            scanf("%d",&p->stu1.score);
            printf("信息更改完毕!");
        }

        p=p->pNext;
    }
    if(p==NULL){
        printf("该学生不存在!\n");
    }

}

void del(){
    int num;

    printf("请输入要删除的学号");
    scanf("%d",&num);
    Node* p=g_head;
    Node*p1,*p2;
    if(p->stu1.stuNum==num){
        p1=p->pNext;

        free(p1);

    }
    if(p->pNext!=NULL){
        p2=p->pNext;
        p->pNext=p->pNext->pNext;
        free(p2);
    }
printf("学号为%d的信息删除成功!\n",num);

}

int main()
{
    menu();
    while(1)
    {
        char ch=getch();
        switch(ch){
        case '1':input();break;
        case '2':printdate();break;
        case '3':save();break;
        case '4':rs();break;

        case '5':count();break;
        case '6':find();break;
        case '7':change();break;
        case '8':del();break;

        case '0':exit(0);
        
        }
    }

return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言数据结构之学生信息管理系统课程设计

    本文实例为大家分享了学生信息管理系统设计的具体代码,供大家参考,具体内容如下 建立一个动态链表,链表中每一结点包括:学号.姓名.性别.年龄.成绩.程序能实现以下功能: 建立链表      显示链表      查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息.      删除链表中指定学号的结点.      在链表中指定的位置插入一个新结点(学号不能和其他结点重复). 要求:程序运行中,先显示实现以上功能所构成的菜单,然后根据选项调用相应程序

  • C语言学生信息管理系统小项目

    本文为大家分享了C语言学生信息管理系统小项目,供大家参考,具体内容如下 /* 运行环境:我是在linux里面用gcc编译的,在windows里应该也能运行,用的一些文件库函数都是c标准库,没有用linux的系统调用(纠正一下:system("clear")这个系统调用是linux的,windows里面用system("cls") ) (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等.试设计一学生信息管理系统,使之能提供以下功

  • C语言使用链表实现学生信息管理系统

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 代码实现的功能: 1.插入学生信息 2.显示学生信息 3.删除学生信息 4.在指定位置插入学生信息 5.查找学生信息 代码内容: #include <stdio.h> #include <stdlib.h> #include <string.h> #define Max_Student_Num 10 #define Max_Str_len 20 typedef struct T_stud

  • C语言数组实现学生信息管理系统设计

    概述 单纯只用多个数组管理学生成绩信息,不使用结构体,该程序最主要的难点是依据学号或总成绩对学生信息进行排序,借助了临时数组来标记排好序的下标. 运行结果如下: 输入数据: 打印数据: 根据学号对信息进行排序: 根据总成绩对信息进行排序: 根据学号删除某一信息: 代码如下: #include <stdio.h> #include <stdlib.h> //exit函数头文件 #include <string.h> //字符串相关操作头文件 #define MAX_STU

  • C语言单链表版学生信息管理系统

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 代码: //以单链表作为存储结构,设计和实现课程成绩管理的完整程序. //程序包括如下功能. //1.建立学生成绩表,包含学生的学号.姓名和成绩. //2.可以显示所有学生成绩. //3.可以计算学生的总数. //4.可以按学号和序号查找学生. //5.可以在指定位置插入学生成绩数据. //6.可以删除指定位置的学生数据. //7.可以把学生成绩按从高到低的顺序排序. //作者: yinlinqvan //操作系统:

  • C语言学生信息管理系统设计与实现

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 #include"stdio.h" //标准的输入输出函数文件头部说明 #include"math.h" // 数学函数头部说明 #include"string.h" #include"stdlib.h" //通过该函数头部里的函数,改变控制台的背景和颜色 #include"windows.h" //头文件声明,下文用到了改变控

  • C语言实现学生信息管理系统(文件版)

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 下面是我自己用写的学生信息管理系统,为了增加数据的利用率,分为学生端和教师端,同时实现账号密码登录,以文件的形式将其存入. 代码如下 #include <stdio.h> #include <string.h> #include <string> #include<Windows.h> #define USER "TOM" // 事先定义用户名,用于登录页

  • 学生信息管理系统C语言版

    C语言学生信息管理系统包括以下功能: 1.学生信息的整体注册 2.学生信息的修改 3.学生成绩信息的录入 4.学生信息的添加 5.恢复误删的学生信息 6.学生信息的删除 7.密码修改保存函数 8.学生信息的查询 9.密码修改函数 10.学生信息管理系统的菜单函数 #include "stdio.h" #include "malloc.h" #include "string.h" #include "stdlib.h" #inc

  • C语言实现学生信息管理系统(单链表)

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 /*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:吴敬超 * 完成日期:2016年7月1日 * 版本号:codeblock * * 问题描述: 学生信息管理系统 * 输入描述: * 程序输出: 输出结果 */ #include <stdio.h> #include <stdlib.h> #include

  • C语言版学生信息管理系统

    本文实例为大家分享了C语言版学生信息管理系统的具体代码,供大家参考,具体内容如下 一.题目分析 1.功能概述 1)查询学生信息 2)添加学生信息 3)修改学生信息 4)删除学生信息 5)刷新学生信息 6)保存学生信息 7)输出当前学生信息 2.题目要求: 1)使用结构体建立学生信息体制 2)实现七大基本功能 3)采用文件存储学生信息 二.算法构造 1.难点解析----对文件的操作 1.1文件读取 FILE * fp; if ((fp = fopen(filename, "r")) ==

随机推荐