0718作业+思维导图

一、作业

1.对昨天做的学生管理系统增加增删改查功能

函数声明:

#ifndef TEST_H
#define TEST_H
#include<myhead.h>
#define MAX 100
//结构体输入学生信息
struct Stu 
{
    char name[20];      //姓名
    int age;           //年龄
    int score;      //成绩
};
//结构体输入班级信息
typedef struct Class
{
    struct Stu stu_dent[MAX];
    int num;
}class,*class_ptr;

//菜单函数
void me_nu(void);
//创建班级函数
class_ptr create(int num);
//判空函数
int class_empty(class_ptr C);
//判满函数
int class_full(class_ptr C);
//学生信息录入函数 
void student_1(class_ptr C);
//按成绩降序排序函数
void student_2(class_ptr C);
//成绩最好和最差的学生信息输出函数
void student_3(class_ptr C);
//学生信息输出函数 
void student_4(class_ptr C);
//增加学生信息函数
int student_add(class_ptr C,struct Stu add,int pos); 
//删除学生信息函数
int student_delete(class_ptr C,int pos);
//修改学生信息函数
int student_update(class_ptr C,int pos,struct Stu update);
//查找学生信息函数
int student_search_name(class_ptr C,char name[20]);//按姓名
int student_search_age(class_ptr C,int age);//按年龄
int student_search_score(class_ptr C,int score);//按成绩
//销毁班级函数 
void destroy(struct Class *p);


#endif
 

源代码:

#include"my.h"


//菜单函数
void me_nu(void)
{
    printf("\t\t======1:学生信息录入\n");
    printf("\t\t======2:按成绩降序排序\n");
    printf("\t\t======3:成绩最好和最差的学生信息\n");
    printf("\t\t======4:学生信息输出\n");printf("\t\t======1:学生信息录入\n");
    printf("\t\t======5:增加学生信息\n");
    printf("\t\t======6:删除学生信息\n");
    printf("\t\t======7:修改学生信息\n");
    printf("\t\t======8:按姓名查找学生信息\n");
    printf("\t\t======9:按年龄查找学生信息\n");
    printf("\t\t======10:按成绩查找学生信息\n");
    printf("\t\t======11:销毁班级\n");
    printf("\t\t======0:退出\n");
}

//定义函数创建一个可以容纳整个系统的空间在堆区
class_ptr create(int num)
{
    //在堆区申请1个struct class类型的空间大小
     class_ptr C= (class_ptr)malloc(sizeof(class));
    //申请一个stru stu类型的空间大小
    if(NULL == C)
    {
        printf("申请失败\n");
        return NULL;
    }
    //程序执行至此表示内存申请成功
    //对内存空间进行初始化
    memset(C,0,sizeof(class));
    memset(C->stu_dent,0,sizeof(struct Stu));
    C->num = num;
    //返回内存地址给主函数
    return C;
}

//判空函数
int class_empty(class_ptr C)
{
        return C->num == 0;    
}
//判满函数
int class_full(class_ptr C)
{
    return C->num == MAX;
}

//学生信息录入函数
void student_1(class_ptr C)
{
    
    for(int i=0;i<C->num;i++)
    {
        printf("请输入第%d名学生的姓名\n",i+1);
        scanf("%s",C->stu_dent[i].name);
        printf("请输入第%d名学生的年龄\n",i+1);
        scanf("%d",&C->stu_dent[i].age);
        printf("请输入第%d名学生的成绩\n",i+1);
        scanf("%d",&C->stu_dent[i].score);
    }
    printf("录入成功\n");
}

//按成绩降序排序
void student_2(class_ptr C)
{
    for(int i = 1;i<C->num;i++)
    {
        for(int j=0;j<C->num-i;j++)
        {
            if(C->stu_dent[j].score<C->stu_dent[j+1].score)
        {
           //交换三部曲
           struct Stu temp = C->stu_dent[j];
           C->stu_dent[j] = C->stu_dent[j+1];
           C->stu_dent[j+1] = temp;
        }
        }
    }
    printf("排序成功\n");
}

