day19 小作业

实现顺序表

头文件:

#ifndef _FUN_H_
#define _FUN_H_
#include
#include
#include
#define MAX 40
typedef struct 
{
	char name[20]; 	//姓名
	char sex[20]; 	//性别
	char job[20]; 	//职业
	union
	{
		char ke[20]; 	//教的课程
		double soc; //成绩
	};
	struct
	{
		int year; 	//年
		int moth; 	//月
		int day; 	//日
	};

}sut,*sut_ptr;
typedef struct 
{
	sut sutdent[MAX]; //定义一个类型为成员的数组
	int len; 		  //记录成员的人数
}class1,*class_ptr;
//创建并初始化顺序表
class_ptr chuang();

//判满
int man(class_ptr H);
//判空
int kong(class_ptr H);
//加入成员
int ru(class_ptr H,sut p);
//遍历成员
int bl(class_ptr H);
//新增成员
int add(class_ptr H,int pos,sut p);
//查找成员
int cha(class_ptr H,sut p);
//删除成员
int shan(class_ptr H,sut p);
//更新成员信息
int geng(class_ptr H,int pos,sut p);
//释放顺序表
void fang(class_ptr H);
#endif

功能函数: 

#include"fun.h"
/********************创建并初始化顺序表****************************/
class_ptr chuang()
{
	class_ptr H = (class_ptr)malloc(sizeof(class1)*MAX); //创建顺序表
	if(H == NULL)
	{
		printf("顺序表创建失败!\n");
		return NULL;
	}
	memset(H->sutdent,0,sizeof(H->sutdent)); 	//初始化顺序表
	H->len = 0;
	return H; 						//返回顺序表
}

