线性表的顺序存储实现及应用
实验目的
- 掌握抽象数据类型ADT的定义、表示和实现。
- 掌握线性表的基本结构和操作方法。
- 培养学生灵活使用数据结构解决实际问题的能力。
实验内容
采用顺序表方案实现一个简易的学生信息管理系统。其中,学生信息包括学号、姓名、性别、年龄、专业。该管理系统能提供建立、查询、删除和增加学生信息等功能。要求:
- 根据所学知识,为待加工的数据定义恰当的“学生”数据类型。
- 利用顺序表各个基本操作的框架来实现管理系统中的各个功能。
- 初始学生信息可以选择从键盘录入或者从文件中读取,待管理系统操作完毕后将最新的学生信息全部写入文件中保存。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//*******数据类型定义*******
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
struct Student
{
int no; //学号
char name[10]; //姓名
char sex; //性别
int age; //年龄
char major[12]; //专业
};
typedef struct Student ElemType;
typedef struct
{
ElemType *data;
int length;
int listsize;
}SeqList; //学生顺序表类型
int studentnumber=0;
//*******基本操作定义*******
void InitList_Seq(SeqList &L); //顺序表初始化
void CreatList_Seq(SeqList &L,ElemType a[],int n); //建立长度为n的顺序表
void Show_Seq(SeqList L); //显示顺序表信息
int LocateElem_Seq(SeqList L, int e); //按值e查询顺序表
//void Copy_Stu(ElemType &tar_stu, ElemType src_stu); //学生信息拷贝操作
//*******功能操作定义*******
void Create(SeqList &L); //建立学生表
void Locate(SeqList L); //查询学生
void Insert(SeqList &L); //增加学生
void Delete(SeqList &L); //删除学生
void Save(SeqList L); //存储信息
//*******基本操作实现*******
void InitList_Seq(SeqList &L) //顺序表初始化
{
L.data = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.data) exit(0);
L.length = 0; //顺序表中当前所含元素个数为 0
L.listsize = LIST_INIT_SIZE;
}
void CreatList_Seq(SeqList &L,ElemType a[],int n) //建立长度为n的顺序表
{
InitList_Seq(L);
//完备性考虑,在创建之前,还应该判断n与L.listsize的大小关系
if(n>L.listsize){
printf("输入错误\n");
exit(0);
}
for(int i = 0; i < n; i++)
{
L.data[L.length]= a[i];
L.length++;
}
}
void Show_Seq(SeqList L){
printf("学号\t姓名\t性别\t年龄\t专业\n");
for(int i=0;i<L.length;i++){
printf("%d\t%s\t%c\t%d\t%s\n",L.data[i].no,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
}
}
int LocateElem_Seq(SeqList L, int e){
int result=0;
for(int i=0;i<LIST_INIT_SIZE;i++){
if(L.data[i].no==e){
result=e;
break;
}
}
return result;
}
//*******功能操作实现*******
void Create(SeqList &L){
InitList_Seq(L);
FILE * input;
input=fopen("StudentInformation.txt","r");
int i=0;
while(!feof(input)){
fscanf(input,"%d\t%s\t%c\t%d\t%s\n",&L.data[i].no,L.data[i].name,&L.data[i].sex,&L.data[i].age,L.data[i].major);
i++;
}
}
void Locate(SeqList L) //查询学生
{
int no;
printf("请输入需查询学生的学号:");
scanf("%d", &no);
int index = LocateElem_Seq(L, no);
if(index == 0)
printf("没有此学号的学生\n");
else
{
printf("该学生信息如下:\n");
printf("学号\t姓名\t性别\t年龄\t专业\n");
printf("%d\t%s\t%c\t%d\t%s\n", L.data[index-1].no, L.data[index-1].name, L.data[index-1].sex, L.data[index-1].age, L.data[index-1].major);
}
}
void Insert(SeqList &L){ //增加学生
while(1){
printf("请输入学号:");
scanf("%d\n",&L.data[studentnumber].no);
printf("请输入姓名:");
scanf("%s\n",L.data[studentnumber].name);
printf("请输入性别:");
scanf("%c\n",&L.data[studentnumber].sex);
printf("请输入年龄:");
scanf("%d\n",&L.data[studentnumber].age);
printf("请输入专业:");
scanf("%s\n",L.data[studentnumber].major);
int flag=0;
for(int i=0;i<studentnumber;i++){
if(L.data[i].no==L.data[studentnumber].no){
printf("输入重复,请重新输入\n");
printf("**********************\n");
flag=1;
}
}
if(flag==0){
printf("添加成功");
break;
}
}
studentnumber++;
}
void Delete(SeqList &L){ //删除学生
int a;
char b;
printf("请输入学号:");
scanf("%d\n",&a);
for(int k=0;k<studentnumber;k++){
if(a==L.data[k].no){
printf("是否删除?(y或n)");
scanf("%c\n",&b);
if(b=='n'){
printf("取消删除");
break;
}else{
for(int i=k;i<studentnumber;i++){
L.data[k].no=L.data[k+1].no;
strcpy(L.data[k].name,L.data[k+1].name);
L.data[k].sex=L.data[k+1].sex;
L.data[k].age=L.data[k+1].age;
strcpy(L.data[k].major,L.data[k+1].major);
}
printf("删除成功\n");
studentnumber--;
}
}else{
printf("查无此人\n");
break;
}
}
}
void Save(SeqList L){
FILE * output;
output=fopen("StudentInformation.txt","w");
for(int i=0;i<L.length;i++){
fprintf(output,"%d\t%s\t%c\t%d\t%s\n",L.data[i].no,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
}
fclose(output);
printf("保存成功\n");
}
//*******学生信息管理系统*******
int main()
{
SeqList StuList;
int choice = 0;
do
{
printf("****************学生信息管理****************\n");
printf("******************1----建立****************\n");
printf("******************2----查询****************\n");
printf("******************3----删除****************\n");
printf("******************4----增加****************\n");
printf("******************5----存储****************\n");
printf("******************0----退出****************\n");
printf("*******************************************\n");
printf("请选择(0-4): ");
scanf("%d", &choice);
switch(choice)
{
case 1:
{
Create(StuList);
break;
}
case 2:
{
Locate(StuList);
break;
}
case 3:
{
Delete(StuList);
break;
}
case 4:
{
Insert(StuList);
}
case 5:
{
Save(StuList);
}
case 0:
break;
default:
printf("输入错误!\n");
}
}while(choice);
return 0;
}