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日

相关文章

  • Java数据结构学习之二叉树

    Java数据结构学习之二叉树 什么是二叉树 二叉树是一种树形数据结构,他的每个节点最多有两个子节点,分别称为左子节点和右子节点。如果一个节点没有子节点,则成为叶子节点。二叉树具有以下性质: 每个节点最多有两个子节点 左子树和右子树是二叉树 二叉树可以为空 二叉树的遍历 为了遍历一棵树,我们可以采用两种算法: 深度优先遍历 深度优先遍历的思路是:从根节点出发,…

    数据结构 2023年5月17日
    00
  • C语言编程数据结构的栈和队列

    C语言编程数据结构的栈和队列 什么是栈 栈(Stack) 是限定仅在表尾进行插入和删除操作的线性表。栈也称为后进先出( Last In First Out)的线性表,简称 LIFO 结构。栈结构有两个最重要的操作:入栈和出栈。其中,入栈操作向栈中添加一个元素,出栈操作从栈中删除一个元素。 栈的基本操作 初始化栈 入栈 出栈 取栈顶元素 判空 判满 // 栈的…

    数据结构 2023年5月17日
    00
  • 中国剩余定理(CRT)学习笔记

    约定 \(A\perp B\) 表示 \(\gcd(A,B)=1\)。 \(A\mid B\) 表示 \(B\equiv 0\pmod{A}(A\neq0)\)。 引入 考虑以下这道题: 有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。 問物幾何?—— 《孫子算經》 也就是说,求出下列关于 \(x\) 方程组的最小整数解: \[\begin{case…

    算法与数据结构 2023年4月30日
    00
  • C语言数据结构图的创建与遍历实验示例

    下面是“C语言数据结构图的创建与遍历实验示例”的完整攻略。 1. 创建数据结构图 1.1 创建图对象 首先需要创建一个图对象,可以使用邻接矩阵或邻接表来表示图。使用邻接矩阵表示时,将所有顶点的编号按照一定顺序排列在矩阵的行和列上,使用0或1表示两个顶点之间是否有边。使用邻接表表示时,需要一个array存储所有的顶点,数组中的每个元素包含一个链表,链表中存储与…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图的拓扑排序详解

    下面我将为您详细讲解“Java数据结构之有向图的拓扑排序详解”的完整攻略。 拓扑排序概述 拓扑排序是一种常见的有向无环图(DAG)的排序方法,该算法将DAG图中所有节点排序成一个线性序列,并且使得所有的依赖关系都满足从前向后的顺序关系。一般来说,DAG图的所有节点可以表示为一个任务依赖关系,而拓扑排序则可以对这些任务进行排序,确保每个任务在它所依赖的任务之后…

    数据结构 2023年5月17日
    00
  • C语言深入浅出讲解顺序表的实现

    C语言深入浅出讲解顺序表的实现 顺序表简介 顺序表是一种线性表的存储结构,它是由连续的内存空间来存储线性表中的元素。 顺序表的特点是支持查找、插入和删除操作,操作效率较高,但需要提前分配足够大的内存空间。当顺序表空间不足时,需要扩容,移动数据较为麻烦。 顺序表的实现 数据结构定义 顺序表的数据结构定义包含以下几个成员: 数据元素数组 data,存储线性表中的…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图设计与实现详解

    Java数据结构之有向图设计与实现详解 什么是有向图 有向图是一种图形结构,其中每一个节点都有一个方向,即它指向或被其他节点指向。有向图可以用来表示许多实际问题,如路线、依赖关系、状态转移等。 有向图的基本概念 在有向图中,每一个节点都有一个唯一的标识符,被称为节点ID。如果从节点A到节点B存在一条有向边,则称B是A的后继节点,A是B的前驱节点。节点的度数是…

    数据结构 2023年5月17日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

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