数据结构学习第2篇 - 结构体的定义及使用方法,动态内存管理

C语言复习2

1.实验类别:基础

2.实验目的:

(1)掌握结构体的定义及使用方法。

(2)掌握C语言的动态内存管理。

3.实验主要内容:     

假设一个班由一名教师和若干学生(<=5人)组成,教师信息包括工号、姓名,学生信息包括学号、姓名和专业。请编写程序,用来模拟班级的管理(班级信息输出、查找学生(输出学生信息)、插入学生、删除学生)。

要求:(1)老师、学生需定义为结构体。

     (2)班级中学生需根据学生实际人数动态分配空间。

     (3)各功能需单独封装函数。

     (4)代码编写规范(空行、注释、参数及类型命名等)

4.实验类型:综合、设计

5.实验要求:必修

6.主要仪器:计算机


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 3

//定义教师
//tno--老师工号,tname--老师姓名
typedef struct teacher
{
    int tno;
    char tname[MAXSIZE];
} Teacher;

//定义学生
//sno--学生学号,sname--学生姓名,major--学生专业
typedef struct student
{
    int sno;
    char sname[MAXSIZE];
    char major[MAXSIZE];
} Student;

//定义班级
//tea--数据域,存放老师的地址;stu[MAXSIZE]--指针域,存放多个学生信息
typedef struct classinfo
{
    Teacher tea;
    Student* stu[MAXSIZE];
    int n;
}Classinfo;

//初始化班级
//返回值:班级结构体指针  
Classinfo *init()
{
    //动态分配空间
    Classinfo *pc=(Classinfo *)malloc(sizeof(Classinfo));
    if(pc)
    {
        //初始化教师信息
        printf("请输入教师信息(工号,姓名):");
        scanf("%d,%s",&(pc->tea).tno,(pc->tea).tname);
        
        //初始化学生信息
        pc->n=0;
        for(int i=0;i<MAXSIZE;i++)
            pc->stu[i]=NULL;
    }    
    
    return pc;
}

//打印学生信息
//参数ps:学生指针
void printStudent(Student *ps)
{
    printf("%d\t%s\t%s",ps->sno,ps->sname,ps->major);    
    printf("\n");
}

//打印班级信息
//参数pc:班级指针
void printClassinfo(Classinfo *pc)
{
    //打印教师信息    
    printf("教师信息(工号\t姓名):");
    Teacher pt=pc->tea;
    printf("%d\t%s\n",pt.tno,pt.tname);
    
    //打印学生信息
    printf("学生信息(学号\t姓名\t专业):\n");
    for(int i=0;i<pc->n;i++)
        printStudent(pc->stu[i]);
        
    printf("\n");
}

//插入学生
//参数pc:班级指针,参数stu:学生指针
//返回值:1:成功,0:失败(空间满)
int inserStu(Classinfo *pc,Student *stu)
{
    if(pc->n==MAXSIZE)
        return 0;
    else
    {
        pc->stu[pc->n]=stu;
        pc->n++;
        return 1;
    }
}
 
//搜索学生所在位置
//参数pc:班级指针;返回值i:搜索学生的下标
int searchStu(Classinfo *pc)
{
    int number,i=0;
    printf("请输入你要查找的学生学号:");
    scanf("%d",&number);
    
    //判断是否有这名学生
    while(number!=(pc->stu[i])->sno)
    {
        i++;
        
        //判断i的值是否超过有效长度
        if(i>=pc->n)
        {
            return -1;  
        }
    }
    return i;
}

 
int deleteStu(Classinfo *pc,Student *stu)
{
    return 0;
}

//插入学生
//参数pc:班级指针
void Insert(Classinfo *pc)
{
    int no;
    char name[MAXSIZE],major[MAXSIZE];
    
    //输入待插入学生的信息
    printf("请输入要插入学生的学号:");    
    scanf("%d",&no);
    printf("请输入要插入学生的姓名:");    
    scanf("%s",name);
    printf("请输入要插入学生的专业:");    
    scanf("%s",major);
    
    //构造待插入学生的指针    
    Student *stu=(Student *)malloc(sizeof(Student));
    stu->sno=no;
    strcpy(stu->sname,name);
    strcpy(stu->major,major);
    
    //插入操作
    int ret=inserStu(pc,stu);
    
    //输出插入结果
    if(ret)
        printf("插入成功\n");
    else
        printf("空间满,插入失败\n");
}

//搜索学生并打印该学生信息
//参数pc:班级指针
void Search(Classinfo *pc)
{    
    int i=searchStu(pc);
    
    //判断是否搜索成功
    if(i==-1)
    {
        printf("查无此人!\n");
        return;
    }
    
    //输出学生信息
    printf("查找学生的信息:");
    printf("%d\t%s\t%s\n",(pc->stu[i])->sno,(pc->stu[i])->sname,(pc->stu[i])->major);
}

//删除学生
//pc:班级指针
void Delete(Classinfo *pc)
{
    int i=searchStu(pc);
    
    //判断是否搜索成功
    if(i==-1)
    {
        printf("查无此人!\n");
        return ;
    }

    //把该学生结构体所占的动态内存释放
    free(pc->stu[i]);
    
    //把指向该学生地址的指针置为空
    pc->stu[i]=NULL;  
    
    //判断是否该i是否为数组最后一个下标,若不是,把后一个指针变量值覆盖前一个
    for(;i<(pc->n)-1;i++)
    {    
        pc->stu[i]=pc->stu[i+1];
    }
    
    //把原来有效长度最后一个指针指向NULL,防止指针越界
    pc->stu[i]=NULL;
    
    //有效个数减一
    pc->n--;
    
    printf("删除成功!\n");
}

//释放指针(*pc)指向的空间,同时将(*pc)值置为空
void destroy(Classinfo **pc)
{    
    if((*pc)!=NULL)
    {
        if((*pc)->n>0)
        {
            for(int i=0;i<(*pc)->n;i++)
            {
                free((*pc)->stu[i]);
                (*pc)->stu[i]=NULL;
            }
        }
        
        free((*pc));
        (*pc)=NULL;    
    }
}

void printChoice()
{
    printf("\n请选择功能:\n");
    printf("\t1.打印班级信息\n");
    printf("\t2.查找学生\n");
    printf("\t3.插入学生\n");
    printf("\t4.删除学生\n");
    printf("\t5.退出程序\n");
    printf("请选择:");
}


int main()
{
    Classinfo *pc=init();
    if(!pc)
    {
        printf("空间分配失败");
        return 0;
    }
    int choice=-1;
    
    while(1)
    {
        printChoice();
        scanf("%d",&choice);
        
        switch(choice)
        {
            //打印班级信息
            case 1:
                   printClassinfo(pc);
                   break;
                   
            //查找学生
            case 2:
                   Search(pc);
                   break;
                   
            //插入学生
            case 3:
                     Insert(pc);
                   break;
                   
            //删除学生
            case 4:
                     Delete(pc);
                      break;
                      
               //退出程序
            case 5:
                   destroy(&pc);
                   return 0;
            default:
                   printf("输入错误");
                      break;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/guanshanyue96/article/details/89006085