广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现学生信息管理系统(链表)
  • 416
分享到

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

2024-04-02 19:04:59 416人浏览 泡泡鱼
摘要

目录1.头文件和预处理2.定义学生结构体的数据结构3.定义每条记录或节点的数据结构4.函数接口代码.1).定义提示菜单2).增加学生记录3).输入学号接口·4).遍历表

本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下

1.头文件和预处理

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iOStream>
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11

2.定义学生结构体的数据结构

typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;

3.定义每条记录或节点的数据结构


typedef struct node
{
    struct Student data; //数据域
    struct node *next; //指针域
}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

4.函数接口代码.

1).定义提示菜单

//定义提示菜单
void myMenu(){

    printf("*****************************菜单*****************************\n"); 
    printf("***********************1 增加学生记录*************************\n"); 
    printf("***********************2 删除学生记录*************************\n"); 
    printf("***********************3 查找学生记录*************************\n"); 
    printf("***********************4 修改学生记录*************************\n"); 
    printf("***********************5 统计学生人数 ************************\n"); 
    printf("***********************6 显示学生记录*************************\n"); 
    printf("***********************7 退出系统 ****************************\n"); 
    
}

2).增加学生记录

void inputStudent(Link l){
     printf("请输入学生学号:");
     scanf("%s",l->data.studentNo);
     printf("请输入学生的姓名:");
     scanf("%s",l->data.studentName);
    printf("请输入学生的成绩:");
     scanf("%s",&(l->data.score));
     //每个新创建的节点的next域都初始化为NULL
     l->next = NULL;
     system("cls");
}

3).输入学号接口·

void inputStudentNo(char s[],char no[]){
    printf("请输入要%s的学生学号:",s);
    scanf("%s",no);
}

4).遍历表中学生

//遍历表中学生 
void displayNode(Link head){
    if(head==NULL)
    {
        printf("学生为空\n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
   system("pause");
   system("cls");
}

5).增加学生记录


bool addNode(Link head){
     Link p,q;   //p,q两个节点一前一后
     Link node;  //node指针指向新创建的节点
     node=(Link)malloc(sizeof(Node));
     inputStudent(node);

     q = head;
     p = head->next;  //q指向head后面的第一个有效节点
     if(head->next==NULL)
         //链表为空时
        head->next = node;
     else {
         //循环访问链表中的所有节点
        while(p != NULL){
            if (node->data.studentNo < p->data.studentNo){
                //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                q->next = node;
                node->next = p;
                return true;
            }
            else{
                //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                q = p;
                p = p->next;

            }
        }
        //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
        q->next = node;

    }
     return true;
     system("pause");
   system("cls");
}

6).删除学生信息

//删除学生信息
bool deleteNode(Link head){
    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false

    //输入要处理的学号
        char no[NO_LENGTH];
    inputStudentNo("删除",no);
        Link p=head->next;
    Link q=head;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            q->next=p->next;
            free(p);
            system("pause");
   system("cls");
            return true;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
system("pause");
   system("cls");
    return false;
}

7).查找学生信息

//查找学生信息 
bool queryNode(Link head){
    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false

    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("查找",no);
        Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            
               system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            return true;
        }
        else
        {
            p=p->next;
        }
    }
   system("cls");

    return false;
}

8).修改学生信息

//修改学生信息 
bool modifyNode(Link head){
    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
    
    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("修改",no);
    Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"请输入修改后的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"请输入修改后的学号"<<endl; 
            cin>>p->data.studentNo;
            cout<<"请输入修改后的成绩"<<endl; 
            cin>>p->data.score;
            system("cls");
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    system("cls");
    return false;
}

9).统计学生人数

//统计学生人数
int countNode(Link head){
    //统计学生人数,扫描链表统计节点个数,返回节点数
    Link p;
    int count = 0;
    p = head->next;
    while(p)
    {
        p=p->next;
        count++;
    }
    //填充代码
    system("cls");
    return count;
}

10).清空链表

//清空链表 
void clearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;
    while(p)
    {
        q->next=p->next;
        free(p);
        p=q->next;
    }
        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
}