//成绩最好和最差的学生成绩
void student_3(const class_ptr C)
{
    
    int best = C->stu_dent[0].score;
    int worst = C->stu_dent[0].score;
    int count1=0;
    int count2 = 0;
    //将第一位学生当做最值
    for(int i=0;i<C->num;i++)
    {
        
        if(best<C->stu_dent[i].score)
        {
            best = C->stu_dent[i].score;
            count1 = i;
        }
    }
     for(int i=0;i<C->num;i++)
    {
         if(worst>C->stu_dent[i].score)
        {
            worst = C->stu_dent[i].score;
            count2 = i;
        }
    }
     printf("成绩最好的学生信息为:%s\t%d\t%d\n",C->stu_dent[count1].name,C->stu_dent[count1].age,C->stu_dent[count1].score);
     printf("成绩最差的学生信息为:%s\t%d\t%d\n",C->stu_dent[count2].name,C->stu_dent[count2].age,C->stu_dent[count2].score);
}
//学生信息输出
void student_4(const class_ptr C)
{
   printf("排序后的学生信息如下:\n");
   printf("姓名\t年龄\t成绩\n");
   for(int i=0;i<C->num;i++)
   {
       printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
   }
}
//增加学生信息到指定位置
int student_add(class_ptr C,struct Stu add,int pos)
{
    //判断是否可以进行添加操作
    if(C == NULL||class_full(C)||pos<0||pos>C->num)
    {
        printf("添加失败\n");
        return -1;
    }
    //为要添加的学生信息挪出空位
    for(int i=C->num-1;i>=pos;i--)
    {
        strcpy(C->stu_dent[i+1].name,C->stu_dent[i].name);
        C->stu_dent[i+1].age = C->stu_dent[i].age;
        C->stu_dent[i+1].score = C->stu_dent[i].score;
    }
    //添加学生信息
    strcpy(C->stu_dent[pos].name,add.name);
    C->stu_dent[pos].age = add.age;
    C->stu_dent[pos].score = add.score;
    //
    C->num++;
    printf("添加成功\n");
    return 0;
}
//删除指定位置的学生信息
int student_delete(class_ptr C,int pos)
{
    //判断是否可以进行删除操作
    if(C == NULL||class_empty(C)||pos<0||pos>=C->num)
    {
        printf("添加失败\n");
        return -1;
    }
    //删除该学生信息
    for(int i=pos+1;i<C->num;i++)
    {
        strcpy(C->stu_dent[i-1].name,C->stu_dent[i].name);
        C->stu_dent[i-1].age = C->stu_dent[i].age;
        C->stu_dent[i-1].score = C->stu_dent[i].score;
    }
    C->num--;
    printf("删除成功\n");
    return 0;
}
//修改指定位置的学生信息
int student_update(class_ptr C,int pos,struct Stu update)
{
    //判断是否可以进行修改操作
    if(C == NULL||class_empty(C)||pos<0||pos>=C->num)
    {
        printf("修改失败\n");
        return -1;
    }
    //修改学生信息
    strcpy(C->stu_dent[pos].name,update.name);
    C->stu_dent[pos].age = update.age;
    C->stu_dent[pos].score = update.score;

    return 0;
}
//查找名叫××的学生
int student_search_name(class_ptr C,char name[20])
{
    for(int i=0;i<C->num;i++)
    {
        if(strcmp(name,C->stu_dent[i].name)==0)
        {
            printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
        return 0;
        }
    }
    printf("没有找到该学生\n");
    return -1;
}
//查找年龄为××的学生
int student_search_age(class_ptr C,int age)
{
    for(int i=0;i<C->num;i++)
    {
        if(age==C->stu_dent[i].age)
        {
            printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
        return 0;
        }
    }
    printf("没有找到该学生\n");
    return -1;
}
//查找成绩为××的学生
int student_search_score(class_ptr C,int score)
{
    for(int i=0;i<C->num;i++)
    {
        if(score == C->stu_dent[i].score)
        {
            printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
        return 0;
        }
    }
    printf("没有找到该学生\n");
    return -1;
}
//定义函数销毁该班级
void destroy(class_ptr C)
{
    if(NULL != C)
    {
        free(C);
        C  = NULL;
    }
    printf("销毁成功\n");
}


 

主程序:

#include<myhead.h>
#include"my.h"