/**************************判满***********************************/
int man(class_ptr H)
{
	if(H == NULL)
	{
		printf("顺序表不合法!\n");
		return -1;
	}
	return H->len == MAX;
}
/**************************判空***********************************/
int kong(class_ptr H)
{
	if(H == NULL)
	{
		printf("顺序表不合法!\n");
		return -1;
	}
	return H->len == 0;
}
/**************************加入成员***********************************/
int ru(class_ptr H,sut p)
{
	if(man(H))
	{
		printf("添加成员失败!\n");
		return 0;
	}
	H->sutdent[H->len] = p;  //将成员添加进顺序表中
	H->len++; 				//成员数量加一
	printf("输入成功!\n");
	return 1;
}
/**************************遍历成员***********************************/
int bl(class_ptr H)
{
	if(kong(H))
	{
		printf("遍历失败!\n");
		return 0;
	}
	printf("序号\t姓名\t性别\t职业\t职业内容\t生日\n");
	for(int i = 0; i < H->len;i++)  					//循环输出成员信息
	{
		//根据该成员的职业输出
		if(strcmp(H->sutdent[i].job,"学生") == 0)
		{
			printf("%d\t%s\t%s\t%s\t%.1lf\t\t%d/%02d/%02d\n",i+1,\
					H->sutdent[i].name,H->sutdent[i].sex,\
					H->sutdent[i].job,H->sutdent[i].soc,\
					H->sutdent[i].year,H->sutdent[i].moth,\
					H->sutdent[i].day);
		}
		else
		{
			printf("%d\t%s\t%s\t%s\t%s\t\t%d/%02d/%02d\n",i+1,\
					H->sutdent[i].name,H->sutdent[i].sex,\
					H->sutdent[i].job,H->sutdent[i].ke,\
					H->sutdent[i].year,H->sutdent[i].moth,\
					H->sutdent[i].day);
		}
	}
	return 1;
}
/**************************新增成员***********************************/
int add(class_ptr H,int pos,sut p)
{
	if(man(H) || pos > H->len || pos < 1)
	{
		printf("添加成员失败!\n");
		return 0;
	}
	//循环将该位置及之后的成员向后移
	for(int i = H->len;i >= pos;i--)
	{
		H->sutdent[i] = H->sutdent[i-1];
	}
	//添加新成员
	H->sutdent[pos-1] = p;
	//循环表中人数加一
	H->len++;
	printf("添加成功!\n");
	return 1;
}
/**************************查找成员************************************/
int cha(class_ptr H,sut p)
{
	if(kong(H))
	{
		printf("查找成员失败!\n");
		return 0;
	}
	//定义一个标志位用于最后判断是否找到了该成员
	int a = 0;
	//遍历每一个成员
	for(int i = 0; i < H->len;i++)
	{
		//查找是否有该成员
		if(strcmp(p.name,H->sutdent[i].name) == 0)
		{
			//如果找到了该成员,标志位等于一
			if(a == 0)
			{
				printf("有此人!\n");
			}
			a = 1;
			if(strcmp(H->sutdent[i].job,"学生") == 0)
			{
				printf("%d\t%s\t%s\t%s\t%.1lf\t\t%d/%02d/%02d\n",i+1,\
						H->sutdent[i].name,H->sutdent[i].sex,\
						H->sutdent[i].job,H->sutdent[i].soc,\
						H->sutdent[i].year,H->sutdent[i].moth,\
						H->sutdent[i].day);
			}
			else
			{
				printf("%d\t%s\t%s\t%s\t%s\t\t%d/%02d/%02d\n",i+1,\
						H->sutdent[i].name,H->sutdent[i].sex,\
						H->sutdent[i].job,H->sutdent[i].ke,\
						H->sutdent[i].year,H->sutdent[i].moth,\
						H->sutdent[i].day);
			}
		}
	}
	//如果标志位没变,则没找到该成员
	if(a == 0)
	{
		printf("查无此人!\n");
		return 0;
	}
	return 1;
}
/**************************删除成员************************************/
int shan(class_ptr H,sut p)
{
	if(kong(H))
	{
		printf("删除成员失败!\n");
		return 0;
	}
	//遍历每一个成员
	for(int i = 0; i < H->len;i++)
	{
		if(strcmp(p.name,H->sutdent[i].name) == 0)
		{
			for(int j = i;j < H->len-1;j++)
			{
				H->sutdent[j] = H->sutdent[j+1];
			}
			H->len--;
		}
	}
	printf("删除成功!\n");
	return 1;

}
/**************************更新成员信息************************************/
int geng(class_ptr H,int pos,sut p)
{
	if(kong(H)||pos < 1||pos > H->len)
	{
		printf("遍历失败!\n");
		return 0;
	}
	H->sutdent[pos-1] = p;
	printf("更新成功!\n");
	return 1;

}
/**************************释放顺序表************************************/
void fang(class_ptr H)
{
	if(H == NULL)
	{
		printf("顺序表不合法!\n");
		return ;
	}
	free(H);
	H = NULL;
}

 主函数:

#include"fun.h"
int main(void)
{
	class_ptr H = chuang(); //创建并初始化顺序表
	if(H == NULL)
	{
		return 0;
	}
	int g; 			//用来存储功能序号
	char down; 		//用来存储是否要结束输入
	int pos; 		//用来存储下标
	sut sutdent1; 	//定义一个类型为成员的变量
	while(1) 		//用死循环来循环询问要实现什么功能
	{
		system("clear");  //清屏
		printf("---------------------------------\n");
		printf("|    0:退出系统                |\n\
|    1:加入成员                |\n\
|    2:查看顺序表              |\n\
|    3:新增成员                |\n\
|    4:查找成员                |\n\
|    5:删除成员                |\n\
|    6:清空顺序表              |\n\
|    7:更新成员成绩/授课课程   |\n\
|    8:查看人数                |\n");
		printf("---------------------------------\n");
		printf("请输入想要实现的功能:");
		scanf("%d",&g);
		switch(g)
		{
		case 0: 	//结束循环
			break;
		case 1: 	//加入成员
			while(1)
			{
				printf("是否继续输入(q结束):");
				scanf(" %c",&down); 				//利用标志位判断是否需要退出循环
				if(down == 'q' || down == 'Q')
				{
					break;
				}
				//输入要添加的成员的信息
				printf("请输入成员的姓名:");
				scanf("%s",sutdent1.name);
				printf("请输入成员的性别:");
				scanf("%s",sutdent1.sex);
				printf("请输入成员的生日:");
				scanf("%d/%d/%d",&sutdent1.year,&sutdent1.moth,&sutdent1.day);
				printf("请输入成员的职业:");
				scanf("%s",sutdent1.job);
				if(strcmp(sutdent1.job,"学生") == 0)
				{
					printf("请输入学生的成绩:");
					scanf("%lf",&sutdent1.soc);
				}
				else if(strcmp(sutdent1.job,"教师") == 0)
				{
					printf("请输入教师所教的课程:");
					scanf("%s",sutdent1.ke);
				}
				ru(H,sutdent1); //调用加入成员函数
			}
			break;
		case 2: 	//遍历成员 
			while(1)
			{
				bl(H);//调用遍历成员函数
				printf("是否退出查看(q结束):");
				scanf(" %c",&down); 				//利用标志位判断是否需要退出
				if(down == 'q' || down == 'Q')
				{
					break;
				}
			}
			break;
		case 3:  	//新增成员
			while(1)
			{
				//输入要添加的成员的信息
				printf("请输入要添加的位置:");
				scanf("%d",&pos);
				printf("请输入成员的姓名:");
				scanf("%s",sutdent1.name);
				printf("请输入成员的性别:");
				scanf("%s",sutdent1.sex);
				printf("请输入成员的生日:");
				scanf("%d/%d/%d",&sutdent1.year,&sutdent1.moth,&sutdent1.day);
				printf("请输入成员的职业:");
				scanf("%s",sutdent1.job);
				if(strcmp(sutdent1.job,"学生") == 0)
				{
					printf("请输入学生的成绩:");
					scanf("%lf",&sutdent1.soc);
				}
				else if(strcmp(sutdent1.job,"教师") == 0)
				{
					printf("请输入教师所教的课程:");
					scanf("%s",sutdent1.ke);
				}
				add(H,pos,sutdent1); //调用新增成员函数
				printf("是否继续输入(q结束):");
				scanf(" %c",&down); 			//借用标志位判断是否退出循环
				if(down == 'q' || down == 'Q')
				{
					break;
				}
			}
			break;
		case 4:  	//查找成员
			while(1)
			{
				printf("请输入想查找的成员:");
				scanf("%s",sutdent1.name);
				cha(H,sutdent1);
				printf("是否继续输入(q结束):");
				scanf(" %c",&down); 				//利用标志位判断是否需要退出循环
				if(down == 'q' || down == 'Q')
				{
					break;
				}
			}
			break;
		case 5:  	//删除成员
			while(1)
			{
				printf("请输入想删除的成员:");
				scanf("%s",sutdent1.name);
				shan(H,sutdent1);
				printf("是否继续输入(q结束):");
				scanf(" %c",&down); 				//利用标志位判断是否需要退出循环
				if(down == 'q' || down == 'Q')
				{
					break;
				}
			}
			break;
		case 6: 	//释放顺序表
			//调用释放顺序表函数
			fang(H);
			H = NULL;
			break;
		case 7: 	//更新成员信息
			printf("请输入要更新的位置:");
			scanf("%d",&pos);
			if(strcmp(H->sutdent->job,"学生") == 0)
			{
				printf("请输入学生的成绩:");
				scanf("%lf",&sutdent1.soc);
			}
			else if(strcmp(H->sutdent->job,"教师") == 0)
			{
				printf("请输入教师所教的课程:");
				scanf("%s",sutdent1.ke);
			}
			geng(H,pos,sutdent1);
			break;
		case 8: 	//获取当前顺序表中人数
			printf("当前人数为:%d\n",H->len);
			break;
		}
		if(g == 0) 	//结束循环
		{
			break;
		}
	}
	return 0;
}

day19 小作业_第1张图片

 

你可能感兴趣的:(数据结构)