5.main函数

int main() {
    int select;
        int count;
    Link head;  // 定义链表

    //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
    head = (Link)malloc(sizeof(Node));
    head->next = NULL;

    while(1)
    {
        myMenu();
        printf("\n请输入你的选择(0-7):");  //显示提示信息
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            //增加学生记录
            if(addNode(head))
                printf("成功插入一个学生记录。\n\n");
            break;
        case 2:
            //删除学生记录
            if(deleteNode(head))
                printf("成功删除一个学生记录。\n\n");
            else
                printf("没有找到要删除的学生节点。\n\n");
            break;
        case 3:
            //查询学生记录
            if(queryNode(head))
                printf("成功找到学生记录。\n\n");
            else
                printf("没有找到要查询的学生节点。\n\n");
            break;
        case 4:
            //修改学生记录
            if(modifyNode(head))
                printf("成功修改一个学生记录。\n\n");
            else
                printf("没有找到要修改的学生节点。\n\n");
            break;
        case 5:
            //统计学生人数
            count = countNode(head);
            printf("学生人数为:%d\n\n",count);
            break;
        case 6:
            //显示学生记录
            displayNode(head);
            break;
        case 7:
            //退出前清除链表中的所有结点
            clearLink(head);
            return 0;
        default:
            printf("输入不正确,应该输入0-7之间的数。\n\n");
            system("cls"); 
            break;
        }
    }
    return 0;
}

6.总源码(可直接复制运行)

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11


typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;


typedef struct node
{
    struct Student data; //数据域
    struct node *next; //指针域
}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

//定义提示菜单
void myMenu(){

    printf("*****************************菜单*****************************\n"); 
    printf("***********************1 增加学生记录*************************\n"); 
    printf("***********************2 删除学生记录*************************\n"); 
    printf("***********************3 查找学生记录*************************\n"); 
    printf("***********************4 修改学生记录*************************\n"); 
    printf("***********************5 统计学生人数 ************************\n"); 
    printf("***********************6 显示学生记录*************************\n"); 
    printf("***********************7 退出系统 ****************************\n"); 
    
}

void inputStudent(Link l){
     printf("请输入学生学号:");
     scanf("%s",l->data.studentNo);
     printf("请输入学生的姓名:");
     scanf("%s",l->data.studentName);
    printf("请输入学生的成绩:");
     scanf("%d",&(l->data.score));
     //每个新创建的节点的next域都初始化为NULL
     l->next = NULL;
     system("cls");
}

void inputStudentNo(char s[],char no[]){
    printf("请输入要%s的学生学号:",s);
    scanf("%s",no);
}
//遍历表中学生 
void displayNode(Link head){
    if(head==NULL)
    {
        printf("学生为空\n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
   system("pause");
   system("cls");
}


bool addNode(Link head){
     Link p,q;   //p,q两个节点一前一后
     Link node;  //node指针指向新创建的节点
     node=(Link)malloc(sizeof(Node));
     inputStudent(node);

     q = head;
     p = head->next;  //q指向head后面的第一个有效节点
     if(head->next==NULL)
         //链表为空时
        head->next = node;
     else {
         //循环访问链表中的所有节点
        while(p != NULL){
            if (node->data.studentNo < p->data.studentNo){
                //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
                q->next = node;
                node->next = p;
                return true;
            }
            else{
                //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
                q = p;
                p = p->next;

            }
        }
        //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
        q->next = node;

    }
     return true;
     system("pause");
   system("cls");
}

bool deleteNode(Link head){
    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false

    //输入要处理的学号
        char no[NO_LENGTH];
    inputStudentNo("删除",no);
        Link p=head->next;
    Link q=head;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            q->next=p->next;
            free(p);
            system("pause");
   system("cls");
            return true;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
system("pause");
   system("cls");
    return false;
}

//查找学生信息 
bool queryNode(Link head){
    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false

    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("查找",no);
        Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            
               system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl; 
            return true;
        }
        else
        {
            p=p->next;
        }
    }
   system("cls");

    return false;
}

