数据结构学习第3篇 - 线性表的定义与实现

线性表的定义与实现

1.实验类别:基础

2.实验目的:

(1)理解线性表的逻辑结构

(2)理解数据结构的逻辑结构与存储结构之间的关系

(3)掌握线性表的顺序存储结构和链式存储结构

3.实验主要内容:     

利用线性表的顺序存储结构和单链表,分别建立班级学生成绩单应用程序,要求能够插入、查找(按学号查找)、更新(修改成绩)和删除班级学生成绩的信息。

例:班级成绩单

学  号

姓  名

成绩

扫描二维码关注公众号,回复: 5784114 查看本文章

99070101

李  军

98

99070102

王颜霞

86

99070103

孙  涛

56

99070104

单晓宏

96

99070105

张华

83

99070106

李小明

72

99070107

陈小婷

98

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/89006145
今日推荐