学生管理系统(通过顺序表,获取连续堆区空间实现)

将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数 :

1】顺序表的创建,

2】判满、

3】判空、

4】往顺序表里增加学生信息、

5】遍历学生信息

6】任意位置插入学生信息

7】任意位置删除学生信息

8】修改学生信息

9】查找(按学生的学号查找)、

10】删除重复学生信息

11】销毁顺序表

主函数main.c 

#include "stu.h"                                               
int main()                                                     
{                                                              
                                                               
    int i;                                                     
    stu_p S = stu_create();                                    
                                                               
    if(NULL == S)                                              
        return 0;                                              
    else                                                       
    {                                                          
        do                                                     
        {                                                      
            printf("1.添加学生信息\t");                        
            printf("2.遍历学生信息\t");                        
            printf("3.插入学生信息\t");                        
            printf("4.删除学生信息\n");                        
            printf("5.查找学生信息\t");                        
            printf("6.修改学生信息\t");                        
            printf("7.删除重复信息\t");                        
            printf("8.退出信息系统\n");                        
            printf("请输入选项:");                            
            scanf("%d", &i);                                   
            switch(i)                                          
            {                                                  
            case 1:stu_add(S);break;                           
            case 2:stu_show(S);break;                          
            case 3:stu_insert(S);break;                        
            case 4:stu_delet(S);break;                         
            case 5:stu_find(S);break;                          
            case 6:stu_change(S);break;                        
            case 7:stu_repeatdel(S);break;                     
            case 8:stu_free(S);printf("已退出\n");break;       
            default:printf("没有这个选项,请重新选择");        
            }                                                  
        }while(8 != i);                                        
    }                                                          
    return 0;                                                  
}                                                              

 功能函数stu.c

#include"stu.h"                                
                                               
//申请顺序表空间                               
stu_p stu_create()                             
{                                              
    //申请数据结构大小的堆空间                 
    stu_p S = (stu_p)malloc(sizeof(stu));      
    if(NULL == S)                              
    {                                          
        printf("申请顺序表失败");              
        return NULL;                           
    }                                          
    memset(S -> name, 0, sizeof(S -> name));   
    memset(S -> id, 0, sizeof(S -> id));       
    S -> len = 0;                              
    printf("申请顺序表成功\n");                
                                               
    return S;                                  
}                                              
                                               
//添加学生信息                                 
void stu_add(stu_p S)                          
{                                              
    if(stu_full(S))                            
    {                                          
        printf("满\n");                        
        return;                                
    }                                          
                                               
    printf("请输入学生姓名:");                 
    scanf("%s", S -> name[S -> len]);          
                                               
    printf("请输入学生id:");                   
    scanf("%d", &S -> id[S -> len]);           
                                               
    S -> len++;                                
    stu_show(S);                               
}         
//位插信息                                         
void stu_insert(stu_p S)                           
{                                                  
    if(stu_full(S))                                
    {                                              
        printf("满\n");                            
        return;                                    
    }                                              
                                                   
    printf("请输入要插入的位置:");                
    int in;                                        
    scanf("%d", &in);                              
                                                   
    if(in > S -> len || in <= 0 || in > MAX)       
    {                                              
        printf("所选位置错误\n");                  
        return;                                    
    }                                              
    //将插入的位置空出来                           
    for(int i = S -> len; i >= in; i--)            
    {                                              
        S -> id[i] = S -> id[i - 1];               
        strcpy(S -> name[i], S -> name[i - 1]);    
    }                                              
                                                   
                                                   
    printf("请输入学生姓名:");                     
    scanf("%s", S -> name[in - 1]);                
                                                   
    printf("请输入学生id:");                       
    scanf("%d", &S -> id[in - 1]);                 
                                                   
    S -> len++;                                    
    stu_show(S);                                   
}                                                  
                                     
