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

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

简介

学生信息管理系统是管理学生的一种系统,可以实现添加、查找、删除和修改学生信息等功能。本文将使用C语言实现学生信息管理系统,并通过链表的方式进行实现。

前提条件

在开始之前,我们需要了解如下内容:

  • C语言基础知识
  • 链表的基本概念和使用

系统架构

学生信息管理系统主要包含以下几个模块:

  • 学生信息结构体
  • 添加学生信息
  • 查找学生信息
  • 删除学生信息
  • 修改学生信息
  • 显示所有学生信息

学生信息结构体定义如下:

typedef struct Student {
    char name[20];
    int age;
    char sex[10];
    char major[20];
    int num;
    struct Student* next;
}Stu;

添加学生信息

利用链表实现添加学生信息功能,示例代码如下:

Stu* create() {
    Stu* head, * p, * pre;
    int n;
    printf("请输入学生总人数:");
    scanf_s("%d", &n);
    head = p = (Stu*)malloc(sizeof(Stu));
    printf("请输入第 1 个学生的信息:\n");
    printf("第1个学生的学号为 1 \n");
    scanf_s("%s %d %s %s", &p->name, 20, &p->age, &p->sex, 10, &p->major, 20);
    p->num = 1;
    p->next = NULL;
    for (int i = 2; i <= n; i++) {
        pre = p;
        p = (Stu*)malloc(sizeof(Stu));
        printf("请输入第 %d 个学生的信息:\n",i);
        printf("第 %d 个学生的学号为 %d \n",i, i);
        scanf_s("%s %d %s %s", &p->name, 20, &p->age, &p->sex, 10, &p->major, 20);
        p->num = i;
        p->next = NULL;
        pre->next = p; 
    }
    return head;
}

查找学生信息

利用链表实现查找学生信息功能,示例代码如下:

void query(Stu* head, char name[20])
{
    Stu* p = head;
    while (p != NULL)
    {
        if (strcmp(p->name, name) == 0)
        {
            printf("%d\t%s\t%d\t%s\t%s\n", p->num, p->name, p->age, p->sex, p->major);
            return;
        }
        p = p->next;
    }
    printf("未找到该学生信息!\n");
}

删除学生信息

利用链表实现删除学生信息功能,示例代码如下:

Stu* delete(Stu* head, char name[20]) {
    Stu* p, * pre;
    p = head->next;
    pre = head;
    while (p != NULL) {
        if (strcmp(p->name, name) == 0) {
            pre->next = p->next;
            free(p);
            printf("删除成功!\n");
            return head;
        }
        pre = p;
        p = p->next;
    }
    printf("对不起,未找到该学生信息!\n");
    return head;
}

修改学生信息

利用链表实现修改学生信息功能,示例代码如下:

Stu* change(Stu* head, char name[20]) {
    Stu* p = head;
    while (p != NULL) {
        if (strcmp(p->name, name) == 0) {            
            printf("请输入新的学生信息:\n");
            printf("请输入新的学生姓名:");
            scanf_s("%s", &p->name, 20);
            printf("请输入新的学生年龄:");
            scanf_s("%d", &p->age);
            printf("请输入新的学生性别:");
            scanf_s("%s", &p->sex, 10);
            printf("请输入新的学生专业:");
            scanf_s("%s", &p->major, 20);
            printf("修改成功\n");
            return head;
        }
        p = p->next;
    }
    printf("对不起,未找到该学生信息!\n");
    return head;
}

显示所有学生信息

利用链表实现显示所有学生信息功能,示例代码如下:

void show(Stu* head) {
    printf("序号\t姓名\t年龄\t性别\t专业\n");
    Stu* p = head;
    while (p != NULL) {
        printf("%d\t%s\t%d\t%s\t%s\n", p->num, p->name, p->age, p->sex, p->major);
        p = p->next;
    }
}

完整示例代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct Student {
    char name[20];
    int age;
    char sex[10];
    char major[20];
    int num;
    struct Student* next;
}Stu;

