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

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

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 8typedef 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.mzph.cn/diannao/42625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0301STM32GPIO外设输出

STM32GPIO外设输出 STM32内部的GPIO外设GPIO简介基本结构GPIO位结构输入部分&#xff1a;输出部分&#xff1a; GPIO八种工作模式浮空/上拉/下拉输入模拟输入开漏/推挽输出复用开漏/推挽输出 手册寄存器描述GPIO功能描述外设的GPIO配置GPIO寄存器描述端口输入数据寄存器端口输出…

QT入门笔记-自定义控件封装 30

具体代码如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

并查集(还有反集也在)

一.定义 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所谓的并、查&#xff09;。比如说&#xff0c;我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成&#xff1a; 并查集…

Android计算器界面的设计——表格布局TableLayout实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button等实现一个计算器界面&#xff0c;界面如图1所示。 图1 计算器界面效果图 任务分析 界面整体使用表格布局&#xff0c;第一行使用一个TextView控件&#xff0c;横跨4列&#xff0c;中间4行4列&#xff0c;最后一…

io流 多线程

目录 一、io流 1.什么是io流 2.流的方向 i.输入流 ii.输出流 3.操作文件的类型 i.字节流 1.拷贝 ii.字符流 ​3.字符流输出流出数据 4.字节流和字符流的使用场景 5.练习 6.缓冲流 1.字节缓冲流拷贝文件 2.字符缓冲流特有的方法 1.方法 2.总结 7.转换流基本用法…

第2集《修习止观坐禅法要》

请打开补充讲表第一面&#xff0c;附表一、念佛摄心方便法。 我们前面讲到修止&#xff0c;就是善取所缘境的相貌&#xff0c;然后心于所缘&#xff0c;专一安住&#xff1b;心于所缘&#xff0c;相续安住&#xff1b;达到心一境性的目的。 站在修学净土的角度&#xff0c;他…

《C语言》预处理

文章目录 一、预定义符号二、#define定义常量三、#define定义宏四、宏更函数的对比五、#和##1、#运算符2、##运算符 一、预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;在预处理期间进行处理的。 __FILE__//进行编译的源文件 __LINE__//文件当前的…

【数据结构与算法】插入排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

人工智能、机器学习、神经网络、深度学习和卷积神经网络的概念和关系

人工智能&#xff08;Artificial Intelligence&#xff0c;缩写为AI&#xff09;--又称为机器智能&#xff0c;是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组成部分&#xff0c;它企图了解智能的实质…

【问题解决】 pyocd 报错 No USB backend found 的解决方法

pyocd 报错 No USB backend found 的解决方法 本文记录了我在Windows 10系统上遇到的pyocd命令执行报错——No USB backend found 的分析过程和解决方法。遇到类似问题的朋友可以直接参考最后的解决方法&#xff0c;向了解问题发送原因的可以查看原因分析部分。 文章目录 pyoc…

排序-java(插入排序和选择排序)

一&#xff0c;分类 主要的排序大致分为以下几类&#xff1a; 1&#xff0c;插入排序&#xff0c;又分为直接插入排序和希尔排序 2&#xff0c;选择排序&#xff0c;又分为选择排序和堆排序 3&#xff0c;交换排序&#xff0c;又分为冒泡排序和快速排序 4&#xff0c;归并…

springboot配置扫描生效顺序

文章目录 举例分析项目结构如下noddles-user-backend 两个配置文件noddles-user-job 配置文件noddles-user-server 配置文件问题:server和Job启动时对应加载的数据库配置为哪一个&#xff1f; 总结 在微服务架构中&#xff0c;backend模块会定义一个基础的配置文件&#xff0c;…

Report Design Analysis报告之logic level详解

目录 一、前言 二、Logic Level distribution 2.1 logic level配置 2.2 Logic Level Distribution报告 2.3 Logic Level 报告详情查看 2.4 Route Distributions 报告详情查看 2.5 示例代码 一、前言 ​在工程设计中&#xff0c;如果需要了解路径的逻辑级数&#xff0c;可…

卷积神经网络基础篇

文章目录 1、卷积层1.1、激活函数1.3、sigmoid1.4、Tanh1.5、ReLU1.6、Leaky ReLU1.7、误差计算 2、池化层3、全连接层4、CNN训练 参考链接1 参考链接2 1、卷积层 卷积层&#xff08;Convolutional layer&#xff09;&#xff0c;这一层就是卷积神经网络最重要的一个层次&…

动手学深度学习(Pytorch版)代码实践 -循环神经网络- 56门控循环单元(`GRU`)

56门控循环单元&#xff08;GRU&#xff09; 我们讨论了如何在循环神经网络中计算梯度&#xff0c; 以及矩阵连续乘积可以导致梯度消失或梯度爆炸的问题。 下面我们简单思考一下这种梯度异常在实践中的意义&#xff1a; 我们可能会遇到这样的情况&#xff1a;早期观测值对预测…

机器人动力学模型及其线性化阻抗控制模型

机器人动力学模型 机器人动力学模型描述了机器人的运动与所受力和力矩之间的关系。这个模型考虑了机器人的质量、惯性、关节摩擦、重力等多种因素&#xff0c;用于预测和解释机器人在给定输入下的动态行为。动力学模型是设计机器人控制器的基础&#xff0c;它可以帮助我们理解…

2024/7/7周报

文章目录 摘要Abstract文献阅读题目问题本文贡献问题描述图神经网络Framework实验数据集实验结果 深度学习MAGNN模型相关代码GNN为什么要用GNN&#xff1f;GNN面临挑战 总结 摘要 本周阅读了一篇用于多变量时间序列预测的多尺度自适应图神经网络的文章&#xff0c;多变量时间序…

SAP已下发EWM的交货单修改下发状态

此种情况针对EWM未接收到ERP交货单时&#xff0c;可以使用此程序将ERP交货单调整为未分配状态&#xff0c;在进行调整数据后&#xff0c;然后使用VL06I&#xff08;启用自动下发EWM配置&#xff0c;则在交货单修改保存后会立即下发EWM&#xff09;重新下发EWM系统。 操作步骤如…

3ds Max渲染曝光过度怎么办?

3dmax效果图云渲染平台——渲染100 以3ds Max 2025、VR 6.2、CR 11.2等最新版本为基础&#xff0c;兼容fp、acescg等常用插件&#xff0c;同时LUT滤镜等参数也得到了同步支持。 注册填邀请码【7788】可领30元礼包和免费渲染券哦~ 遇到3ds Max渲染过程中曝光过度的问题&#xf…

SLF4J的介绍与使用(有logback和log4j2的具体实现案例)

目录 1.日志门面的介绍 常见的日志门面 &#xff1a; 常见的日志实现&#xff1a; 日志门面和日志实现的关系&#xff1a; 2.SLF4J 的介绍 业务场景&#xff08;问题&#xff09;&#xff1a; SLF4J的作用 SLF4J 的基本介绍 日志框架的绑定&#xff08;重点&#xff09…