//位删信息                                       
void stu_delet(stu_p S)                          
{                                                
    if(stu_null(S))                              
    {                                            
        printf("空\n");                          
        return;                                  
    }                                            
                                                 
    printf("请输入要删除的位置:");              
    int in;                                      
    scanf("%d", &in);                            
    if(in > S -> len || in <= 0)                 
    {                                            
        printf("所选位置错误\n");                
        return;                                  
    }                                            
                                                 
    for(int i = in - 1; i < S -> len; i++)       
    {                                            
        S -> id[i] = S -> id[i + 1];             
        strcpy(S -> name[i], S -> name[i + 1]);  
    }                                            
                                                 
    S -> len--;                                  
    stu_show(S);                                 
}                                                
//位改                                 
void stu_change(stu_p S)               
{                                      
    if(stu_null(S))                    
    {                                  
        printf("空\n");                
        return;                        
    }                                  
                                       
    printf("请输入要修改的位置:");    
    int in;                            
    scanf("%d", &in);                  
    if(in > S -> len || in <= 0)       
    {                                  
        printf("所选位置错误\n");      
        return;                        
    }                                  
                                       
    printf("请输入学生姓名:");         
    scanf("%s", S -> name[in - 1]);    
                                       
    printf("请输入学生id:");           
    scanf("%d", &S -> id[in - 1]);     
                                       
    stu_show(S);                       
}                                      
//查找学生信息                                                                     
void stu_find(stu_p S)                                                             
{                                                                                  
    if(stu_null(S))                                                                
    {                                                                              
        printf("空\n");                                                            
        return;                                                                    
    }                                                                              
    printf("请输入学生的ID:");                                                    
    int ID, i = 0;                                                                 
    scanf("%d", &ID);                                                              
    do                                                                             
    {                                                                              
        if(S -> id[i] == ID)                                                       
        {                                                                          
            printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]);        
            return;                                                                
        }                                                                          
        i++;                                                                       
    }while(i <= S -> len);                                                         
    printf("没有这个学生\n");                                                      
                                                                                   
}                                                                                  
//删重                                                           
void stu_repeatdel(stu_p S)                                      
{                                                                
    if(stu_null(S))                                              
    {                                                            
        printf("空\n");                                          
        return;                                                  
    }                                                            
                                                                 
    for(int i = 0; i < S -> len; i++)                            
    {                                                            
        //遍历后面的值                                           
        for(int j = i + 1; j < S -> len; j++)                    
        {                                                        
            //重复的进行删除                                     
            if(S -> id[i] == S -> id[j])                         
            {                                                    
                for(int k = j; k < S -> len; k++)                
                {                                                
                    S -> id[k] = S -> id[k + 1];                 
                    strcpy(S -> name[k], S -> name[k + 1]);      
                }                                                
                S -> len--;                                      
                j--;//对删除后位置的值进行重新对比               
            }                                                    
        }                                                        
    }                                                            
    stu_show(S);                                                 
}                                                                
                                                                 
//释放堆空间                                                     
void stu_free(stu_p S)                                           
{                                                                
    free(S);                                                     
    S = NULL;                                                    
}                                                                
//判空                                                                  
int stu_null(stu_p S)                                                   
{                                                                       
    return 0 == S -> len;                                               
}                                                                       
                                                                        
//判满                                                                  
int stu_full(stu_p S)                                                   
{                                                                       
    return MAX == S -> len;                                             
}                                                                       
                                                                        
//回显顺序表                                                            
void stu_show(stu_p S)                                                  
{                                                                       
    if(stu_null(S))                                                     
    {                                                                   
        printf("空\n");                                                 
        return;                                                         
    }                                                                   
    printf("——————————————\n");                                         
    for(int i = 0; i < S -> len; i++)                                   
        printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]); 
    printf("——————————————\n");                                         
}                                                                       

 功能函数头文件stu.h

#ifndef __STU_H__
#define __STU_H__

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

#define MAX 8

