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日

相关文章

  • MySQL底层数据结构选用B+树的原因

    MySQL底层数据结构选用B+树的原因主要是因为B+树具有以下优点: 能够快速查找B+树的查找速度非常快,时间复杂度为O(log n),在海量数据的环境中,能够快速定位目标数据。因为B+树每次查找只需要遍历树高度的次数,即使数据量很大,树的高度也很小。 能够高效地进行增删改操作B+树的平衡性能够保证树的高度非常小,大部分操作只需要遍历树的高度,而不是整颗树,…

    数据结构 2023年5月17日
    00
  • C#数据结构之单链表(LinkList)实例详解

    C#数据结构之单链表(LinkList)实例详解 概述 单链表是一种简单的数据结构,它由一些节点组成,每个节点包含着一个数据元素和一个指向下一个节点的指针。它的特点是可以快速的插入和删除节点,但在查找元素时效率不高。本篇文章将详细讲解单链表的实现过程和相关细节。 实现步骤 定义节点类 首先需要定义一个单链表节点类,包含两个部分:数据和指向下一个节点的指针。代…

    数据结构 2023年5月17日
    00
  • 虹科案例 | 虹科Domo商业智能,助力保险公司逃离繁杂数据池!

    金融行业的发展充满着不确定性,一个具备强大承保能力和精算专业知识的资金池,对于身处该领域的公司和个人都是十分必要的。 在全国城市联盟(NLC)的协助下成立的NCL Mutual会员制互助保险公司,为各个地区城市提供了稳定的再保险答案。,然而,面对数字化转型这场已经打响的战斗,NCL Mutual却因缺乏中心商业智能系统,在利用数据处理索赔和承保的能力受到了极…

    算法与数据结构 2023年4月17日
    00
  • C语言线性表的顺序表示与实现实例详解

    C语言线性表的顺序表示与实现实例详解 1. 线性表的定义 线性表是一种线性结构,它是由n个数据元素(n≥0)组成的有限序列。当n=0时,我们称为一个空表。 在C语言中,我们可以通过数组来实现线性表的顺序表示,每个数据元素都存在数组的一个位置中,数组下标可以看作是该数据元素的位置。 2. 线性表的基本操作 一个线性表的基本操作有以下几种: 2.1 初始化线性表…

    数据结构 2023年5月17日
    00
  • Leetcode Practice — 字符串

    目录 14. 最长公共前缀 思路解析 151. 反转字符串中的单词 思路解析 125. 验证回文串 思路解析 415. 字符串相加 思路解析 3. 无重复字符的最长子串 思路解析 8. 字符串转换整数 (atoi) 思路解析 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 输入:strs = […

    算法与数据结构 2023年4月18日
    00
  • C语言数据结构之堆排序的优化算法

    C语言数据结构之堆排序的优化算法攻略 堆排序简介 堆排序(HeapSort)是一种树形选择排序,在排序过程中始终保持一个最大堆,每次将堆顶元素与最后一个元素交换位置,并进行一次最大堆调整操作,直到整个序列有序为止。 堆排序的时间复杂度为O(nlogn),具有不需额外存储空间的特点,因此广泛应用于内存受限的场景。 堆排序的优化算法 1. 建堆操作的优化 将序列…

    数据结构 2023年5月17日
    00
  • 牛客小白月赛71

    A.猫猫与广告 题目: 分析: 只需考虑c * d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a* b的矩阵的长宽一定小于c * d矩阵的长宽。 code: #include <iostream> #include <cmath&…

    算法与数据结构 2023年4月25日
    00
  • C++ 数据结构之布隆过滤器

    C++ 数据结构之布隆过滤器 简介 布隆过滤器是一种用于快速判断一个元素是否存在于一个集合中的数据结构。它的空间效率和查询效率都比较高,在某些场景下,它可以代替传统的哈希表。 原理 布隆过滤器的基本原理是:将一个元素映射为多个位数组中的位置。在插入元素时,将这些位置上的值设置为1;在查询元素时,如果这些位置上的值都为1,则认为元素存在于集合中;否则认为元素不…

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