Stu* create() {
    Stu* head, * p, * pre;
    int n;
    printf("请输入学生总人数:");
    scanf_s("%d", &n);
    head = p = (Stu*)malloc(sizeof(Stu));
    printf("请输入第 1 个学生的信息:\n");
    printf("第1个学生的学号为 1 \n");
    scanf_s("%s %d %s %s", &p->name, 20, &p->age, &p->sex, 10, &p->major, 20);
    p->num = 1;
    p->next = NULL;
    for (int i = 2; i <= n; i++) {
        pre = p;
        p = (Stu*)malloc(sizeof(Stu));
        printf("请输入第 %d 个学生的信息:\n",i);
        printf("第 %d 个学生的学号为 %d \n",i, i);
        scanf_s("%s %d %s %s", &p->name, 20, &p->age, &p->sex, 10, &p->major, 20);
        p->num = i;
        p->next = NULL;
        pre->next = p; 
    }
    return head;
}

void query(Stu* head, char name[20])
{
    Stu* p = head;
    while (p != NULL)
    {
        if (strcmp(p->name, name) == 0)
        {
            printf("%d\t%s\t%d\t%s\t%s\n", p->num, p->name, p->age, p->sex, p->major);
            return;
        }
        p = p->next;
    }
    printf("未找到该学生信息!\n");
}

Stu* delete(Stu* head, char name[20]) {
    Stu* p, * pre;
    p = head->next;
    pre = head;
    while (p != NULL) {
        if (strcmp(p->name, name) == 0) {
            pre->next = p->next;
            free(p);
            printf("删除成功!\n");
            return head;
        }
        pre = p;
        p = p->next;
    }
    printf("对不起,未找到该学生信息!\n");
    return head;
}

Stu* change(Stu* head, char name[20]) {
    Stu* p = head;
    while (p != NULL) {
        if (strcmp(p->name, name) == 0) {            
            printf("请输入新的学生信息:\n");
            printf("请输入新的学生姓名:");
            scanf_s("%s", &p->name, 20);
            printf("请输入新的学生年龄:");
            scanf_s("%d", &p->age);
            printf("请输入新的学生性别:");
            scanf_s("%s", &p->sex, 10);
            printf("请输入新的学生专业:");
            scanf_s("%s", &p->major, 20);
            printf("修改成功\n");
            return head;
        }
        p = p->next;
    }
    printf("对不起,未找到该学生信息!\n");
    return head;
}

void show(Stu* head) {
    printf("序号\t姓名\t年龄\t性别\t专业\n");
    Stu* p = head;
    while (p != NULL) {
        printf("%d\t%s\t%d\t%s\t%s\n", p->num, p->name, p->age, p->sex, p->major);
        p = p->next;
    }
}

void menu() {
    printf("\n\n\n");
    printf("\t\t\t********************\n");
    printf("\t\t\t     学生信息管理系统    \n");
    printf("\t\t\t********************\n");
    printf("\t\t\t** 1.添加学生信息 **\n");
    printf("\t\t\t** 2.查找学生信息 **\n");
    printf("\t\t\t** 3.删除学生信息 **\n");
    printf("\t\t\t** 4.修改学生信息 **\n");
    printf("\t\t\t** 5.显示所有学生信息 **\n");
    printf("\t\t\t** 0.退出管理系统 **\n");
    printf("\t\t\t************************************************************\n");
}

int main() {
    int num;
    char name[20];
    Stu* head=create();
start:
    menu();
    printf("请输入你选择的模块编号:");
    scanf_s("%d", &num);
    switch (num) {
    case 1: {
        printf("添加新学生\n");
        printf("请输入学生姓名:");
        Stu* p = (Stu*)malloc(sizeof(Stu));
        p->next = NULL;
        scanf_s("%s", &p->name, 20);
        printf("请输入学生年龄:");
        scanf_s("%d", &p->age);
        printf("请输入学生性别:");
        scanf_s("%s", &p->sex, 10);
        printf("请输入学生专业:");
        scanf_s("%s", &p->major, 20);
        Stu* q = head;
        while (q->next != NULL) {
            q = q->next;
        }
        p->num = q->num + 1;
        q->next = p; 
        printf("添加成功!\n");
        goto start;
    }
    case 2: {
        printf("查找学生\n");
        printf("请输入要查找的学生姓名:");
        scanf_s("%s", &name, 20);
        query(head, name);
        goto start;
    }
    case 3: {
        printf("删除学生\n");
        printf("请输入要删除的学生姓名:");
        scanf_s("%s", &name, 20);
        Stu* p = delete(head, name);
        goto start;
    }
    case 4: {
        printf("修改学生信息\n");
        printf("请输入要修改的学生姓名:");
        scanf_s("%s", &name, 20);
        Stu* p = change(head, name);
        goto start;
    }
    case 5: {
        printf("显示所有学生信息\n");
        show(head);
        goto start;
    }
    case 0: {
        printf("退出管理系统\n"); return 0;
    }
    default: goto start;
    }

    return 0;
}

