一、实验目的:
- 掌握线性表的逻辑结果和存储结构特点;
- 掌握线性表的基本操作,如建立、查找、插入和删除等。
二、 问题描述
创建一个班级学生信息表,包含“学号、姓名、性别、成绩”等信息。具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据学号进行查找,返回此学生的学号和成绩;
(4) 给定一个学生信息,插入到表中指定的位置;
(5) 删除指定位置的学生记录;
三、数据结构设计(选用的数据元素逻辑结构和存储结构实现形式说明)
(1)逻辑结构设计 :采用的线性结构,主要通过线性表实现各元素之间一对一的关系
(2)存储结构设计 :采用顺序存储结构,顺序存储结构较为方便,直接在空间开辟一处存储空间存放数据,创建顺序表较简单,但是在插入和删除时效率明显较低。
四、算法设计
1、头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
2、宏定义
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
3、结构体
typedef struct
{
char name[50];
char num[50];
int mark;
char genger[50];
} student;
typedef student ElemType;
typedef struct
{
ElemType* elem; //存储空间的基地址
int length; //当前长度
} studentList;
Status InitList(studentList* bl) //顺序表的初始化
{
//构造一个空的顺序表L
bl->elem = (ElemType*)malloc(sizeof(ElemType) * MAXSIZE);
if (!bl->elem)
exit(OVERFLOW); //存储分配失败
bl->length = 0; //空表长度为0
return OK;
}
4、各子函数说明
1、信息输入
采用的C语言程序设计,因此直接用的scanf函数进行输入
void input(ElemType* e)
{
printf("学生姓名:");
scanf("%s", e->name);
printf("学生学号:");
scanf("%s", e->num);
printf("性别:");
scanf("%s", &e->genger);
printf("学生成绩:");
scanf("%d", &e->mark);
printf("***OK***\n\n");
}
2、信息输出
直接打印结构体里面的内容
void output(ElemType* e)
{
printf("学生姓名:%-10s 学生学号:%-10s 性别:%-10s 学生成绩:%-10d\n\n", e->name, e->num, e->genger,e->mark);
}
3、表的查找
引用到结构体里面,将要查找的名字与所存储的名字进行对比,最后返回名字的位置
int LocateElem_Sq(studentList* bl, ElemType e) //顺序表的查找
{
//顺序表的查找
int i;
for (i = 0; i < bl->length; i++)
if (!strcmp(bl->elem[i].name, e.num))
return i + 1;
return 0;
}
4、表的插入
首先将插入位置以及之后的元素全部后移(保证开辟空间足够),表长加1
再将所要插入的元素放置于插入位置
Status InsertElem(studentList* bl, int i, ElemType e) //顺序表的插入
{
//在顺序表L中第i个位置之前插入新的元素e
int k;
if (i<1 || i>bl->length + 1)
return ERROR;
if (bl->length == MAXSIZE)
return ERROR;
for (k = bl->length - 1; k >= i - 1; k--)
bl->elem[k + 1] = bl->elem[k]; //插入位置及之后的元素后移
bl->elem[i - 1] = e; //将新元素e放入第i个位置
++bl->length; //表长增1
return OK;
}
5、表的删除
引入表之后,应当明确要删除的位置信息,先查找要删除的学生,删除之后应该将后面的学生向前移,最后表长减1
Status DeleteElem(studentList* bl, char* i, char* e) //顺序表的删除
{
int k = 0;
while (k < bl->length && strcmp(bl->elem[k].name, i))
k++;
if (k != bl->length)
{
strcpy(e, bl->elem[k].name);
for (; k <= bl->length; k++)
bl->elem[k] = bl->elem[k + 1];
}
else
return ERROR;
--bl->length; //表长减1
return OK;
}
6、主菜单
此处无需赘述
void menu()
{
printf("主菜单:\n");
printf(" 1.建立顺序表 ");printf("2.输入学生信息\n");
printf(" 3.查找 ");printf("4.插入\n");
printf(" 5.删除 ");printf("6.输出学生信息\n");
printf(" 7.退出\n\n");
}
5、主函数
int main()
{
studentList bl;
int i, temp, a, choice, x;
ElemType b, e;
char res[20], c[10];
menu();
choice = -1;
while (choice != 7)
{
printf("请选择功能:");
scanf("%d", &choice);
switch (choice)
{
case 1: //创建顺序表
if (InitList(&bl))
printf("成功建立顺序表\n\n");
else
printf("顺序表建立失败\n\n");
break;
case 2:
printf("学生数量:");
scanf("%d", &x);
for (i=0;i<x;i++)
{
printf("第%d个:\n", i + 1);
input(&bl.elem[i]);
}
bl.length=x;
putchar('\n');
break;
case 3: //顺序表的查找
printf("请输入所要查找的学生姓名:");
scanf("%s", e.num);
temp = LocateElem_Sq(&bl, e);
if (temp != 0)
{
printf("该学生信息如下:\n");
output(&bl.elem[temp - 1]);
}
else
printf("查找失败!\n\n");
break;
case 4: //顺序表的插入
printf("请输入一个数,代表插入的位置:");
scanf("%d", &a);
printf("请输入所要插入学生信息:\n");
printf("学生姓名:");
scanf("%s", b.name);
printf("学生学号:");
scanf("%s", b.num);
printf("性别:");
scanf("%s", b.genger);
printf("学生成绩:");
scanf("%d", &b.mark);
if (InsertElem(&bl, a, b))
printf("插入成功.\n\n");
else
printf("插入失败.\n\n");
break;
case 5: //顺序表的删除
printf("请输入所要删除的学生姓名:");
scanf("%s", c);
if (DeleteElem(&bl, c, res))
printf("删除成功.");
else
printf("删除失败.\n\n");
break;
case 6: //顺序表的输出
printf("当前学生总数为:%d\n", bl.length);
printf("当前顺序表为:\n");
for (i = 0; i < bl.length; i++)
output(&bl.elem[i]);
printf("\n");
break;
case 7:
printf("********************************END************************************\n");
break;
}
}
return 0;
}
五、结论
经过了多次调式,其中几次是因为缺少预编译头,也出现过输出的汉字出现乱码现象,通过多次改进解决了问题。同时在调试过程中,也出现了多出语法问题,后面进行了一一改正。在调试过程中出现中断的现象,在经过分析和探讨之后发现,是由于没有建立顺序表就开始输入信息,导致程序停止运行。
在输入相关学生信息之后,能够正确输出。插入,删除,查找功能也能正常执行。
有何问题可联系QQ:2745498610与我探讨 !后续会上传整个工程文档至云盘。