int main(int argc,char const *argv)
{
    
    int num =0;
    printf("请输入该班级人数:\n");
    scanf("%d",&num);
    class_ptr C = create(num);//调用函数创建一个班级
    int menu = 0;//定义菜单元素
    struct Stu add;//定义一个要被添加的学生信息数组
    struct Stu update;//定义一个要被修改的学生信息数组
    //memset(struct Stu add,0,sizeof(struct Stu));
    int pos = 0;//定义添加或删除学生信息的位置
    char name[20]  = {};//定义一个要被查找的姓名信息
    int age = 0;//定义一个要被查找的年龄信息
    int score = 0;//定义一个查找的成绩信息


    //使用菜单函数
    while(1)
    {
        me_nu();
        printf("请输入:");
        scanf("%d",&menu);
        getchar();
    

    
    //菜单
    switch(menu)
    {
         case 1:
        {
            student_1(C);
        }
        break;
         case 2:
        {
           student_2(C);
        }
        break;
         case 3:
        {
            student_3(C);
        }
        break;
        case 4:
        {
            student_4(C);
        }
        break;
        case 5:
        {
            printf("请输入添加的学生信息:\n");
            scanf("%s%d%d",add.name,&add.age,&add.score);
            getchar();//吸收空行
            printf("请输入该生要被添加到的位置:\n");
            scanf("%d",&pos);
            student_add(C,add,pos);
            printf("添加该学生信息后的学生信息为:\n");
            student_4(C);
        }
        break;
        case 6:
        {
            printf("请输入要被删除的学生的位置:\n");
            scanf("%d",&pos);
            student_delete(C,pos);
            printf("删除该生后的学生信息为:\n");
            student_4(C);
        }
        break;
        case 7:
        {
            printf("请输入要修改的学生信息:\n");
            scanf("%s%d%d",update.name,&update.age,&update.score);
            getchar();//吸收空行
            printf("请输入该生要被修改到的位置:\n");
            scanf("%d",&pos);
            student_update(C,pos,update);
            printf("修改该学生信息后的学生信息为:\n");
            student_4(C);
        }
        break;
        case 8:
        {
            printf("请输出要查找的学生姓名:\n");
            scanf("%s",name);
            student_search_name(C,name);
        }
        break;
        case 9:
        {
            printf("请输出要查找的学生年龄:\n");
            scanf("%d",&age);
            student_search_age(C,age);
        }
        break;
        case 10:
        {
            printf("请输出要查找的学生成绩:\n");
            scanf("%d",&score);
            student_search_score(C,score);
        }
        break;
          case 11:
        {
            destroy(C);
            C = NULL;
        }
        break;
         case 0:
        {
            goto END;
        }
        default:
        printf("您输入的内容有误,请重新输入\n");
    }
    }
    END:
    return 0;
}
 

2.顺序表

函数声明:

#ifndef SEQLIST_H
#define SEQLIST_H
#include<myhead.h>

#define MAX 20            //顺序表最大容量
typedef int datatype;     //数据元素类型
//定义顺序表结构类型
typedef struct
{
    datatype data[MAX];   //存放顺序表的数组
    int len;              //顺序表长度
}SeqList,*SeqListPtr;

//声明顺序表创建函数
SeqListPtr list_create();

//判空函数
int list_empty(SeqListPtr L);

//判满函数
int list_full(SeqListPtr L);

//添加元素
int list_add(SeqListPtr L,datatype e);

//遍历顺序表
void list_show(SeqListPtr L);

//定义任意位置插入函数
int list_insert_pos(SeqListPtr L,int pos,datatype e);

//定义任意位置删除函数
int list_delete_pos(SeqListPtr L,int pos);

//定义按值查找位置函数
int list_search_value(SeqListPtr L,datatype e);

//定义按位置进行修改
int list_update_pos(SeqListPtr L,int pos,datatype e);

//按值进行修改
int list_update_value(SeqListPtr L,datatype old_e,datatype new_e);

#endif
//防止重复包含

源代码:

#include"seqlist.h"


//声明顺序表创建函数
SeqListPtr list_create()
{
    //在堆区申请一个顺序表的大小空间
    SeqListPtr L = (SeqListPtr)malloc(sizeof(SeqList));
    if(NULL == L)
    {
        printf("创建失败\n");
        return NULL;
    }
    //程序执行至此表示创建成功
    memset(L->data,0,sizeof(SeqList));   //将数组初始化
    L->len = 0;//顺序长度为0

    printf("创建成功\n");

    return L;
}

//判空函数,空回真,非空回真
int list_empty(SeqListPtr L)
{
    return L->len==0;
}
//判满函数,满回真,非满回假
int list_full(SeqListPtr L)
{
    return L->len==MAX;
}
//添加元素
int list_add(SeqListPtr L,datatype e)
{
    //判断逻辑
    if(NULL==L||list_full(L))
    {
        printf("添加失败\n");
        return -1;
    }
    //添加逻辑
    L->data[L->len] = e;

    //表的变化
    L->len++;
    printf("添加成功\n");
    return 0;
}


//遍历顺序表
void list_show(SeqListPtr L)
{
    //判断逻辑
    if(NULL == L||list_empty(L))
    {
        printf("遍历失败\n");
        return ;
    }
    //遍历
    printf("顺序表中的元素分别是:");
    for(int i=0;i<L->len;i++)
    {
        printf("%d\t",L->data[i]);
    }
    printf("\n");
}

//定义任意位置插入函数
int list_insert_pos(SeqListPtr L,int pos,datatype e)
{
    //判断逻辑
    if(NULL ==L||list_full(L)||pos<0||pos>L->len)
    {
        printf("插入失败\n");
        return -1;
    }
    //腾空逻辑
    for(int i=L->len-1;i>=pos;i--)
    {
        L->data[i+1]=L->data[i];  //将前面的元素后移
    }
    //插入数据
    L->data[pos] = e;
    printf("插入成功\n");
    //表长变化
    L->len++;
    return 0;
}

//定义任意位置删除函数
int list_delete_pos(SeqListPtr L,int pos)
{
    //判断逻辑
    if(NULL == L||list_empty(L)||pos<0||pos>=L->len)
    {
        printf("删除失败\n");
        return -1;
    }
    //删除逻辑
    for(int i=pos+1;i<L->len;i++)
    {
        L->data[i-1] = L->data[i];
    }
    //表长变化
    L->len--;
    printf("删除成功\n");
    return 0;
}

//定义按值查找位置函数
int list_search_value(SeqListPtr L,datatype e)
{
    //判断逻辑
    if(NULL == L||list_empty(L))
    {
        printf("查找失败\n");
        return -1;
    }
    //遍历顺序表
    for(int i=0;i<L->len;i++)
    {
        if(L->data[i]==e)
        {
            return i;//返回查找到的数据下标
        }
    }
    printf("没找到\n");
    return -1;
}

//定义按位置进行修改
int list_update_pos(SeqListPtr L,int pos,datatype e)
{
    //判断逻辑
    if(NULL==L||list_empty(L)||pos<0||pos>=L->len)
    {
        printf("修改失败\n");
        return -1;
    }
    //正常进行修改
    L->data[pos] = e;
    printf("修改成功\n");
    return 0;
}

//按值进行修改
int list_update_value(SeqListPtr L,datatype old_e,datatype new_e)
{
    //判断逻辑
    if(NULL ==L||list_empty(L))
    {
        printf("修改失败\n");
        return -1;
    }
    //根据旧值找位置
    int res = list_search_value(L,old_e);
    if(res == -1)
    {
        printf("没有要改的值\n");
        return-1;
    }
    //调用函数按位置修改
    list_update_pos(L,res,new_e);
    printf("修改成功\n");
    return 0;
}
 

主程序:

#include<myhead.h>
#include"seqlist.h"


int main(int argc,char const *argv)
{
    //创建一个顺序表
    SeqListPtr L = list_create();
    if(NULL == L)
    {
        return -1;
    }
    list_add(L,520);
    list_add(L,999);
    list_add(L,480);
    //调用遍历函数
    list_show(L);
    //调用任意位置插入函数
    list_insert_pos(L,0,100);
    list_insert_pos(L,2,100);
    list_insert_pos(L,5,100);
    list_show(L);
    //调用任意位置删除函数
    list_delete_pos(L,0);
    list_show(L);
    //调用函数查找位置函数
    int res = list_search_value(L,999);
    if(res>=0)
    {
        printf("您要找的数在%d个位置上\n",res+1);
    }
    //调用函数按位置修改
    list_update_pos(L,4,666);
    list_show(L);
    //调用函数按值修改
    list_update_value(L,999,888);
    list_show(L);
    return 0;
}
 

二、思维导图

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值