完成顺序表操作,要求数据元素是构造数据类型。
头文件
#include "student.h"
int main(int argc, const char *argv[])
{
int num;
char x;
//创建班级
Classptr C = create();
while(1)
{
system("clear");
printf("0)退出系统\n1)添加成员\n2)展示成员信息\n\
3)按姓名查找\n4)更改指定位置的信息\n\
5)更改指定学生的信息\n6)按照成绩排序\n\
7)删除任意位置的学生信息\n8)释放空间\n");
printf("请输入选项(0-8):");
scanf("%d",&num);
switch(num)
{
case 0:
return 0;
case 1:
Class_add(C);
break;
case 2:
Class_output(C);
while(1)
{
printf("是否继续查看(y|n):");
scanf(" %c",&x);
if(x=='y'||x=='Y')
{
x=0;
Class_output(C);
}else
{
x=0;
break;
}
}
break;
case 3:
Class_search_name(C);
while(1)
{
printf("是否继续查找(y|n)");
scanf(" %c",&x);
if(x=='y'||x=='Y')
{
Class_search_name(C);
x=0;
}else{
x=0;
break;
}
}
break;
case 4:
Class_update_pos(C);
while(1)
{
printf("是否继续更改(y|n)");
scanf(" %c",&x);
if(x=='y'||x=='Y')
{
Class_update_pos(C);
x=0;
}else{
x=0;
break;
}
}
break;
case 5:
Class_update_name(C);
while(1)
{
printf("是否继续更改(y|n)");
scanf(" %c",&x);
if(x=='y'||x=='Y')
{
Class_update_name(C);
x=0;
}else{
x=0;
break;
}
}
break;
case 6:
Class_sort(C);
Class_output(C);
while(1)
{
printf("是否继续排序(y|n)");
scanf(" %c",&x);
if(x=='y'||x=='Y')
{
Class_sort(C);
Class_output(C);
x=0;
}else{
x=0;
break;
}
}
break;
case 7:
Class_delete_pos(C);
while(1)
{
printf("是否继续删除(y|n)");
scanf(" %c",&x);
if(x=='y'||x=='Y')
{
x=0;
Class_delete_pos(C);
}
else
{
x=0;
break;
}
}
case 8:
Class_free(C);
C=NULL;
break;
default :
printf("请输入正确的选项\n");
}
}
return 0;
}
功能函数
#include "student.h"
/********************************申请空间*********************************************/
Classptr create()
{
//在堆区申请一个班级大小的空间
Classptr C = (Classptr)malloc(sizeof(Class));
if(NULL==C)
{
printf("空间申请失败\n");
return NULL;
}
//初始化班级
memset(C,0,sizeof(Class));
C->len=0;//人数清零
printf("班级创建成功\n");
return C;//返回地址
}
/**********************************判满****************************************************/
int Class_full(Classptr C)
{
//判断逻辑
if(NULL==C)
{
printf("所给顺序表不合法\n");
return 0;
}
//合法则返回是否已满
return C->len == MAX;
}
/**********************************判空**********************************************/
int Class_empty(Classptr C)
{
//判断逻辑
if(NULL==C)
{
printf("所给顺序表不合法\n");
return 0;
}
//合法则返回是否为空
return C->len == 0;
}
/***************************添加学生函数*******************************************/
void Class_add(Classptr C)
{
//判断逻辑
if(NULL==C || C->len==MAX)
{
printf("班级空间不合法\n");
}
Stu s;
while(1)
{
char judge;
printf("是否继续录入学生(Y|N):");
scanf(" %c", &judge);
if(judge=='Y' || judge=='y')
{
if(C->len<MAX)
{
printf("请输入学生姓名:");
scanf("%s",s.name);
printf("请输入学生性别:");
scanf(" %c",&s.sex);
printf("请输入学生年龄:");
scanf("%d",&s.age);
printf("请输入学生分数:");
scanf("%lf",&s.score);
C->data[C->len]=s;
C->len++;
}else
{
printf("班级已满,添加失败\n");
break;
}
}else
{
break;
}
}
}
/*****************************输出函数*****************************************/
void Class_output(Classptr C)
{
//判断逻辑
if(NULL == C || Class_empty(C))
{
printf("操作失败\n");
}
//开始输出
else
{
printf("当前班级成员信息如下\n");
printf("姓名\t性别\t年龄\t成绩\n");
for(int i=0;i<C->len;i++)
{
printf("%s\t%c\t%d\t%lf\n",C->data[i].name,C->data[i].sex,C->data[i].age,C->data[i].score);
}
}
}
/**************************任意位置插入*****************************************/
int Class_insert_pos(Classptr C)
{
int pos;
printf("请输入想要插入的位置:");
scanf("%d",&pos);
Stu s;
//判断逻辑
if(NULL == C || pos>C->len || pos<0)
{
printf("插入失败\n");
return 0;
}
printf("请输入学生姓名:");
scanf("%s",s.name);
printf("请输入学生性别:");
scanf(" %c",&s.sex);
printf("请输入学生年龄:");
scanf(" %d",&s.age);
printf("请输入学生成绩:");
scanf(" %lf",&s.score);
for(int i=C->len-1;i>=pos;i--)
{
C->data[i+1]=C->data[i];
}
C->data[pos] = s;
C->len++;
printf("插入成功\n");
return 1;
}
/**********************任意位置删除*****************************************/
int Class_delete_pos(Classptr C)
{
int pos;
printf("请输入想要删除的位置:");
scanf("%d",&pos);
//判断逻辑
if(NULL==C || Class_empty(C) || pos<0||pos>C->len)
{
printf("删除失败\n");
return -1;
}
//删除逻辑
for(int i=pos+1;i<C->len;i++)
{
C->data[i-1]=C->data[i];//将删除位置后的数据前移
}
C->len--;//表的变化
printf("删除成功\n");
return 1;
}
/*****************任意位置修改函数******************************************/
int Class_update_pos(Classptr C)
{
int pos;
printf("请输入想要修改的位置:");
scanf("%d",&pos);
//判断逻辑
if(NULL==C || Class_empty(C) || pos<0||pos>C->len)
{
printf("修改失败\n");
return -1;
}
Stu s;
printf("请输入学生姓名:");
scanf("%s",s.name);
printf("请输入学生性别:");
scanf(" %c",&s.sex);
printf("请输入学生年龄:");
scanf(" %d",&s.age);
printf("请输入学生成绩:");
scanf(" %lf",&s.score);
C->data[pos-1]=s;//更新修改后的数据
printf("修改成功\n");
return 1;
}
/***********************按姓名查找**************************************/
void Class_search_name(Classptr C)
{
//判断逻辑
if(NULL==C||Class_empty(C))
{
printf("查找失败\n");
}
Stu s;
int flag = 0;
int count = 0;
printf("请输入想要查找学生的姓名:");
scanf(" %s",s.name);
for(int i=0;i<C->len;i++)
{
if(strcmp(C->data[i].name, s.name) == 0)//查找逻辑
{
flag=1;
count++;
}
}
if(flag==1)
{
printf("查找成功\n");
printf("该姓名共有%d人\n",count);
printf("学生信息如下:\n");
printf("姓名\t性别\t年龄\t成绩\n");
for(int i=0;i<C->len;i++)
{
if(strcmp(C->data[i].name, s.name) == 0)//查找逻辑
{
printf("%s\t%c\t%d\t%lf\n",C->data[i].name,C->data[i].sex,C->data[i].age,C->data[i].score);
}
}
}
else
printf("查无此人\n");
}
/****************************释放顺序表***************************************/
void Class_free(Classptr C)
{
if(NULL!=C)
{
free(C);
C=NULL;
}
printf("释放成功\n");
}
/*****************************按照姓名修改**************************/
void Class_update_name(Classptr C)
{
Stu s;
printf("请输入想要修改信息的学生的姓名:");
scanf(" %s",s.name);
if(NULL==C||Class_empty(C))
{
printf("非法操作\n");
}
for(int i=0;i<C->len;i++)
{
if(strcmp(C->data[i].name, s.name) == 0)//查找逻辑
{
printf("请输入学生姓名:");
scanf("%s",s.name);
printf("请输入学生性别:");
scanf(" %c",&s.sex);
printf("请输入学生年龄:");
scanf(" %d",&s.age);
printf("请输入学生成绩:");
scanf(" %lf",&s.score);
C->data[i]=s;//更新修改后的数据
printf("修改成功\n");
}
}
}
/*************************按照成绩排序********************************/
void Class_sort(Classptr C)
{
//判断逻辑
if(NULL==C||Class_empty(C))
{
printf("操作失败\n");
}
int flag;
printf("请选择升序(1)还是降序(0):");
scanf("%d",&flag);
for(int i=1;i<C->len;i++)//开始排序
{
int index=i-1;
for(int j=i-1;j<C->len;j++)
{
if(flag==1)//升序
{
if(C->data[index].score>C->data[j].score)
{
index=j;
}
}
else if(flag==0)//降序
{
if(C->data[index].score<C->data[j].score)
{
index=j;
}
}
if(index!=i-1)//交换
{
Stu temp=C->data[index];
C->data[index]=C->data[i-1];
C->data[i-1]=temp;
}
}
}
}
头文件
#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 40
//定义一个学生类型
typedef struct
{
char name[20];//姓名
char sex;//性别
int age;//年龄
double score;//分数
}Stu, *StuPtr;
//定义了一个班级类型
typedef struct
{
Stu data[MAX];//存储学生的数组
int len;//当前班级人数
}Class, *Classptr;
//声明申请空间函数
Classptr create();
//判满
int Class_full(Classptr C);
//判空
int Class_empty(Classptr C);
//声明添加学生函数
void Class_add(Classptr C);
//输出函数
void Class_output(Classptr C);
//任意位置插入
int Class_insert_pos(Classptr C);
//任意位置删除
int Class_delete_pos(Classptr C);
//任意位置修改函数
int Class_update_pos(Classptr C);
//按姓名查找
void Class_search_name(Classptr C);
//释放顺序表
void Class_free(Classptr C);
//按照姓名修改
void Class_update_name(Classptr C);
//按照成绩排序
void Class_sort(Classptr C);