Day14:学生信息管理系统
用顺序表的形式制作一个学生信息管理系统
要求功能:
有自己的菜单页面
创建学生信息表
输入学生信息
按位置插入学生信息
输出任意位置范围内的学生信息
按位置删除学生信息
按位置修改学生信息
去掉重复学生信息
按名字查找学生信息位置
学生信息结构体
学生信息结构体:
id:学号;
name:姓名;
age:年龄
信息表结构体:
data:表单内学生信息;
len:信息个数;
size:表单大小
//学生信息结构体,id:学号;name:姓名;age:年龄
typedef struct Stu{
int id;
char name[20];
int age;
}Stu,*PStu;
//信息表结构体,data:表单内学生信息;len:信息个数;size:表单大小
typedef struct Info{
Stu *data;
int len;
int size;
}Info,*PInfo;
创建学生信息表
创建,并初始化表单
参数:num:表单大小;
返回值p:表单地址
//创建,并初始化表单,参数:num:表单大小;返回值p:表单地址
PInfo list_create(int num) {
//给表单基本信息分配空间
PInfo p = (PInfo)malloc(sizeof(Info));
//给表单内容分配信息
p->data = (PStu) malloc(sizeof(Stu) * num);
//初始化表单基础信息
p->len = 0;
p->size = num;
//判空
if(NULL == p || NULL == p->data){
printf("创建失败!\n");
return NULL;
}
printf("创建成功!\n");
//返回地址
return p;
}
输入学生信息
输入表单学生信息函数
参数:info:表单地址,num:输入个数
//输入表单学生信息函数,输入:info:表单地址,num:输入个数
void list_input(PInfo info, int num) {
//判空
if(NULL == info) return;
//限制输入信息个数
if(num > info->size){
printf("数据学生数量超过表容量\n");
return;
}
//循环插入表单内的学生信息
printf("请输入学生信息:(id name age)\n");
for (int i = 0; i < num; ++i) {
printf("第 %d 个学生 :",i + 1);
scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);
info->len++;
}
printf("输入学生信息成功\n");
}
按位置插入学生信息
按位插入学生信息函数
输入:info:表单地址,set:位置
//按位插入学生信息函数,输入:info:表单地址,set:位置
void list_set_insert(PInfo info, int set) {
//判空
if(NULL == info) return;
//判满
if(info->len + 1 > info->size){
printf("顺序表满了\n");
return;
}
//限制位置范围
if(set < 1 || set > info->len + 1){
printf("插入位置出错\n");
return;
}
//将set位置以后的位置循环后移一位
for (int i = info->len; i >= 0; --i) {
*(info->data + i) = *(info->data + i -1);
//当到set位置后,插入学生信息
if(i == set - 1){
printf("请输入需要插入得学生信息:(id name age)\n");
scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);
//长度加一
info->len++;
break;
}
}
printf("插入成功!\n");
}
输出任意位置范围内的学生信息
输出任意范围的学生信息
输入:info:表单地址,out_begin:输出起始位置,out_end:输出结束位置
//输出任意范围的学生信息,输入:info:表单地址,out_begin:输出起始位置,out_end:输出结束位置
void list_output(PInfo info, int out_begin, int out_end) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0){
printf("信息表为空\n");
return;
}
//限制起始位置和结束位置顺序
if(out_begin > out_end){
printf("输入顺序错误!\n");
return;
}
//限制位置范围
if(out_begin < 1 || out_end > info->len){
printf("输入位置超过信息表范围!\n");
return;
}
//循环输出
for (int i = out_begin - 1; i < out_end; ++i) {
printf("第 %d 个学生信息为 :\nid : %d name : %s age : %d\n",i + 1 ,(info->data + i)->id,(info->data + i)->name,(info->data + i)->age);
}
}
按位置删除学生信息
按位删除学生信息
输入:info:表单地址,set:删除位置
//按位删除学生信息,输入:info:表单地址,set:删除位置
void list_set_delete(PInfo info, int set) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0) {
printf("信息表为空!\n");
return;
}
//限制位置范围
if(set < 1 || set > info->len){
printf("输入位置不在表单范围内!\n");
return;
}
//将set位置后的数据前移
for (int i = set - 1; i < info->len - 1; ++i) {
*(info->data + i) = *(info->data + i + 1);
}
//减少表单长度
info->len--;
printf("删除成功!\n");
}
按位置修改学生信息
按位修改学生信息函数
输入:info:表单地址,set:位置
//按位修改学生信息函数,输入:info:表单地址,set:位置
void list_set_change(PInfo info, int set) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0){
printf("信息表为空!\n");
return;
}
//限制表单范围
if(set < 1 || set > info->len){
printf("输入位置不在表单范围内\n");
return;
}
//输出set位置的数据内容,方便对比
printf("第 %d 个位置的信息为:\n",set);
printf("id : %d name : %s age : %d\n",(info->data + set - 1)->id,(info->data + set - 1)->name,(info->data + set - 1)->age);
//输入修改后的内容
printf("您想修改为:\n");
scanf("%d %s %d",&(info->data + set - 1)->id,(info->data + set - 1)->name,&(info->data + set - 1)->age);
printf("修改成功!\n");
}
去掉重复学生信息
去掉重复学生,
输入:info:表单地址
//去掉重复学生,输入:info:表单地址
void list_delete_repeat(PInfo info) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0){
printf("信息表为空!\n");
return;
}
//选择排序思路找到重复学生,这里按照学号寻找
for (int i = 0; i < info->len; ++i) {
for (int j = i + 1; j < info->len; ++j) {
//当学号相等时,调用按位删除函数
if((info->data + i)->id == (info->data + j)->id){
list_set_delete(info,j + 1);
}
}
}
printf("去重完成!\n");
}
按名字查找学生信息位置
按名字找到学生信息位置函数:
输入:info:表单地址,name:学生姓名;
返回值:set+1:位置,0:空 ,-1:无此数据
//按名字找到学生信息位置函数,输入:info:表单地址,name:学生姓名;返回值:set+1:位置,0:空表,-1:表内无此学生
int list_find_set(PInfo info, char *name) {
//判空
if(NULL == info) return -1;
//判空
if(info->len == 0){
printf("信息表为空!\n");
return 0;
}
//初始化set位置
int set = -1;
//循环找到学生信息位置
for (int i = 0; i < info->len; ++i) {
if(strcmp((info->data + i)->name,name) == 0){
set = i;
}
}
//无此学生
if(set == -1){
printf("信息表内无此数据!\n");
}
return set + 1;
}
代码总和
#include<stdio.h>
#include <malloc.h>
#include <string.h>
//学生信息结构体,id:学号;name:姓名;age:年龄
typedef struct Stu{
int id;
char name[20];
int age;
}Stu,*PStu;
//信息表结构体,data:表单内学生信息;len:信息个数;size:表单大小
typedef struct Info{
Stu *data;
int len;
int size;
}Info,*PInfo;
PInfo list_create(int num);
void list_input(PInfo info, int i);
void list_set_insert(PInfo info, int set);
void list_output(PInfo info, int out_begin, int out_end);
void list_set_delete(PInfo info, int set);
void list_set_change(PInfo info, int set);
void list_delete_repeat(PInfo info);
int list_find_set(PInfo info, char *name);
int main(){
//选择按钮
int chose;
//结构体指针,接收结构体
PInfo info;
for (;;) {
//提示菜单
printf("0、查看信息表基本信息\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("-1、退出\n");
printf("请输入选项:");
scanf("%d",&chose);
if(chose == 0){
//查看表长和表单容量
printf("当前表长为 : %d\n当前表容量为 : %d\n",info->len,info->size);
}else if(chose == 1){
//创建信息表,并初始化表内容
int list_size;
printf("请输入信息表大小:\n");
scanf("%d",&list_size);
//调用创建函数
info = list_create(list_size);
} else if(chose == 2){
//输入学生信息
int num;
printf("请输入学生数量:\n");
scanf("%d",&num);
//调用输入信息函数
list_input(info, num);
} else if(chose == 3){
//记录输出位置起点和终点,输出信息
int out_begin,out_end;
printf("当前数据个数为 %d ,请输入想输出第几个到第几个位置的数据:",info->len);
scanf("%d %d",&out_begin,&out_end);
//调用输出函数
list_output(info,out_begin,out_end);
} else if(chose == 4){
//按位置插入学生信息
int set;
printf("请输入要插入的位置:\n");
scanf("%d",&set);
//调用按位置输出函数
list_set_insert(info,set);
} else if(chose == 5){
//按位置删除学生信息
int set;
printf("请输入要删除的位置:\n");
scanf("%d",&set);
list_set_delete(info,set);
} else if(chose == 6){
//按位置修改学生信息
int set;
printf("请输入要修改的位置:\n");
scanf("%d",&set);
list_set_change(info,set);
} else if(chose == 7){
//删除重复学生信息
list_delete_repeat(info);
} else if(chose == 8){
//按名字找到学生信息找表单中的位置
char name[10];
printf("请输入需要查找的学生姓名:\n");
scanf("%s",name);
int set = list_find_set(info,name);
//当返回值大于0,输出结果
if(set > 0)
printf("%s 在信息表内第 %d 个位置!\n",name,set);
}else if(chose == -1) {
//内存释放,指针指空,退出程序
free(info->data);
info->data = NULL;
free(info);
info = NULL;
break;
}
printf("\n");
}
return 0;
}
//按名字找到学生信息位置函数,输入:info:表单地址,name:学生姓名;返回值:set+1:位置,0:空表,-1:表内无此学生
int list_find_set(PInfo info, char *name) {
//判空
if(NULL == info) return -1;
//判空
if(info->len == 0){
printf("信息表为空!\n");
return 0;
}
//初始化set位置
int set = -1;
//循环找到学生信息位置
for (int i = 0; i < info->len; ++i) {
if(strcmp((info->data + i)->name,name) == 0){
set = i;
}
}
//无此学生
if(set == -1){
printf("信息表内无此数据!\n");
}
return set + 1;
}
//去掉重复学生
void list_delete_repeat(PInfo info) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0){
printf("信息表为空!\n");
return;
}
//选择排序思路找到重复学生,这里按照学号寻找
for (int i = 0; i < info->len; ++i) {
for (int j = i + 1; j < info->len; ++j) {
//当学号相等时,调用按位删除函数
if((info->data + i)->id == (info->data + j)->id){
list_set_delete(info,j + 1);
}
}
}
printf("去重完成!\n");
}
//按位修改学生信息函数,输入:info:表单地址,set:位置
void list_set_change(PInfo info, int set) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0){
printf("信息表为空!\n");
return;
}
//限制表单范围
if(set < 1 || set > info->len){
printf("输入位置不在表单范围内\n");
return;
}
//输出set位置的数据内容,方便对比
printf("第 %d 个位置的信息为:\n",set);
printf("id : %d name : %s age : %d\n",(info->data + set - 1)->id,(info->data + set - 1)->name,(info->data + set - 1)->age);
//输入修改后的内容
printf("您想修改为:\n");
scanf("%d %s %d",&(info->data + set - 1)->id,(info->data + set - 1)->name,&(info->data + set - 1)->age);
printf("修改成功!\n");
}
//按位删除学生信息,输入:info:表单地址,set:删除位置
void list_set_delete(PInfo info, int set) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0) {
printf("信息表为空!\n");
return;
}
//限制位置范围
if(set < 1 || set > info->len){
printf("输入位置不在表单范围内!\n");
return;
}
//将set位置后的数据前移
for (int i = set - 1; i < info->len - 1; ++i) {
*(info->data + i) = *(info->data + i + 1);
}
//减少表单长度
info->len--;
printf("删除成功!\n");
}
//输出任意范围的学生信息,输入:info:表单地址,out_begin:输出起始位置,out_end:输出结束位置
void list_output(PInfo info, int out_begin, int out_end) {
//判空
if(NULL == info) return;
//判空
if(info->len == 0){
printf("信息表为空\n");
return;
}
//限制起始位置和结束位置顺序
if(out_begin > out_end){
printf("输入顺序错误!\n");
return;
}
//限制位置范围
if(out_begin < 1 || out_end > info->len){
printf("输入位置超过信息表范围!\n");
return;
}
//循环输出
for (int i = out_begin - 1; i < out_end; ++i) {
printf("第 %d 个学生信息为 :\nid : %d name : %s age : %d\n",i + 1 ,(info->data + i)->id,(info->data + i)->name,(info->data + i)->age);
}
}
//按位插入学生信息函数,输入:info:表单地址,set:位置
void list_set_insert(PInfo info, int set) {
//判空
if(NULL == info) return;
//判满
if(info->len + 1 > info->size){
printf("顺序表满了\n");
return;
}
//限制位置范围
if(set < 1 || set > info->len + 1){
printf("插入位置出错\n");
return;
}
//将set位置以后的位置循环后移一位
for (int i = info->len; i >= 0; --i) {
*(info->data + i) = *(info->data + i -1);
//当到set位置后,插入学生信息
if(i == set - 1){
printf("请输入需要插入得学生信息:(id name age)\n");
scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);
//长度加一
info->len++;
break;
}
}
printf("插入成功!\n");
}
//输入表单学生信息函数,输入:info:表单地址,num:输入个数
void list_input(PInfo info, int num) {
//判空
if(NULL == info) return;
//限制输入信息个数
if(num > info->size){
printf("数据学生数量超过表容量\n");
return;
}
//循环插入表单内的学生信息
printf("请输入学生信息:(id name age)\n");
for (int i = 0; i < num; ++i) {
printf("第 %d 个学生 :",i + 1);
scanf("%d %s %d",&(info->data + i)->id,(info->data + i)->name,&(info->data + i)->age);
info->len++;
}
printf("输入学生信息成功\n");
}
//创建,并初始化表单,参数:num:表单大小;返回值p:表单地址
PInfo list_create(int num) {
//给表单基本信息分配空间
PInfo p = (PInfo)malloc(sizeof(Info));
//给表单内容分配信息
p->data = (PStu) malloc(sizeof(Stu) * num);
//初始化表单基础信息
p->len = 0;
p->size = num;
//判空
if(NULL == p || NULL == p->data){
printf("创建失败!\n");
return NULL;
}
printf("创建成功!\n");
//返回地址
return p;
}