【C语言】 链表实现学生管理系统(堆区开辟空间)

         总体思路都能写出来,问题是感觉稍微比之前的麻烦一些,在刚开始创建结构体的时候,并没有去按照链表的思路去写,导致写成了顺序表,后面就一直纠结空间怎么开辟。

        链表是由一个头节点和其它申请出来的小节点连起来的,需要分开开辟空间,然后进行连接等等的操作。需要先申请节点,为了方便就封装一个申请节点的函数,然后再实现功能的时候去调用就行
        还有一个点,在后期遇到一个问题,不管我输入什么东西,打印数据的时候,我的最后一个数据不知道为什么会一直加一,后面发现是我在声明变量的时候写了ClassPtr Class,然后这个Class和我结构体的Class冲突了,但是很奇怪并没有报错,但是确实是这个问题导致我的代码输出时候莫名增1,不是很懂。以后定义变量的时候还是得尽量避免重复吧,反正这次重复了并没报错,也没警告,但是代码就是功能实现有问题,记录一下吧。

//link_list.h
#ifndef LINK_LIST_H
#define LINK_LIST_H
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

#define MAX 100

//学生信息
typedef struct Stu
{
    char name[20];
    int age;
    double score;
}Stu,*StuPtr;

//班级管理
typedef struct Class
{
    Stu student;
    int len;
    struct Class *next;
}Class,*ClassPtr;

//创建管理视图
void create_view();

//创建班级链表
ClassPtr link_class_create();

//申请学生信息结点
ClassPtr link_apply_node(Stu student);

//头插 插入学生信息
int link_insert_student(ClassPtr Class,Stu student);

//遍历学生信息
int link_printf_student(ClassPtr Class);

//按位置查找学生结点
ClassPtr link_search_student_pos(ClassPtr Class,int pos);

//按位置插入学生信息
int link_insert_student_pos(ClassPtr Class,int pos,Stu student);

#endif
//link_list.c
#include "link_list.h"

//创建管理视图
void create_view()
{
    printf("\t\t======1.创建班级\n");
    printf("\t\t======2.录入学生信息\n");
    printf("\t\t======3.输出所有学生信息\n");
    printf("\t\t======4.按位置插入学生信息\n");
    printf("\t\t======5.销毁班级\n");
    printf("\t\t======0.退出\n");
}

//创建班级链表
ClassPtr link_class_create()
{
    ClassPtr class_ptr = (ClassPtr)malloc(sizeof(Class));  //在堆区申请空间
    if(class_ptr == NULL)
    {
        printf("班级链表创建失败\n");
        return NULL;
    }
    class_ptr->len = 0;
    class_ptr->next = NULL;
    printf("班级创建成功\n");
    putchar(10);
    return class_ptr;
}

//申请学生信息结点
ClassPtr link_apply_node(Stu student)
{
    ClassPtr p = (ClassPtr)malloc(sizeof(Class));
    if(p == NULL)
    {
        printf("结点创建失败\n");
        return NULL;
    }
    p->student = student;
    p->next = NULL;
    return p;
}

//头插 插入学生信息
int link_insert_student(ClassPtr class_ptr,Stu student)
{
    if(class_ptr == NULL)
    {
        printf("插入失败\n");
        return -1;
    }
    ClassPtr p = link_apply_node(student);
    p->next = class_ptr->next;
    class_ptr->next = p;
    class_ptr->len++;
    printf("插入成功\n");
    return 0;
}

//遍历学生信息
int link_printf_student(ClassPtr class_ptr)
{
    if(NULL == class_ptr)
    {
        printf("遍历失败\n");
        return -1;
    }

    ClassPtr q = class_ptr->next;
    while(q)
    {
        printf("%s\t%d\t%.2lf\n",q->student.name,q->student.age,q->student.score);
        q = q->next;
    }
    putchar(10);
    return 0;
}

//按位置查找学生结点
ClassPtr link_search_student_pos(ClassPtr Class,int pos)
{
    if(NULL == Class || pos < 0 || pos > Class->len)
    {
        printf("查找失败\n");
        return NULL;
    }
    ClassPtr q = Class;
    for(int i = 0;i < pos;i++)
    {
        q = q->next;
    }
    return q;
}

//按位置插入学生信息
int link_insert_student_pos(ClassPtr class_ptr,int pos,Stu student)
{
    if(NULL == class_ptr)
    {
        printf("插入失败\n");
        return -1;
    }

    ClassPtr p = link_apply_node(student);
    ClassPtr q = link_search_student_pos(class_ptr,pos-1);

    p->next = q->next;
    q->next = p;
    class_ptr->len++;
    printf("插入成功\n");
    return 0;
}
//main.c
#include "link_list.h"
int main(int argc, char const *argv[])
{
    int n = 0,pos = 0;
    ClassPtr class_ptr;
    Stu student;
    while(1)
    {
        create_view();
        printf("请输入您需要实现的功能:");
        scanf("%d",&n);
        getchar();
        switch (n)
        {
        case 1:
            class_ptr = link_class_create();
            break;

        case 2:
            printf("请输入你需要插入的学生姓名:");
            scanf("%s",student.name);
            printf("请输入你需要插入的学生年龄:");
            scanf("%d",&student.age);
            printf("请输入你需要插入的学生成绩:");
            scanf("%lf",&student.score);
            getchar();
            link_insert_student(class_ptr,student);
            break;

        case 3:
            printf("姓名\t年龄\t成绩\n");
            link_printf_student(class_ptr);
            break;

        case 4:
            printf("请输入你需要插入第几个位置:");
            scanf("%d",&pos);
            printf("请输入你需要插入的学生姓名:");
            scanf("%s",student.name);
            printf("请输入你需要插入的学生年龄:");
            scanf("%d",&student.age);
            printf("请输入你需要插入的学生成绩:");
            scanf("%lf",&student.score);
            link_insert_student_pos(class_ptr,pos,student);
            break;

        case 0:
        goto END;
            break;

        default:
            break;
        }
    }
    END:
    return 0;
}

输出结果如下:

相关推荐

  1. 实现学生管理系统

    2024-07-21 19:36:02       27 阅读
  2. 实现学生管理系统

    2024-07-21 19:36:02       33 阅读
  3. C语言内存管理以及空间空间区别

    2024-07-21 19:36:02       54 阅读
  4. c++学习:list模板类实战学生管理系统

    2024-07-21 19:36:02       53 阅读
  5. C语言实现图书管理

    2024-07-21 19:36:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 19:36:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 19:36:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 19:36:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 19:36:02       55 阅读

热门阅读

  1. 计算机视觉发展历程

    2024-07-21 19:36:02       17 阅读
  2. python中的fire和Linux shell中的参数传递

    2024-07-21 19:36:02       14 阅读
  3. Vue.js 首屏加载优化:实战与策略

    2024-07-21 19:36:02       13 阅读
  4. 《浔川 AI 五子棋 v5.0 上线倒计时》——浔川官方

    2024-07-21 19:36:02       18 阅读
  5. @JsonFormat注解的作用

    2024-07-21 19:36:02       13 阅读
  6. 云原生项目纪事系列 - 项目管理的鲜活事例

    2024-07-21 19:36:02       20 阅读