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

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

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; 并查集…

PHP-实例-文件上传

1 需求 2 basename 在 PHP 中&#xff0c;basename() 函数用于返回路径中的文件名部分。如果路径中包含了文件扩展名&#xff0c;则该函数也会返回它。如果路径的结尾有斜杠&#xff08;/&#xff09;或反斜杠&#xff08;\&#xff09;&#xff0c;则 basename() 函数会返回空…

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

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

Laravel HTTP客户端:网络请求的瑞士军刀

标题&#xff1a;Laravel HTTP客户端&#xff1a;网络请求的瑞士军刀 Laravel的HTTP客户端是一个功能强大的工具&#xff0c;它提供了一种简洁、直观的方式来发送HTTP请求。无论是与外部API集成&#xff0c;还是进行网络数据抓取&#xff0c;Laravel的HTTP客户端都能满足你的需…

小红书选品中心商家采集 小红书商家电话采集软件

可采集名称销量评分联系方式等 需要有1000粉丝以上已实名认证过的小红书达人才可以使用 以下是一个示例程序&#xff0c;可以用于批量获取小红书选品中心商家的信息&#xff1a; import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…

git 添加本地分支, clean

//以develop为源创建本地分支fromdevelop git checkout -b fromdevelop git add . git commit -m "local" git checkout -b local/dev //切换到远程分支. git checkout dev git clean_git clean -f -d-CSDN博客 git clean -f -d #删除当前目录下没有被track…

RAC spfile 坑 +data INSTANCE_NUMBER thread x is mounted by another instance

RAC相关三个参数 thread reset 就可以默认 instance_number 需要单独设置 sid‘SIDX’ cluster_database boolean TRUE SQL> alter system reset instance_number sid* scopespfile; alter system reset instance_number sid* scopespfile …

解析Torch中`Transformer`

解析torch官方代码脚本文件&#xff1a;transformer.py。版本&#xff1a;1.9.1cu111。 首先查看《Torch中多头注意力MultiheadAttention的中文注释》解析&#xff1b; 最后查看下方transformer解析。 话不多说&#xff0c;看代码吧&#xff01; import copy from typing imp…

Vue的学习之class与style绑定

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的学习</title><script src"vue.js" type"text/javascript" charset"utf-8"></script></head><body><…

如何在std::map中查找元素

在std::map中查找元素可以通过几种不同的方式完成&#xff0c;但最常用的方法是使用find成员函数。std::map是一个基于键值对的关联容器&#xff0c;其中每个元素都是一个键值对。键是唯一的&#xff0c;并且用于排序和快速查找。 使用find成员函数 find成员函数接受一个键作…

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;他…

FastAPI+SQLAlchemy数据库连接

FastAPISQLAlchemy数据库连接 目录 FastAPISQLAlchemy数据库连接配置数据库连接创建表模型创建alembic迁移文件安装初始化编辑env.py编辑alembic.ini迁移数据库 视图函数查询 配置数据库连接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…

9、程序化创意

程序化创意 程序化创意&#xff08;Programmatic Creative&#xff09;是指通过自动化的方式制作并优化广告创意&#xff0c;以提高广告效果。针对不同受众的多样化需求&#xff0c;以及同一受众在不同场景下的消费需求&#xff0c;程序化创意能够自动生成个性化的精准创意&am…

《C语言》预处理

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

在网站存在漏洞的情况下强化安全防御

一、引言 网络安全是一个持续的战斗&#xff0c;尤其是在网站存在已知或未知漏洞的情况下。本文将探讨如何在网站存在漏洞的情况下&#xff0c;采取有效措施进行安全防御。 二、理解漏洞 首先&#xff0c;我们需要理解网站的漏洞。这些可能包括SQL注入、跨站脚本&#xff08…

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

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

深入Laravel服务容器:构建灵活应用的秘诀

标题&#xff1a;深入Laravel服务容器&#xff1a;构建灵活应用的秘诀 Laravel框架的服务容器是一个强大的工具&#xff0c;它负责管理类的依赖关系和执行依赖注入&#xff08;DI&#xff09;。服务容器是Laravel依赖注入系统的核心&#xff0c;使得应用组件之间的耦合度降低&…