实验一 顺序表的综合操作
一、实验目的
1.掌握线性表的定义;
2.掌握线性表的顺序存储基本操作,如建立、查找、插入和删除等。
二、实验内容
定义一个包含学生信息(学号,姓名,性别,年龄)的的顺序表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学生信息;
(4) 根据指定的位置可返回相应的学生信息;
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
三、实验提示
学生信息的定义:
typedef struct {
char no[11]; //表示11位学号,也可以定义为string no;
char name[20]; //表示姓名,也可以定义为string name;
char xb; //表示性别,以字母M表示男,字母W表示女
int age; //表示年龄
} Student;
顺序表的定义
typedef struct {
Student *elem; //指向线性表的基地址
int length; //线性表的当前长度
}SqList;
头文件及宏定义:
/*CaptainUniverse_ 2022.3.7*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000
#define TRUE 1
#define FALSE 0
/*CaptainUniverse_ 2022.3.7*/
子函数声明:
/*CaptainUniverse_ 2022.3.7*/
Status createList(SqList *);//创建新的信息表 返回值表成功与否 (内存分配是否成功)
Status displayList(SqList *);//展示信息表内容 返回值表成功与否 (是否建立过信息表及信息表内是否有内容)
Status searchList(SqList *);//查找学生信息 返回值表查找的学生序号(可能超过学生个数表示没找到)或者取消查找(返回上一级)
void printList(SqList *,int);//打印单个学生信息
void delList(SqList *);//删除单个学生信息
void insertList(SqList *);//插入单个学生信息
void getList(SqList *,int);//输入单个学生信息
void releaseList(SqList *);//释放占用内存
void printFileList(SqList *);//信息表内容输出为文件
Status getFileList(SqList *);//信息表内容以文件输入
void screen(void);//操作提示
/*CaptainUniverse_ 2022.3.7*/
子函数主体:
/*CaptainUniverse_ 2022.3.7*/
Status createList(SqList *List)
{
if(flag)
{
printf("你已创建过学生信息表了!\n");
return FALSE;
}
List->elem=(Student *)calloc(MAX,sizeof(Student));
if(List->elem==NULL)
{
printf("内存分配失败!\n");
exit(1);
}
flag=1;
return TRUE;
}
Status displayList(SqList *List)
{
if(!flag)
{
printf("还没有创建学生信息表!\n");
return FALSE;
}
if(!List->length&&flag)
{
printf("此表已空,请删除后重新建表!\n");
return FALSE;
}
int temp;
for(temp=1;temp<=List->length;temp++)
{
putchar('\n');
printf("第%d名同学:\n",temp);
printList(List,temp);
}
return TRUE;
}
Status searchList(SqList *List)
{
int temp=1;
char t_name[20],t_no[12];
int t_choice;
printf("请输入查找方式序号:\n");
printf("1.按姓名查找\n");
printf("2.按学号查找\n");
printf("(输入0取消操作返回上级)\n");
while(1)
{
fflush(stdin);
scanf("%d",&t_choice);
switch(t_choice)
{
case 0:
return FALSE;
case 1:
printf("请输入要查找的学生姓名:\n");
scanf("%s",t_name);
while(temp<=List->length&&strcmp(t_name,List->elem[temp].name)!=0)
{
temp++;
}
return temp;
break;
case 2:
printf("请输入要查找的学生学号:\n");
scanf("%s",t_no);
while(temp<=List->length&&strcmp(t_no,List->elem[temp].no)!=0)
{
temp++;
}
return temp;
break;
default:
printf("输入有误!\n");
break;
}
}
}
void printList(SqList *List,int temp)
{
printf("-----------------\n");
printf("姓名:%s\n",List->elem[temp].name);
printf("学号:%s\n",List->elem[temp].no);
switch(List->elem[temp].xb)
{
case 'M':
printf("性别:男\n");
break;
case 'W':
printf("性别:女\n");
break;
}
printf("年龄:%d\n",List->elem[temp].age);
printf("-----------------\n");
putchar('\n');
}
void delList(SqList *List)
{
if(!displayList(List))
{
return;
}
int temp;
printf("请输入删除的学生序号:\n");
printf("(输入0取消操作返回上级)\n");
while(scanf("%d",&temp))
{
if(!temp)
{
return;
}
if(temp>0&&temp<=List->length)
{
for(temp;temp<List->length;temp++)
{
List->elem[temp]=List->elem[temp+1];
}
List->length--;
printf("删除成功!\n");
return;
}
else
{
printf("没有该学号!删除失败!\n");
return;
}
}
}
void insertList(SqList *List)
{
if(!displayList(List))
{
return;
}
if(List->length==MAX)
{
printf("超出信息表上限,插入失败!\n");
return;
}
int temp_1,temp_2;
printf("请输入学生插入到的序号:\n");
printf("(输入0取消操作返回上级)\n");
scanf("%d",&temp_1);
if(!temp_1)
{
return;
}
if(temp_1>0&&temp_1<=List->length)
{
for(temp_2=List->length;temp_2>=temp_1;temp_2--)
{
List->elem[temp_2+1]=List->elem[temp_2];
}
getList(List,temp_1);
List->length++;
printf("插入成功!\n");
return;
}
else
{
printf("插入失败!\n");
return;
}
}
void getList(SqList *List,int temp)
{
printf("请输入学生姓名:\n");
scanf("%s",List->elem[temp].name);
printf("请输入该学生学号:\n");
scanf("%s",List->elem[temp].no);
printf("请输入学生年龄:\n");
scanf("%d",&List->elem[temp].age);
printf("请输入学生性别(W为女 M为男):\n");
getchar();
scanf("%c",&List->elem[temp].xb);
}
void releaseList(SqList *List)
{
free(List->elem);
}
void printFileList(SqList *List)
{
Student student;
FILE *fp;
int temp;
if((fp=fopen("学生信息统计表.txt","w"))==NULL)
{
printf("打开文件失败!\n");
return;
}
fputs("序号\t姓名\t\t学号\t\t性别\t年龄\t\n\n",fp);
for(temp=1;temp<=List->length;temp++)
{
fprintf(fp,"%d\t",temp);
fprintf(fp,"%s\t",List->elem[temp].name);
fprintf(fp,"%s\t",List->elem[temp].no);
if(List->elem[temp].xb=='W')
{
fputs("女",fp);
}
else
{
fputs("男",fp);
}
fputs("\t", fp);
fprintf(fp,"%d",List->elem[temp].age);
fputc('\n', fp);
}
fclose(fp);
}
Status getFileList(SqList *List)
{
Student student;
FILE *fp;
int temp=1;
if((fp=fopen("学生信息输入文件.txt","r"))==NULL)
{
fclose(fp);
return EXIT_FAILURE;
}
while(!feof(fp))
{
fscanf(fp,"%s\t%s\t%c\t%d",&List->elem[temp].name,&List->elem[temp].no,&List->elem[temp].xb,&List->elem[temp].age);
List->length++;
temp++;
}
fclose(fp);
return EXIT_SUCCESS;
}
void screen(void)
{
putchar('\n');
printf("|————————————————|\n");
printf("|--------学生信息管理工具--------|\n");
printf("|------1.建立新学生信息表--------|\n");
printf("|------2.删除已有学生信息表------|\n");
printf("|------3.逐个显示全学生信息------|\n");
printf("|------4.查找所需学生信息--------|\n");
printf("|------5.指定位置查找学生信息----|\n");
printf("|------6.删除指定位置学生信息----|\n");
printf("|------7.插入新的学生信息--------|\n");
printf("|------8.统计当前表学生个数------|\n");
printf("|------9.打印并退出当前学生信息表|\n");
printf("|------10.退出学生信息管理工具---|\n");
printf("|-----Powered by CaptainUniverse_|\n");
printf("|———————★————————|\n");
putchar('\n');
}
/*CaptainUniverse_ 2022.3.7*/
主函数:
/*CaptainUniverse_ 2022.3.7*/
int main(void)
{
SqList List;
int Choice;
List.length=0;
while(1)
{
screen();
printf("请输入操作序号:\n");
fflush(stdin);
scanf("%d",&Choice);
switch(Choice)
{
case 1:
if(createList(&List))
{
printf("建立成功!\n");
int number,Choice_;
CHOICE: printf("1.以文件输入\n");
printf("2.手动输入\n");
printf("请选择:\n");
scanf("%d",&Choice_);
if(Choice_==1)
{
FILE *fp;
fp=fopen("学生信息输入文件.txt","w");
fputs("张三\t20211008111\tW\t18\n",fp);
fputs("李四\t20211008112\tM\t19",fp);
fclose(fp);
putchar('\n');
printf("已将示例文件\"学生信息输入文件.txt\"放入程序目录!\n");
printf("注意:数据间为TAB键!末行不可出现无关字符!性别‘W’为女 ‘M’为男!\n");
printf("请修改文件内容后继续操作!\n");
system("pause");
if(!getFileList(&List))
{
printf("读取成功!\n");
}
else
{
printf("读取失败!\n");
printf("没有在程序目录找到“学生信息输入文件.txt”\n");
goto CHOICE;
}
break;
}
else if(Choice_==2)
{
printf("请输入要录入学生信息的个数(1-1000):\n");
while(scanf("%d",&number))
{
if(number>MAX)
{
printf("超出学生个数上限!请重新输入!\n");
}
else
{
int temp;
for(temp=1;temp<=number;temp++)
{
printf("----------------------------\n");
printf("第%d名同学\n",temp);
getList(&List,temp);
List.length++;
printf("----------------------------\n");
if(temp==number)
{
printf("输入完成!请继续操作!\n");
}
}
break;
}
}
}
else
{
printf("输入有误!\n");
goto CHOICE;
}
}
else
{
printf("建立失败!\n");
}
break;
case 2:
if(!flag)
{
printf("你还没有建立过信息表!\n");
break;
}
releaseList(&List);
List.length=0;
printf("成功删除!\n");
flag=0;
break;
case 3:
displayList(&List);
break;
case 4:
if(!flag)
{
printf("你还没有建立过信息表!\n");
break;
}
if(flag&&!List.length)
{
printf("此表已空,请删除后重新建表!\n");
break;
}
int student;
student=searchList(&List);
if(!student)
{
break;
}
if(student>List.length)
{
printf("未找到此学生!\n");
}
else
{
printList(&List,student);
}
break;
case 5:
if(!flag)
{
printf("你还没有建立过信息表!\n");
break;
}
int student_;
printf("请输入要查找学生信息序号:\n");
printf("(输入0取消操作返回上级)\n");
scanf("%d",&student_);
if(student_>List.length)
{
printf("没有该序号!查找失败!\n");
break;
}
else if(!student_)
{
break;
}
printList(&List,student_);
break;
case 6:
delList(&List);
break;
case 7:
insertList(&List);
break;
case 8:
if(!flag)
{
printf("还没有创建学生信息表!\n");
}
else
{
printf("当前学生信息统计表共统计学生:%d人!\n",List.length);
}
break;
case 9:
if(!flag)
{
printf("还没有创建学生信息表!\n");
break;
}
if(!List.length)
{
printf("此表为空!打印失败!\n");
break;
}
printFileList(&List);
printf("打印完成!文件存于程序目录!\n");
case 10:
goto END;
default:
printf("输入有误!\n");
break;
}
}
END:
printf("感谢您的使用,再见!\n");
releaseList(&List);
system("pause");
return 0;
}
/*CaptainUniverse_ 2022.3.7*/