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

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

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
        • 函数名

          • 符合命名规则
        • 参数列表

          • 顺序表(传顺序表的地址)
相关推荐
王哈哈^_^23 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城25 分钟前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德41 分钟前
多项式加法——C语言
数据结构·c++·算法
legend_jz43 分钟前
STL--哈希
c++·算法·哈希算法
kingmax542120081 小时前
初三数学,最优解问题
算法
一直学习永不止步1 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
小刘|2 小时前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou2 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
van叶~2 小时前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
简简单单做算法2 小时前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex