DataStructure for the C programming Language day3

class.h

#ifndef __CLASS_H__

#define __CLASS_H__

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX 20

/*

 * 注意scanf的垃圾字符处理问题

*/

typedef struct Student

{

    char name[20];

    char id;    //身份  S:学生    T: 老师

    union

    {

        double score;

        char subject[10];

    };

} Stu;

//定义班级结构体

typedef struct Class

{

    struct Student s[MAX]; //学生数组

    int count;     //表示当前班级的人数

} clsSeqList;


 

double input(clsSeqList *cls);

void output(clsSeqList *cls);

clsSeqList * create_class();

int class_empty(clsSeqList *cls);

int class_full(clsSeqList *cls);

int class_add(clsSeqList *cls,Stu s);

int class_insert_pos(clsSeqList *cls,int pos,Stu s);

int class_delete_pos(clsSeqList *cls,int pos);


 

void input_student(Stu *stu);

#endif

class.c

#include "class.h"

clsSeqList * create_class()

{

    //1.在堆区申请一个顺序表的空间

    clsSeqList *cls = (clsSeqList *)malloc(sizeof(clsSeqList));

    if (NULL == cls)

    {

        printf("class顺序表创建失败\n");

        return NULL;

    }

    //2.初始化顺序表

    cls->count=0;//初始化数组长度

    printf("创建class顺序表成功\n");

    return cls;

}

double input(clsSeqList *cls)

{

    double sum_score = 0;

    while (1)

    {

        printf("请输入学生的姓名:\n");

        //scanf("%s",s[i].name);

        scanf("%s",cls->s[cls->count].name);

        printf("请输入学生的id:\n");

        //吸收垃圾字符   "%*c%c"   getchar()

        scanf("%*c%c",&cls->s[cls->count].id);

        if (cls->s[cls->count].id == 'T')

        {

            printf("请输入老师的课程:\n");

            scanf("%s",cls->s[cls->count].subject);

        }

        if (cls->s[cls->count].id == 'S')

        {

            printf("请输学生的分数:\n");

            scanf("%lf",&cls->s[cls->count].score);

            sum_score += cls->s[cls->count].score;

        }

       

        cls->count++;

        printf("是否继续(yes|no):\n");

        char feedback[20];

        scanf("%s",feedback);

        if (strcmp(feedback,"yes") == 0)

        {

            if (cls->count > MAX)

            {

                printf("班级人数已满,无法继续录入\n");

                break;

            }

           

        } else if (strcmp(feedback,"no") == 0)

        {

            break;

        }

    }

    return sum_score;

}

void output(clsSeqList *cls)

{

     //输出所有人员信息

    for (int i = 0; i < cls->count; i++)

    {

        if (cls->s[i].id=='T')

        {

            printf("%d\t老师姓名:%s\tid:%c\t所教课程:%s\n",i+1,cls->s[i].name,cls->s[i].id,cls->s[i].subject);

        }

        if (cls->s[i].id=='S')

        {

            printf("%d\t学生姓名:%s\tid:%c\t成绩:%.2lf\n",i+1,cls->s[i].name,cls->s[i].id,cls->s[i].score);

        }

    }

}


 

int class_empty(clsSeqList *cls)

{

    return cls->count == 0;

}

int class_full(clsSeqList *cls)

{

    return cls->count == MAX;

}


 

int class_add(clsSeqList *cls,Stu s)

{

    if (NULL == cls || class_full(cls))

    {

        printf("添加学生信息失败\n");

        return -1;

    }

    //添加逻辑

    cls->s[cls->count] = s;

    //表长变化

    cls->count++;

    printf("添加学生信息成功\n");

}

int class_insert_pos(clsSeqList *cls,int pos,Stu s)

{

    if (NULL==cls || class_full(cls) || pos < 0 || pos > cls->count)

    {

        printf("插入学生信息失败\n");

        return -1;

    }

    //腾空

    for (int i = cls->count-1; i >= pos; i--)

    {

        cls->s[i+1] = cls->s[i];

    }

    cls->s[pos] = s;

    cls->count++;

     printf("插入学生信息成功\n");

   

}



 

int class_delete_pos(clsSeqList *cls,int pos)

{

     if (NULL==cls || class_empty(cls) || pos < 0 || pos >= cls->count)

    {

        printf("删除学生信息失败\n");

        return -1;

    }

    for (int i = pos; i < cls->count; i++)

    {

        cls->s[i] = cls->s[i+1];

    }

   

    cls->count--;

    printf("删除学生信息成功\n");

}


 

void input_student(Stu *stu)

{

        printf("请输入学生的姓名:\n");

        //scanf("%s",s[i].name);

        scanf("%s",stu->name);

        printf("请输入学生的id:\n");

        //吸收垃圾字符   "%*c%c"   getchar()

        scanf("%*c%c",&stu->id);

        if (stu->id == 'T')

        {

            printf("请输入老师的课程:\n");

            scanf("%s",stu->subject);

        }

        if (stu->id == 'S')

        {

            printf("请输学生的分数:\n");

            scanf("%lf",&stu->score);

        }

}

main.c

#include "class.h"

#include "class.h"

int main(int argc, char const *argv[])

{

    double sum_score = 0;

    clsSeqList *cls = create_class();

    if (NULL == cls)

    {  

        printf("class 类分配内存失败,请稍后重试");

        return -1;

    }

    sum_score = input(cls);

    output(cls);

    //求出所有学生的总成绩

    printf("所有学生的总成绩为:%.2lf\n",sum_score);

    printf("*****按位插入*********\n");

    Stu stu;

    input_student(&stu);

    class_insert_pos(cls,1,stu);

    output(cls);

    printf("*******按位删除*******\n");

    class_delete_pos(cls,1);

    output(cls);

    free(cls);

    cls=NULL;

    return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值