//修改学生信息 
bool modifyNode(Link head){
    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
    
    //输入要处理的学号
    char no[NO_LENGTH];
    inputStudentNo("修改",no);
    Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"请输入修改后的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"请输入修改后的学号"<<endl; 
            cin>>p->data.studentNo;
            cout<<"请输入修改后的成绩"<<endl; 
            cin>>p->data.score;
            system("cls");
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    system("cls");
    return false;
}

//统计学生人数
int countNode(Link head){
    //统计学生人数,扫描链表统计节点个数,返回节点数
    Link p;
    int count = 0;
    p = head->next;
    while(p)
    {
        p=p->next;
        count++;
    }
    //填充代码
    system("cls");
    return count;
}

//清空链表 
void clearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;
    while(p)
    {
        q->next=p->next;
        free(p);
        p=q->next;
    }
        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点
}

int main() {
    int select;
        int count;
    Link head;  // 定义链表

    //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
    head = (Link)malloc(sizeof(Node));
    head->next = NULL;

    while(1)
    {
        myMenu();
        printf("\n请输入你的选择(0-7):");  //显示提示信息
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            //增加学生记录
            if(addNode(head))
                printf("成功插入一个学生记录。\n\n");
            break;
        case 2:
            //删除学生记录
            if(deleteNode(head))
                printf("成功删除一个学生记录。\n\n");
            else
                printf("没有找到要删除的学生节点。\n\n");
            break;
        case 3:
            //查询学生记录
            if(queryNode(head))
                printf("成功找到学生记录。\n\n");
            else
                printf("没有找到要查询的学生节点。\n\n");
            break;
        case 4:
            //修改学生记录
            if(modifyNode(head))
                printf("成功修改一个学生记录。\n\n");
            else
                printf("没有找到要修改的学生节点。\n\n");
            break;
        case 5:
            //统计学生人数
            count = countNode(head);
            printf("学生人数为:%d\n\n",count);
            break;
        case 6:
            //显示学生记录
            displayNode(head);
            break;
        case 7:
            //退出前清除链表中的所有结点
            clearLink(head);
            return 0;
        default:
            printf("输入不正确,应该输入0-7之间的数。\n\n");
            system("cls"); 
            break;
        }
    }
    return 0;
}

7.测试结果

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

--结束END--

本文标题: C语言实现学生信息管理系统(链表)

