admin 管理员组

文章数量: 887021


2024年2月7日发(作者:matlab随机数rand)

实验项目

实验地点

一、实验目的

线性表存储结构及实现

参与人员

个人

实验次序

实验日期

1、掌握线性表的概念及实现方式

2、熟悉线性表的存储结构及运算

二、实验环境

VS2010

三、实验内容

1、内容描述

定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 给定一个学生信息,插入到表中指定的位置;

(5) 删除指定位置的学生记录;

(6) 统计表中学生个数。

2、实现代码

1

#include

#include

#include

#define MAXSIZE 100

typedef struct{

char no[50];

char name[50];

int price;

}Student;

typedef struct{

Student elem[MAXSIZE];

int length;

}SqList;

int Locate(SqList L);

int InsList(SqList &L,int i,Student e);

int DelList(SqList L,int i);

int main()

2

{

int i,x,a,temp,select,sum=0,c;

SqList L;

Student m,e;

printf("********************************************************************n");

printf("* 1. 逐个显示学生表中所有学生的相关信息;

*n");

printf("* 2. 根据姓名进行查找,返回此学生的学号和成绩; *n");

printf("* 3. 给定一个学生信息,插入到表中指定的位置;

*n");

printf("* 4. 删除指定位置的学生记录;

*n");

printf("* 5. 统计表中学生个数;

*n");

printf("*

*n");

printf("********************************************************************n");

printf("n");

printf("录入学生信息n");

3

6. 退出。

printf("请输入学生的数量:");

scanf("%d",&x);

printf("n");

sum=x;

for(i=0;i

{

printf("第%d位学生信息n",i+1);

printf("n");

printf("学号:");

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

printf("-----------------------------n");

printf("姓名:");

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

printf("-----------------------------n");

printf("成绩:");

scanf("%d",&[i].price);

printf("-----------------------------n");

}

=x;

printf("n");

while(true)

{

4

printf("请选择你要操作的选项:");

scanf("%d",&select);

printf("n");

switch(select)

{

case 1:

printf("所有学生的相关信息为:nn");

for(i=0;i<;i++)

{

printf("学号:%s 姓名:%s 成绩:%dnn",[i].no,[i].name,[i].price);

}

printf("n");

break;

case 2:

printf("请输入你要查找的姓名:");

scanf("%s",);

temp=Locate(L);

5

if(temp!=0)

printf("学号:%s 成绩:%dnn",[temp-1].no,[temp-1].price);

else

printf("查找失败!nn");

break;

case 3:

printf("请输入你要插入的位置:");

scanf("%d",&a);

printf("请输入插入学生信息:n");

printf("学号:");

scanf("%s",);

printf("姓名:");

scanf("%s",);

printf("成绩:");

scanf("%d",&);

if(InsList(L,a,m))

{

6

sum++;

printf("插入成功!nn");

}

else

printf("插入失败!nn");

break;

case 4:

printf("请输入要删除学生的位置:");

scanf("%d",&c);

if(DelList(L,c))

{

sum--;

printf("删除成功!nn");

}

else

printf("删除失败!nn");

break;

case 5:

7

{

printf("总学生个数为:%dnn",sum);

}

break;

case 6:

{

printf("n退出系统成功!请按任意键结束!n");

exit(0);

}

break;

}

}

return 0;

}

int Locate(SqList L) //按照姓名查找

{ Student e;

int i;

for(i=0;i<+1;i++)

{

if(!strcmp([i].name,)) //比较两个字符串是否相同

8

return i+1;

}

return 0;

}

int InsList(SqList &L,int i,Student e) //插入学生信息

{ /*在L中第i个位置之前插入新的数据元素e,L的长度加1*/

int k;

if(i<1||(i>+2))

{

return 0;

}

for(k=;k>=i-1;k--) //元素向后移动位置

[k+1]=[k];

[i-1]=e;

++;

return 1;

}

int DelList(SqList L,int i) //删除指定位置学生记录

{

int k;

9

if(i<1||i>+1)

return 0;

for(k=i;k<=;k++)

{

[k-1]=[k]; //将后面元素依次前移

}

--;

return 1;

}

四、实验体会

1、存在问题

1.

起初未将变量名启用数组的形式,通过调试发现姓名无法储存,学号只能储存一位数字,深刻体会存储字节的问题。

2.

10

关于结构体的嵌套,如何引用其中变量问题有了深刻体会。

3.

观察到老师给的代码中sqlist

&L,而我均未使用&引用符号,依然可以运行。于是查找资料编写

11

此时的Head(地址)的值与L相同!

若将引用符号&删去,则L不将改变Head的值,故&有种将传进去的参数“带出来”的作用。

于是发现即便插入了数据,再次输出时未显示插入的数据,于是进行改进加上&

12

果然插入的信息可以输出。

2、心得体会

1. 复习了switch case 以及strcmp比较函数的用法;

2. 学会增删操作中元素前后移的实现;

3.

这次实验让我真正的明白了sqList &L的使用:在函数调用中引用变量一定要初始化才可以使用。要返回到main里面进行操作、改变的顺序表需要带上&,如果只在对应函数操作的顺序表则不用。

13


本文标签: 学生 实验 操作 信息 插入