线性表的定义与实现
1.实验类别:基础
2.实验目的:
(1)理解线性表的逻辑结构
(2)理解数据结构的逻辑结构与存储结构之间的关系
(3)掌握线性表的顺序存储结构和链式存储结构
3.实验主要内容:
利用线性表的顺序存储结构和单链表,分别建立班级学生成绩单应用程序,要求能够插入、查找(按学号查找)、更新(修改成绩)和删除班级学生成绩的信息。
例:班级成绩单
学 号 |
姓 名 |
成绩 |
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;
}
}
}