typedef struct student
{
    char name[MAX][24];
    int id[MAX];
    int len;
}stu, *stu_p;

stu_p stu_create();
int stu_full(stu_p S);
int stu_null(stu_p S);
void stu_add(stu_p S);
void stu_show(stu_p S);
void stu_insert(stu_p S);
void stu_delet(stu_p S);
void stu_change(stu_p S);
void stu_find(stu_p S);
void stu_repeatdel(stu_p S);
void stu_free(stu_p S);
#endif                                   

 实现效果

申请顺序表成功
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:1
——————————————
[1]姓名:1	ID:1
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:1
请输入学生姓名:2
请输入学生id:2
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:1
请输入学生姓名:3
请输入学生id:3
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:4
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:1	ID:4
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:5
请输入学生的ID:4
[4]姓名:1	ID:4
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:6
请输入要修改的位置:4
请输入学生姓名:4
请输入学生id:4
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:5
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
[5]姓名:1	ID:5
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:1
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
[5]姓名:1	ID:5
[6]姓名:1	ID:1
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:7
——————————————
[1]姓名:1	ID:1
[2]姓名:2	ID:2
[3]姓名:3	ID:3
[4]姓名:4	ID:4
[5]姓名:1	ID:5
——————————————
1.添加学生信息	2.遍历学生信息	3.插入学生信息	4.删除学生信息
5.查找学生信息	6.修改学生信息	7.删除重复信息	8.退出信息系统
请输入选项:8
已退出

一个学生信息还可封装在一个学生结构体中,使用顺序结构体嵌套学生结构体。