本文链接: https://www.lsjlt.com/news/152030.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言实现学生信息管理系统(链表)
    目录1.头文件和预处理2.定义学生结构体的数据结构3.定义每条记录或节点的数据结构4.函数接口代码.1).定义提示菜单2).增加学生记录3).输入学号接口·4).遍历表...
    99+
    2022-11-13
  • C语言使用单链表实现学生信息管理系统
    本文实例为大家分享了C语言使用单链表实现学生信息管理系统,供大家参考,具体内容如下 初学数据结构,记录一下学习过程。 运行结果如图: 1.运行界面 2.录入学生信息 3.按照总分...
    99+
    2022-11-12
  • C语言链表实现学生信息管理系统程序设计
    本文实例为大家分享了C语言链表实现学生信息管理系统的具体代码,供大家参考,具体内容如下 事先存入的数据: 菜单 创建链表并倒序输出 输出链表中的全部信息 写入信息并保存至文件...
    99+
    2022-11-13
  • C语言实现学生信息管理系统
    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include <stdi...
    99+
    2022-11-13
  • C语言如何使用单链表实现学生信息管理系统
    这篇文章主要介绍了C语言如何使用单链表实现学生信息管理系统,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。运行结果如图:1.运行界面2.录入学生信息3.按照总分进行排序代码如下...
    99+
    2023-06-25
  • C语言实现学生宿舍信息管理系统
    本文实例为大家分享了C语言实现学生宿舍信息管理系统的具体代码,供大家参考,具体内容如下 功能描述 该学生宿舍信息管理系统主要实现的功能有:创建学生宿舍信息,显示学生宿舍信息,查询学生...
    99+
    2022-11-13
  • C语言实现简单学生信息管理系统
    学生信息管理系统的功能有,也可以自己增加或者改进一些函数功能。 在main函数里调用这8个函数 学生信息包含姓名、年龄、学号、成绩,需要定义一个结构体(结构体是全局变量,所以需要全...
    99+
    2022-11-13
  • C语言实现学生信息管理系统开发
    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 程序介绍 运行程序时,首先进入到菜单部分,菜单部分提供了菜单显示和输入功能部分。其运行效果如图所示...
    99+
    2022-11-13
    C语言学生信息系统 C语言学生管理系统 C语言信息管理系统
  • C语言链表实现学生成绩管理系统
    目录一、课程设计题目及内容二、主要设计思路三、程序源码及具体注释(1)预处理指令(2)类型定义(3)函数原型(4)main函数定义(5)其他函数定义 四、运行示例五、注意事...
    99+
    2022-11-13
  • C语言动态链表实现学生学籍管理系统
    本文实例为大家分享了C语言利用动态链表实现学生学籍管理系统的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <s...
    99+
    2022-11-13
  • C语言实现学籍信息管理系统
    本文实例为大家分享了C语言实现学籍信息管理系统的具体代码,供大家参考,具体内容如下 系统功能:录入、修改、添加、删除、查找、读取、删除数据系统主要技术:基本就是函数的调用,只用到结构...
    99+
    2022-11-13
  • C语言实现学生信息管理系统(文件操作)
    目录新增函数——文件操作;1.头文件和预处理2.定义学生结构体的数据结构3.定义每条记录或节点的数据结构4.函数接口代码.1.定义提示菜单2.增加学生记录3....
    99+
    2022-11-13
  • C语言如何实现学生宿舍信息管理系统
    这篇文章主要讲解了“C语言如何实现学生宿舍信息管理系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言如何实现学生宿舍信息管理系统”吧!功能描述该学生宿舍信息管理系统主要实现的功能有:创...
    99+
    2023-06-29
  • C语言使用链表实现学生籍贯管理系统
    本文实例为大家分享了C语言用链表实现学生籍贯管理系统的具体代码,供大家参考,具体内容如下 源码 #include<stdio.h> #include<stdlib....
    99+
    2022-11-13
  • C语言嵌套链表实现学生成绩管理系统
    C语言嵌套链表实现学生成绩管理系统,供大家参考,具体内容如下 链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。 场景: 一个年级,相当链表A 该年级5个班,每个...
    99+
    2022-11-13
  • C语言利用链表实现学生成绩管理系统
    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。 链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随...
    99+
    2022-11-21
    C语言 链表 学生成绩管理系统 C语言 学生成绩管理系统 C语言 成绩管理系统
  • C语言实现学生宿舍信息管理系统的方法
    这篇文章主要介绍“C语言实现学生宿舍信息管理系统的方法”,在日常操作中,相信很多人在C语言实现学生宿舍信息管理系统的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言实现学生宿舍信息管理系统的方法”的疑...
    99+
    2023-06-29
  • C语言实现学生宿舍信息管理系统课程设计
    本文实例为大家分享了C语言实现学生宿舍信息管理系统的具体代码,供大家参考,具体内容如下 一、问题陈述 宿舍对于大学生在校生活来说相当于家的存在,而宿舍管理又是学校后勤管理的重要环节,...
    99+
    2022-11-13
  • C语言结构体链表和指针实现学生管理系统
    目录一、需求分析二、整体设计三、详细设计学生档案管理子系统学生成绩管理子系统四、代码实现本文实例为大家分享了C语言结构体链表和指针实现学生管理系统的具体代码,供大家参考,具体内容如下...
    99+
    2022-11-13
  • C++实现学生信息管理系统(Map实现)
    本文实例为大家分享了C++实现学生信息管理系统的具体代码,供大家参考,具体内容如下 1、 作品的功能描述: 实现一个学生信息管理系统,通过对学生信息类中的成员进行增、删、改、查从而实...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作