23062数据结构04

完成顺序表操作,要求数据元素是构造数据类型

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 <stdio.h>
#include <string.h>
#include <stdlib.h>

//创建顺序表
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;i<C->len;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;i<C->len-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;i<C->len-1;i++)
	{
		index=i;
		for(int j=i;j<C->len;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;i<C->len;i++)
	{
		if(C->s[i].score>max)
		{
			max=C->s[i].score;
		}
		if(C->s[i].score<min)
		{
			min=C->s[i].score;
		}
	}
	printf("最大值为%lf最小值为%lf\n",max,min);
}

//顺序表反转
void list_reverse(ClassPtr C)
{
	int i=0,j=C->len-i-1;
	while(i<j)
	{
		Student temp=C->s[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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值