一、作业
1.对昨天做的学生管理系统增加增删改查功能
函数声明:
#ifndef TEST_H
#define TEST_H
#include<myhead.h>
#define MAX 100
//结构体输入学生信息
struct Stu
{
char name[20]; //姓名
int age; //年龄
int score; //成绩
};
//结构体输入班级信息
typedef struct Class
{
struct Stu stu_dent[MAX];
int num;
}class,*class_ptr;
//菜单函数
void me_nu(void);
//创建班级函数
class_ptr create(int num);
//判空函数
int class_empty(class_ptr C);
//判满函数
int class_full(class_ptr C);
//学生信息录入函数
void student_1(class_ptr C);
//按成绩降序排序函数
void student_2(class_ptr C);
//成绩最好和最差的学生信息输出函数
void student_3(class_ptr C);
//学生信息输出函数
void student_4(class_ptr C);
//增加学生信息函数
int student_add(class_ptr C,struct Stu add,int pos);
//删除学生信息函数
int student_delete(class_ptr C,int pos);
//修改学生信息函数
int student_update(class_ptr C,int pos,struct Stu update);
//查找学生信息函数
int student_search_name(class_ptr C,char name[20]);//按姓名
int student_search_age(class_ptr C,int age);//按年龄
int student_search_score(class_ptr C,int score);//按成绩
//销毁班级函数
void destroy(struct Class *p);
#endif
源代码:
#include"my.h"
//菜单函数
void me_nu(void)
{
printf("\t\t======1:学生信息录入\n");
printf("\t\t======2:按成绩降序排序\n");
printf("\t\t======3:成绩最好和最差的学生信息\n");
printf("\t\t======4:学生信息输出\n");printf("\t\t======1:学生信息录入\n");
printf("\t\t======5:增加学生信息\n");
printf("\t\t======6:删除学生信息\n");
printf("\t\t======7:修改学生信息\n");
printf("\t\t======8:按姓名查找学生信息\n");
printf("\t\t======9:按年龄查找学生信息\n");
printf("\t\t======10:按成绩查找学生信息\n");
printf("\t\t======11:销毁班级\n");
printf("\t\t======0:退出\n");
}
//定义函数创建一个可以容纳整个系统的空间在堆区
class_ptr create(int num)
{
//在堆区申请1个struct class类型的空间大小
class_ptr C= (class_ptr)malloc(sizeof(class));
//申请一个stru stu类型的空间大小
if(NULL == C)
{
printf("申请失败\n");
return NULL;
}
//程序执行至此表示内存申请成功
//对内存空间进行初始化
memset(C,0,sizeof(class));
memset(C->stu_dent,0,sizeof(struct Stu));
C->num = num;
//返回内存地址给主函数
return C;
}
//判空函数
int class_empty(class_ptr C)
{
return C->num == 0;
}
//判满函数
int class_full(class_ptr C)
{
return C->num == MAX;
}
//学生信息录入函数
void student_1(class_ptr C)
{
for(int i=0;i<C->num;i++)
{
printf("请输入第%d名学生的姓名\n",i+1);
scanf("%s",C->stu_dent[i].name);
printf("请输入第%d名学生的年龄\n",i+1);
scanf("%d",&C->stu_dent[i].age);
printf("请输入第%d名学生的成绩\n",i+1);
scanf("%d",&C->stu_dent[i].score);
}
printf("录入成功\n");
}
//按成绩降序排序
void student_2(class_ptr C)
{
for(int i = 1;i<C->num;i++)
{
for(int j=0;j<C->num-i;j++)
{
if(C->stu_dent[j].score<C->stu_dent[j+1].score)
{
//交换三部曲
struct Stu temp = C->stu_dent[j];
C->stu_dent[j] = C->stu_dent[j+1];
C->stu_dent[j+1] = temp;
}
}
}
printf("排序成功\n");
}
//成绩最好和最差的学生成绩
void student_3(const class_ptr C)
{
int best = C->stu_dent[0].score;
int worst = C->stu_dent[0].score;
int count1=0;
int count2 = 0;
//将第一位学生当做最值
for(int i=0;i<C->num;i++)
{
if(best<C->stu_dent[i].score)
{
best = C->stu_dent[i].score;
count1 = i;
}
}
for(int i=0;i<C->num;i++)
{
if(worst>C->stu_dent[i].score)
{
worst = C->stu_dent[i].score;
count2 = i;
}
}
printf("成绩最好的学生信息为:%s\t%d\t%d\n",C->stu_dent[count1].name,C->stu_dent[count1].age,C->stu_dent[count1].score);
printf("成绩最差的学生信息为:%s\t%d\t%d\n",C->stu_dent[count2].name,C->stu_dent[count2].age,C->stu_dent[count2].score);
}
//学生信息输出
void student_4(const class_ptr C)
{
printf("排序后的学生信息如下:\n");
printf("姓名\t年龄\t成绩\n");
for(int i=0;i<C->num;i++)
{
printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
}
}
//增加学生信息到指定位置
int student_add(class_ptr C,struct Stu add,int pos)
{
//判断是否可以进行添加操作
if(C == NULL||class_full(C)||pos<0||pos>C->num)
{
printf("添加失败\n");
return -1;
}
//为要添加的学生信息挪出空位
for(int i=C->num-1;i>=pos;i--)
{
strcpy(C->stu_dent[i+1].name,C->stu_dent[i].name);
C->stu_dent[i+1].age = C->stu_dent[i].age;
C->stu_dent[i+1].score = C->stu_dent[i].score;
}
//添加学生信息
strcpy(C->stu_dent[pos].name,add.name);
C->stu_dent[pos].age = add.age;
C->stu_dent[pos].score = add.score;
//
C->num++;
printf("添加成功\n");
return 0;
}
//删除指定位置的学生信息
int student_delete(class_ptr C,int pos)
{
//判断是否可以进行删除操作
if(C == NULL||class_empty(C)||pos<0||pos>=C->num)
{
printf("添加失败\n");
return -1;
}
//删除该学生信息
for(int i=pos+1;i<C->num;i++)
{
strcpy(C->stu_dent[i-1].name,C->stu_dent[i].name);
C->stu_dent[i-1].age = C->stu_dent[i].age;
C->stu_dent[i-1].score = C->stu_dent[i].score;
}
C->num--;
printf("删除成功\n");
return 0;
}
//修改指定位置的学生信息
int student_update(class_ptr C,int pos,struct Stu update)
{
//判断是否可以进行修改操作
if(C == NULL||class_empty(C)||pos<0||pos>=C->num)
{
printf("修改失败\n");
return -1;
}
//修改学生信息
strcpy(C->stu_dent[pos].name,update.name);
C->stu_dent[pos].age = update.age;
C->stu_dent[pos].score = update.score;
return 0;
}
//查找名叫××的学生
int student_search_name(class_ptr C,char name[20])
{
for(int i=0;i<C->num;i++)
{
if(strcmp(name,C->stu_dent[i].name)==0)
{
printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
return 0;
}
}
printf("没有找到该学生\n");
return -1;
}
//查找年龄为××的学生
int student_search_age(class_ptr C,int age)
{
for(int i=0;i<C->num;i++)
{
if(age==C->stu_dent[i].age)
{
printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
return 0;
}
}
printf("没有找到该学生\n");
return -1;
}
//查找成绩为××的学生
int student_search_score(class_ptr C,int score)
{
for(int i=0;i<C->num;i++)
{
if(score == C->stu_dent[i].score)
{
printf("%s\t%d\t%d\n",C->stu_dent[i].name,C->stu_dent[i].age,C->stu_dent[i].score);
return 0;
}
}
printf("没有找到该学生\n");
return -1;
}
//定义函数销毁该班级
void destroy(class_ptr C)
{
if(NULL != C)
{
free(C);
C = NULL;
}
printf("销毁成功\n");
}
主程序:
#include<myhead.h>
#include"my.h"
int main(int argc,char const *argv)
{
int num =0;
printf("请输入该班级人数:\n");
scanf("%d",&num);
class_ptr C = create(num);//调用函数创建一个班级
int menu = 0;//定义菜单元素
struct Stu add;//定义一个要被添加的学生信息数组
struct Stu update;//定义一个要被修改的学生信息数组
//memset(struct Stu add,0,sizeof(struct Stu));
int pos = 0;//定义添加或删除学生信息的位置
char name[20] = {};//定义一个要被查找的姓名信息
int age = 0;//定义一个要被查找的年龄信息
int score = 0;//定义一个查找的成绩信息
//使用菜单函数
while(1)
{
me_nu();
printf("请输入:");
scanf("%d",&menu);
getchar();
//菜单
switch(menu)
{
case 1:
{
student_1(C);
}
break;
case 2:
{
student_2(C);
}
break;
case 3:
{
student_3(C);
}
break;
case 4:
{
student_4(C);
}
break;
case 5:
{
printf("请输入添加的学生信息:\n");
scanf("%s%d%d",add.name,&add.age,&add.score);
getchar();//吸收空行
printf("请输入该生要被添加到的位置:\n");
scanf("%d",&pos);
student_add(C,add,pos);
printf("添加该学生信息后的学生信息为:\n");
student_4(C);
}
break;
case 6:
{
printf("请输入要被删除的学生的位置:\n");
scanf("%d",&pos);
student_delete(C,pos);
printf("删除该生后的学生信息为:\n");
student_4(C);
}
break;
case 7:
{
printf("请输入要修改的学生信息:\n");
scanf("%s%d%d",update.name,&update.age,&update.score);
getchar();//吸收空行
printf("请输入该生要被修改到的位置:\n");
scanf("%d",&pos);
student_update(C,pos,update);
printf("修改该学生信息后的学生信息为:\n");
student_4(C);
}
break;
case 8:
{
printf("请输出要查找的学生姓名:\n");
scanf("%s",name);
student_search_name(C,name);
}
break;
case 9:
{
printf("请输出要查找的学生年龄:\n");
scanf("%d",&age);
student_search_age(C,age);
}
break;
case 10:
{
printf("请输出要查找的学生成绩:\n");
scanf("%d",&score);
student_search_score(C,score);
}
break;
case 11:
{
destroy(C);
C = NULL;
}
break;
case 0:
{
goto END;
}
default:
printf("您输入的内容有误,请重新输入\n");
}
}
END:
return 0;
}
2.顺序表
函数声明:
#ifndef SEQLIST_H
#define SEQLIST_H
#include<myhead.h>
#define MAX 20 //顺序表最大容量
typedef int datatype; //数据元素类型
//定义顺序表结构类型
typedef struct
{
datatype data[MAX]; //存放顺序表的数组
int len; //顺序表长度
}SeqList,*SeqListPtr;
//声明顺序表创建函数
SeqListPtr list_create();
//判空函数
int list_empty(SeqListPtr L);
//判满函数
int list_full(SeqListPtr L);
//添加元素
int list_add(SeqListPtr L,datatype e);
//遍历顺序表
void list_show(SeqListPtr L);
//定义任意位置插入函数
int list_insert_pos(SeqListPtr L,int pos,datatype e);
//定义任意位置删除函数
int list_delete_pos(SeqListPtr L,int pos);
//定义按值查找位置函数
int list_search_value(SeqListPtr L,datatype e);
//定义按位置进行修改
int list_update_pos(SeqListPtr L,int pos,datatype e);
//按值进行修改
int list_update_value(SeqListPtr L,datatype old_e,datatype new_e);
#endif
//防止重复包含
源代码:
#include"seqlist.h"
//声明顺序表创建函数
SeqListPtr list_create()
{
//在堆区申请一个顺序表的大小空间
SeqListPtr L = (SeqListPtr)malloc(sizeof(SeqList));
if(NULL == L)
{
printf("创建失败\n");
return NULL;
}
//程序执行至此表示创建成功
memset(L->data,0,sizeof(SeqList)); //将数组初始化
L->len = 0;//顺序长度为0
printf("创建成功\n");
return L;
}
//判空函数,空回真,非空回真
int list_empty(SeqListPtr L)
{
return L->len==0;
}
//判满函数,满回真,非满回假
int list_full(SeqListPtr L)
{
return L->len==MAX;
}
//添加元素
int list_add(SeqListPtr L,datatype e)
{
//判断逻辑
if(NULL==L||list_full(L))
{
printf("添加失败\n");
return -1;
}
//添加逻辑
L->data[L->len] = e;
//表的变化
L->len++;
printf("添加成功\n");
return 0;
}
//遍历顺序表
void list_show(SeqListPtr L)
{
//判断逻辑
if(NULL == L||list_empty(L))
{
printf("遍历失败\n");
return ;
}
//遍历
printf("顺序表中的元素分别是:");
for(int i=0;i<L->len;i++)
{
printf("%d\t",L->data[i]);
}
printf("\n");
}
//定义任意位置插入函数
int list_insert_pos(SeqListPtr L,int pos,datatype e)
{
//判断逻辑
if(NULL ==L||list_full(L)||pos<0||pos>L->len)
{
printf("插入失败\n");
return -1;
}
//腾空逻辑
for(int i=L->len-1;i>=pos;i--)
{
L->data[i+1]=L->data[i]; //将前面的元素后移
}
//插入数据
L->data[pos] = e;
printf("插入成功\n");
//表长变化
L->len++;
return 0;
}
//定义任意位置删除函数
int list_delete_pos(SeqListPtr L,int pos)
{
//判断逻辑
if(NULL == L||list_empty(L)||pos<0||pos>=L->len)
{
printf("删除失败\n");
return -1;
}
//删除逻辑
for(int i=pos+1;i<L->len;i++)
{
L->data[i-1] = L->data[i];
}
//表长变化
L->len--;
printf("删除成功\n");
return 0;
}
//定义按值查找位置函数
int list_search_value(SeqListPtr L,datatype e)
{
//判断逻辑
if(NULL == L||list_empty(L))
{
printf("查找失败\n");
return -1;
}
//遍历顺序表
for(int i=0;i<L->len;i++)
{
if(L->data[i]==e)
{
return i;//返回查找到的数据下标
}
}
printf("没找到\n");
return -1;
}
//定义按位置进行修改
int list_update_pos(SeqListPtr L,int pos,datatype e)
{
//判断逻辑
if(NULL==L||list_empty(L)||pos<0||pos>=L->len)
{
printf("修改失败\n");
return -1;
}
//正常进行修改
L->data[pos] = e;
printf("修改成功\n");
return 0;
}
//按值进行修改
int list_update_value(SeqListPtr L,datatype old_e,datatype new_e)
{
//判断逻辑
if(NULL ==L||list_empty(L))
{
printf("修改失败\n");
return -1;
}
//根据旧值找位置
int res = list_search_value(L,old_e);
if(res == -1)
{
printf("没有要改的值\n");
return-1;
}
//调用函数按位置修改
list_update_pos(L,res,new_e);
printf("修改成功\n");
return 0;
}
主程序:
#include<myhead.h>
#include"seqlist.h"
int main(int argc,char const *argv)
{
//创建一个顺序表
SeqListPtr L = list_create();
if(NULL == L)
{
return -1;
}
list_add(L,520);
list_add(L,999);
list_add(L,480);
//调用遍历函数
list_show(L);
//调用任意位置插入函数
list_insert_pos(L,0,100);
list_insert_pos(L,2,100);
list_insert_pos(L,5,100);
list_show(L);
//调用任意位置删除函数
list_delete_pos(L,0);
list_show(L);
//调用函数查找位置函数
int res = list_search_value(L,999);
if(res>=0)
{
printf("您要找的数在%d个位置上\n",res+1);
}
//调用函数按位置修改
list_update_pos(L,4,666);
list_show(L);
//调用函数按值修改
list_update_value(L,999,888);
list_show(L);
return 0;
}