实现顺序表
头文件:
#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;
}