总结

通过本文的介绍,我们了解了如何使用C语言实现学生信息管理系统,并掌握了链表的应用。学生信息管理系统是一种比较基础的实践项目,可以帮助我们更好地学习和掌握C语言编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现学生信息管理系统(链表) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构中约瑟夫环问题探究

    C语言数据结构中约瑟夫环问题探究 什么是约瑟夫环问题? 约瑟夫环问题(Josephus problem)是一个经典的问题,据说是Flavius Josephus发现并命名的。该问题描述为,编号从1到n的n个人按照顺时针方向围坐成一圈,每人持有一个密码。从第1个人开始,顺时针方向每次完整的数m个人,然后让这m个人出圈并把他们的密码拿走不算。当到达队尾时,又从队…

    数据结构 2023年5月17日
    00
  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

    数据结构 2023年5月17日
    00
  • TypeScript 基础数据结构哈希表 HashTable教程

    TypeScript 基础数据结构哈希表 HashTable 教程 什么是哈希表 HashTable 在计算机科学中,哈希表(HashTable),也叫散列表,是根据关键码值(Key­value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫作哈希函数,存放记录的数组叫作哈希表。 如何实现哈…

    数据结构 2023年5月17日
    00
  • 「学习笔记」AC 自动机

    「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前置:「学习笔记」字符串基础:Hash,KMP与Trie。 好像对例题的讲解越来越抽象了? 算法 问题 求 \(n\) 个单词在一个长度为 \(m\) 的文章里出…

    算法与数据结构 2023年5月5日
    00
  • Redis高效率原因及数据结构分析

    Redis高效率原因及数据结构分析 Redis高效率的原因 Redis是一款高性能、高可靠性的内存数据库,其高效率的原因主要体现在以下几个方面: 1. 内存存储 Redis数据完全存储在内存中,而不是像传统的关系型数据库一样存储在磁盘中。内存的读写速度要远远快于磁盘的读写速度,因此Redis在数据读写时的速度非常快,能够达到每秒钟数百万次的读写操作。 2. …

    数据结构 2023年5月17日
    00
  • MySQL高级篇之索引的数据结构详解

    MySQL高级篇之索引的数据结构详解 索引的作用 索引是一种数据结构,用于快速地定位和访问数据表中的指定行。MySQL中索引通常以B-tree(B树)或哈希表的形式来实现,通过将索引存储在内存中,可以提高系统的查询效率。 常用的索引分为主键索引、唯一索引和普通索引。其作用分别为: 主键索引:保证表中每一行数据的唯一性,便于快速查询和修改数据。 唯一索引:保证…

    数据结构 2023年5月17日
    00
  • Python 树表查找(二叉排序树、平衡二叉树)

    下面是 Python 树表查找(二叉排序树、平衡二叉树)的完整攻略: 什么是树表查找 树表查找是一种数据结构,用于在数据集合中快速查找、插入和删除数据。树表查找的基本思想是利用特定的树形结构,在不断比较和移动中找到目标数据。常见的树表查找有二叉排序树和平衡二叉树。 二叉排序树(Binary Search Tree) 二叉排序树是一种特殊的二叉树结构,它满足以…

    数据结构 2023年5月17日
    00
  • Redis的六种底层数据结构(小结)

    Redis的六种底层数据结构(小结) 简介 Redis是一种基于内存的高效键值存储数据库,它支持六种不同的数据结构来存储数据。这些结构旨在提供高速、灵活和功能强大的一系列功能。在学习Redis时,了解这些数据结构可以帮助您更好地使用Redis并更好地解决您的问题。 Redis的六种底层数据结构 Redis支持以下六种不同的数据结构: String (字符串)…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部