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

  • Post author:
  • Post category:其他



线性表的定义与实现

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;

}

}

}



版权声明:本文为guanshanyue96原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。