此方法在一个学生的信息较多时可以使用,方便学生信息覆盖时代码的书写。

 

  • 顺序表

    • 顺序存储的线性表

    • 实现存储的方式

      • 使用数组存储元素,实现逻辑上相连,物理内存也相连

      • 使用malloc在堆区申请一片连续的空间,来存放逻辑相连的数据

    • 顺序表的组成

      • 需要有一个能够存储数据元素的容器,可以是数组,也可以是连续的堆区空间

      • 还需有一个变量来记录当前顺序表的长度(存储元素的个数)

    • 顺序表的结构体原型

      • typedef struct sequence { int data[max];//元素 int len;//长度 }seq, *seq_p; //类型重定义结构体,结构体指针

      • 结构体使用.引出结构体变量 结构体指针使用->引出结构体变量

    • 顺序表的相关函数操作

      • 创建顺序表

        • 在堆区申请空间,返回给main使用

        • 函数返回值类型:顺序表类型的指针

        • 函数名:符合命名规则

        • 参数列表:无

        • 注意事项

          • 申请堆区空间后,判断是否成功

          • 申请成功后,需要将顺序表的长度(为0)和数组初始化

      • 判满

        • 函数功能

          • 判断顺序表存储空间是否存满,即len == max

        • 函数返回值

          • 逻辑判断,存满返回1,不满返回0

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

      • 判空

        • 函数功能

          • 判断顺序表是否为空(即len是否为0)

        • 函数返回值

          • 逻辑判断,为空返回1,有元素返回0

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

      • 数据存储

        • 函数功能

          • 将数据存入顺序表

        • 函数返回值

          • 逻辑值:成功返回1,失败返回0

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

        • 注意事项

          • 判断顺序表是否为满

      • 遍历

        • 函数的功能

          • 依次打印输出顺序表里的数据

        • 函数返回值

          • void

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

        • 注意事项

          • 判断顺序表是否为空

      • 按位置插入

        • 函数的功能

          • 输入位置和数据存入数据表

        • 函数返回值

          • 逻辑值:成功返回1,失败返回0

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

          • 函数内部需要外部传参插入位置和存入数据

        • 注意事项

          • 判断顺序表是否为满

          • 插入位置是否合理

      • 按位置删除

        • 函数的功能

          • 输入位置将数据表中对应的数据删除

        • 函数返回值

          • 逻辑值:成功返回1,失败返回0

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

          • 函数内部需要外部传参删除位置

        • 注意事项

          • 判断顺序表是否为空

          • 删除位置是否合理

      • 修改数据

        • 函数的功能

          • 输入位置将数据表中对应的数据修改

        • 函数返回值

          • 逻辑值:成功返回1,失败返回0

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

          • 函数内部需要外部传参修改位置

        • 注意事项

          • 判断顺序表是否为空

          • 修改位置是否合理

      • 查找数据

        • 函数的功能

          • 输入数据查找对应的数据的位置

        • 函数返回值

          • 找到返回位置,找不到返回0

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

          • 函数内部需要外部传参数据

        • 注意事项

          • 判断顺序表是否为空

      • 去重

        • 函数的功能

          • 删除重复数据

        • 函数返回值

          • void

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

        • 注意事项

          • 判断顺序表是否为空

      • 销毁

        • 函数的功能

          • 释放堆空间

        • 函数返回值

          • void

        • 函数名

          • 符合命名规则

        • 参数列表

          • 顺序表(传顺序表的地址)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/781421.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大模型LLM面试合集】大语言模型基础_llm概念

1.llm概念 1.目前 主流的开源模型体系 有哪些&#xff1f; 目前主流的开源LLM&#xff08;语言模型&#xff09;模型体系包括以下几个&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列&#xff1a;由OpenAI发布的一系列基于Transformer架构…

对话大模型Prompt是否需要礼貌点?

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的QA数据集构建&#xff08;附代码&#xff09;Qwen-2-7B和GLM-4-9B&#x…

Android OpenGL ES 离屏幕渲染1——EGL环境的创建,以及基础概念的理解

创建EGL上下文、配置EGL环境、创建EGL DISPLAY 什么是EGL&#xff1a; 由于OpenGL ES并不负责窗口管理以及上下文管理&#xff0c;该职责由各个平台自行完成&#xff1b;在Android平台下OpenGL ES的上下文环境是依赖EGL的API进行搭建的。 对于EGL这个框架&#xff0c;谷歌已经提…

WAWA鱼曲折的大学四年回忆录

声明&#xff1a;本文内容纯属个人主观臆断&#xff0c;如与事实不符&#xff0c;请参考事实 前言&#xff1a; 早想写一下大学四年的总结了&#xff0c;但总是感觉无从下手&#xff0c;不知道从哪里开始写&#xff0c;通过这篇文章主要想做一个记录&#xff0c;并从现在的认…

那些年背过的面试题——MySQL篇

本文是技术人面试系列 MySQL 篇&#xff0c;面试中关于 MySQL 都需要了解哪些基础&#xff1f;一文带你详细了解&#xff0c;欢迎收藏&#xff01; WhyMysql&#xff1f; NoSQL 数据库四大家族 列存储 Hbase K-V 存储 Redis 图像存储 Neo4j 文档存储 MongoDB 云存储 OSS …

【Gin】项目搭建 一

环境准备 首先确保自己电脑安装了Golang 开始项目 1、初始化项目 mkdir gin-hello; # 创建文件夹 cd gin-hello; # 需要到刚创建的文件夹里操作 go mod init goserver; # 初始化项目&#xff0c;项目名称&#xff1a;goserver go get -u github.com/gin-gonic/gin; # 下载…

C++入门7——string类详解

目录 1.什么是string类&#xff1f; 2.string类对象的常见构造 2.1 string(); 2.2 string (const char* s); 2.3 string (const string& str); 2.4 string (const string& str, size_t pos, size_t len npos); 2.5 string (const char* s, size_t n); 2.7 验证…

模块一SpringBoot(一)

maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置&#xff0c; application.properties会覆盖默认信息&#xff1a; 如覆盖端口号server.port8888

一个最简单的comsol斜坡稳定性分析例子——详细步骤

一个最简单的comsol斜坡稳定性分析例子——详细步骤 标准模型例子—详细步骤 线弹性模型下的地应力平衡预应力与预应变、土壤塑性和安全系数求解的辅助扫描

【深入理解JVM】关于Object o = new Object()

1. 解释一下对象的创建过程 “半初始化”状态通常指的是对象在内存分配后、但在完全初始化之前的一种状态。在Java中&#xff0c;虽然JVM的规范和设计努力避免对象处于这种不稳定的状态&#xff0c;但在多线程环境下&#xff0c;由于指令重排序等并发问题&#xff0c;仍有可能…

通义千问 2,大模型应用开发时的新选择

我在进行 AI 相关的开发中&#xff0c;最常用的模型是通义千问。本地开发的时候&#xff0c;使用 Ollama 来运行 qwen 模型。集成测试和线上环境&#xff0c;使用阿里云模型服务灵积上的通义千问模型。使用阿里云的好处是&#xff1a;模型服务的获取方便&#xff0c;稳定性好&a…

无人机5公里WiFi低延迟图传模组,抗干扰、长距离、低延迟,飞睿智能无线通信新标杆

在科技日新月异的今天&#xff0c;我们见证了无数通信技术的飞跃。从开始的电报、电话&#xff0c;到如今的4G、5G网络&#xff0c;再到WiFi的广泛应用&#xff0c;每一次技术的革新都极大地改变了人们的生活方式。飞睿智能5公里WiFi低延迟图传模组&#xff0c;它以其独特的优势…

GD32实战篇-双向数控BUCK-BOOST-BUCK降压理论基础

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

Java多线程不会?一文解决——

方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例&#xff1a; class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…

kafka-3

Kafka 消费组 consumer-offsets-N 稀疏索引 Kafka集群 集群搭建 集群启动和验证 Topic的意义 Topic和Partition 分区 副本 集群操作指令 多分区&多副本 多分区消费组 Rebalance机制 Rebalance机制处理流程 Rebalance机制-Range Rebalance机制-RoudRobin Rebalance机制-St…

【Linux】在线求助命令--help,man page , info page

我们知道Linux有很多的命令&#xff0c;那LInux要不要背命令&#xff1f; 答案是背最常用的那些就行了 那有的时候我们想查询一些命令的详细用法该怎么办呢&#xff1f; 这里我给出3种方法 1.--help --help的使用方法很简单啊 要查询的命令 --help 我们看个例子 这里我只…

一览 Anoma 上的有趣应用概念

撰文&#xff1a;Tia&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News Anoma 的目标是为应用提供通用的意图机器接口&#xff0c;这意味着使用 Anoma&#xff0c;开发人员可以根据意图和分布式意图机编写应用&#xff0c;而不是根据事务和特定状态机进行…

java原子类

在Java中&#xff0c;原子类&#xff08;Atomic Classes&#xff09; 是位于java.util.concurrent.atomic包中的一组类&#xff0c;这些类提供了一些原子操作&#xff0c;用于在多线程环境下进行安全的并发编程。原子类利用了底层的硬件支持&#xff0c;确保操作的原子性和线程…

初阶数据结构 二叉树常用函数(二)

函数一 求二叉树第K层的节点个数 还是一样 我们假设 K就是等于一 如果说是一个空数的话就返回0 如果说有值的话就返回一个1就可以 假设这个这层既不为空 又不是第K层的话 那么就说明第K层肯定是子树下面 那么就说明是左右子树的第&#xff08;K-1&#xff09;层 那么只将…

谷哥剪映助手使用教程-剪映自动化批量视频剪辑软件-批量混剪素材替换

谷哥剪映助手是一款提高视频剪辑效率的软件&#xff0c;很多人问具体怎么使用&#xff0c;我会抽点时间把各个功能拆分开来&#xff0c;一个个介绍。 一、按组精准替换素材 该功能可以按组精确替换图片或视频素材&#xff0c;如果你草稿里只有一个素材需要替换&#xff0c;请…