完成顺序表操作,要求数据元素是构造数据类型
class.h文件
#ifndef _CLASS_H_
#define _CLASS_H_
#define MAX 40
typedef int datatype;
typedef struct
{
char name[20];
double score;
char sex;
}Student;
typedef struct
{
Student s[MAX];
int len;
}Class,*ClassPtr;
//创建顺序表
ClassPtr list_creat();
//判空
int list_empty(ClassPtr C);
//判满
int list_full(ClassPtr C);
//向顺序表中添加元素
int list_add(ClassPtr C,Student s);
//遍历顺序表
void list_show(ClassPtr C);
//任意位置插入元素
int list_insert_pos(ClassPtr C,int pos, Student s);
//任意位置删除
int list_delete_pos(ClassPtr C,int pos);
//按位置修改指定元素
int list_change_pos(ClassPtr C,int pos,datatype e);
//按位置查找
void list_search_pos(ClassPtr C,int pos);
//排序
void list_sort(ClassPtr C);
//求最值
void list_MAX_MIN(ClassPtr C);
//顺序表反转
void list_reverse(ClassPtr C);
//释放顺序表
void list_free(ClassPtr C);
#endif
class.c文件
#include"class.h"
#include
#include
#include
//创建顺序表
ClassPtr list_creat()
{
ClassPtr C=(ClassPtr)malloc(sizeof(Class));
if(NULL==C)
{
printf("顺序表创建失败\n");
return NULL;
}
memset(C->s,0,sizeof(C->s));
C->len=0;
printf("顺序表创建成功\n");
return C;
}
//判空
int list_empty(ClassPtr C)
{
if(NULL==C)
{
printf("所给顺序表不合法\n");
return 0;
}
return C->len==0;
}
//判满
int list_full(ClassPtr C)
{
if(NULL==C)
{
printf("所给顺序表不合法\n");
return 0;
}
return C->len==MAX;
}
//向顺序表中添加元素
int list_add(ClassPtr C, Student s)
{
if(NULL==C||list_full(C))
{
printf("添加失败\n");
return 0;
}
C->s[C->len]=s;
C->len++;
printf("添加成功\n");
return 1;
}
//遍历顺序表
void list_show(ClassPtr C)
{
if(NULL==C||list_empty(C))
{
printf("遍历失败\n");
return;
}
printf("当前顺序表内的学生信息为:\n");
for(int i=0;ilen;i++)
{
printf("%s\t",C->s[i].name);
printf("%lf\t",C->s[i].score);
printf("%c\n",C->s[i].sex);
}
return;
}
//任意位置插入元素
int list_insert_pos(ClassPtr C,int pos, Student s)
{
if(NULL==C||list_full(C)||pos<0||pos>C->len)
{
printf("插入失败\n");
return 0;
}
for(int i=C->len-1;i>=pos;i--)
{
C->s[i+1]=C->s[i];
}
C->s[pos]=s;
C->len++;
printf("插入成功\n");
return 1;
}
//任意位置删除
int list_delete_pos(ClassPtr C,int pos)
{
if(NULL==C||list_empty(C)||pos<0||pos>=C->len)
{
printf("删除失败\n");
return 0;
}
for(int i=pos;ilen-1;i++)
{
C->s[i]=C->s[i+1];
}
C->len--;
printf("删除成功\n");
return 1;
}
//按位置修改指定学生分数
int list_change_pos(ClassPtr C,int pos,datatype e)
{
if(NULL==C||list_empty(C)||pos<0||pos>=C->len)
{
printf("修改失败\n");
return 0;
}
C->s[pos].score=e;
printf("按位置修改成功\n");
return 1;
}
//按位置查找
void list_search_pos(ClassPtr C,int pos)
{
if(NULL==C||pos<0||pos>=C->len||list_empty(C))
{
printf("查找失败\n");
return;
}
printf("按位查找成功\n");
printf("查找到的学生为%s\t%lf\t%c\n",C->s[pos].name,C->s[pos].score,C->s[pos].sex);
return;
}
//按分数排序
void list_sort(ClassPtr C)
{
if(NULL==C)
{
printf("排序失败\n");
}
int index=0;
for(int i=0;ilen-1;i++)
{
index=i;
for(int j=i;jlen;j++)
{
if(C->s[index].score>C->s[j].score)
{
index=j;
}
}
if(index!=i)
{
double temp=C->s[i].score;
C->s[i].score=C->s[index].score;
C->s[index].score=temp;
}
}
printf("排序成功\n");
return;
}
//求最值
void list_MAX_MIN(ClassPtr C)
{
double max=C->s[0].score;
double min=C->s[0].score;
for(int i=0;ilen;i++)
{
if(C->s[i].score>max)
{
max=C->s[i].score;
}
if(C->s[i].scores[i].score;
}
}
printf("最大值为%lf最小值为%lf\n",max,min);
}
//顺序表反转
void list_reverse(ClassPtr C)
{
int i=0,j=C->len-i-1;
while(is[j];
C->s[j]=C->s[i];
C->s[i]=temp;
i++;
j--;
}
printf("反转成功\n");
}
//释放顺序表
void list_free(ClassPtr C)
{
if(NULL != C)
{
free(C);
C=NULL;
}
printf("释放成功");
}
main.c文件
#include "class.h"
#include
#include
#include
int main(int argc, const char *argv[])
{
ClassPtr C=list_creat();
if(NULL==C)
{
return -1;
}
Student s0={"小灰灰",60,'M'};
Student s1={"喜羊羊",100,'M'};
Student s2={"美羊羊",70,'W'};
Student s3={"懒羊羊",50,'M'};
Student s4={"沸羊羊",50,'M'};
Student s5={"暖羊羊",80,'W'};
list_add(C,s0);
list_add(C,s1);
list_add(C,s2);
list_add(C,s3);
list_add(C,s4);
int flag=0;
int a,b,c,d,f;
double e;
while(1)
{
printf("1.打印所有学生信息\n");
printf("2.查找指定学生信息\n");
printf("3.删除指定学生信息\n");
printf("4.修改指定学生成绩\n");
printf("5.查询最高分和最低分\n");
printf("请输入数字执行对应指令:");
scanf("%d",&flag);
if(flag==1)
{
list_show(C);
printf("是否继续?\n");
printf("1.继续\n");
printf("2.退出\n");
scanf("%d",&a);
if(a==1)
{
continue;
}
else if(a==2)
{
break;
}
}
if(flag==2)
{
printf("请输入指定学生下标\n");
scanf("%d",&b);
list_search_pos(C,b);
printf("是否继续?\n");
printf("1.继续\n");
printf("2.退出\n");
scanf("%d",&a);
if(a==1)
{
continue;
}
else if(a==2)
{
break;
}
}
if(flag==3)
{
printf("请输入指定学生下标\n");
scanf("%d",&c);
list_delete_pos(C,c);
printf("是否继续?\n");
printf("1.继续\n");
printf("2.退出\n");
scanf("%d",&a);
if(a==1)
{
continue;
}
else if(a==2)
{
break;
}
}
if(flag==4)
{
printf("请输入指定学生下标\n");
scanf("%d",&d);
printf("请输入指定学生成绩\n");
scanf("%lf",&e);
list_change_pos(C,d,e);
printf("是否继续?\n");
printf("1.继续\n");
printf("2.退出\n");
scanf("%d",&a);
if(a==1)
{
continue;
}
else if(a==2)
{
break;
}
}
if(flag==5)
{
list_MAX_MIN(C);
printf("是否继续?\n");
printf("1.继续\n");
printf("2.退出\n");
scanf("%d",&a);
if(a==1)
{
continue;
}
else if(a==2)
{
break;
}
}
}
return 0;
}
运行结果
顺序表创建成功
添加成功
添加成功
添加成功
添加成功
添加成功
1.打印所有学生信息
2.查找指定学生信息
3.删除指定学生信息
4.修改指定学生成绩
5.查询最高分和最低分
请输入数字执行对应指令:1
当前顺序表内的学生信息为:
小灰灰 60.000000 M
喜羊羊 100.000000 M
美羊羊 70.000000 W
懒羊羊 50.000000 M
沸羊羊 50.000000 M
是否继续?
1.继续
2.退出
1
1.打印所有学生信息
2.查找指定学生信息
3.删除指定学生信息
4.修改指定学生成绩
5.查询最高分和最低分
请输入数字执行对应指令:2
请输入指定学生下标
2
按位查找成功
查找到的学生为美羊羊 70.000000 W
是否继续?
1.继续
2.退出
1
1.打印所有学生信息
2.查找指定学生信息
3.删除指定学生信息
4.修改指定学生成绩
5.查询最高分和最低分
请输入数字执行对应指令:5
最大值为100.000000最小值为50.000000
是否继续?
1.继续
2.退出
2