创建学生顺序表
1、头文件
#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[10]; //性别
int score; //成绩
}datatype;
//定义顺序表类型
typedef struct
{
datatype data[MAX]; //存储数据元素的数组
int len; //顺序表的长度
}stuList,*stuListPtr; //重命名
//创建学生顺序表
stuListPtr list_create();
//判满
int list_full(stuListPtr S);
//判空
int list_empty(stuListPtr S);
//向顺序表中添加学生信息
int list_add(stuListPtr S);
//遍历学生顺序表
void list_show(stuListPtr S);
//任意位置插入学生信息
int list_insert_pos(stuListPtr S);
//任意位置删除学生信息
int list_delete_pos(stuListPtr S);
//按位置进行修改学生信息
int list_update_pos(stuListPtr S);
//按位置查找学生
datatype *list_search_pos(stuListPtr S);
//按姓名进行查找学生,返回查到的位置
int list_search_value(stuListPtr S);
//清空学生顺序表
void list_free(stuListPtr S);
#endif
2、源代码
#include"student.h"
//创建学生顺序表
stuListPtr list_create()
{
//在堆区申请一个顺序表的大小
stuListPtr S=(stuListPtr)malloc(sizeof(stuList));
//判断是否申请成功
if(NULL == S)
{
printf("顺序表创建失败\n");
return NULL;
}
//此时顺序表已经创建成功
memset(S->data, 0, sizeof(S->data)); //清空数组
S->len = 0; //数组长度清零
printf("顺序表创建成功\n");
return S;
}
//判满
int list_full(stuListPtr S)
{
//判断逻辑
if(NULL == S)
{
printf("所给顺序表不合法\n");
return 0;
}
//合法,返回是否已经满了
return S->len == MAX;
}
//判空
int list_empty(stuListPtr S)
{
//判断逻辑
if(NULL == S)
{
printf("所给顺序表不合法\n");
return 0;
}
//合法返回是否为空
return S->len == 0;
}
//向班级顺序表中添加学生信息
int list_add(stuListPtr S)
{
//判断逻辑
if(NULL==S || list_full(S))
{
printf("添加失败\n");
return 0;
}
//添加逻辑
for(S->len=0; S->len<MAX; S->len++){
int key = 0;
printf("请问是否添加学生信息(Y|N):\n");
scanf(" %c",&key);
if(key == 'Y' || key == 'y')
{
printf("添加第%d个学生信息:\n",S->len+1);
printf("姓名:");
scanf("%s",S->data[S->len].name);
printf("性别:");
scanf("%s",S->data[S->len].sex);
printf("成绩:");
scanf("%d",&S->data[S->len].score);
printf("添加成功\n");
}else if(key == 'N' || key == 'n')
{
printf("停止添加\n");
return 0;
}
}
}
//遍历学生顺序表
void list_show(stuListPtr S){
if(NULL==S || list_empty(S))
{
printf("遍历失败\n");
return ;
}
printf("当前顺序表内的学生信息为:\n");
for(int i=0; i<S->len; i++)
{
printf("姓名\t性别\t成绩\n");
printf("%s\t%s\t%d\n",S->data[i].name,\
S->data[i].sex,\
S->data[i].score);
}
}
//任意位置插入学生信息
int list_insert_pos(stuListPtr S){
if(NULL==S||list_full(S)){
printf("不合法\n");
return 0;
}
int a,pos;
printf("请问是否插入学生信息(Y|N):\n");
scanf(" %c",&a);
if(a == 'Y' || a == 'y'){
printf("请输入向要插入的位置:\n");
scanf("%d",&pos);
//判断逻辑
if(NULL == S || pos>S->len || pos<1)
{
printf("插入失败n");
return 0;
}
//开始插入
for(int i=S->len-1; i>=pos; i--)
{
S->data[S->len+1] = S->data[S->len];
printf("请输入需要插入学员信息:\n");
printf("姓名:");
scanf("%s",S->data[pos].name);
printf("性别:");
scanf("%s",S->data[pos].sex);
printf("成绩:");
scanf("%d",&S->data[pos].score);
S->len++;
return 1;
}
}
}
//任意位置删除学生信息
int list_delete_pos(stuListPtr S)
{
//判断逻辑
if(NULL==S||list_empty(S))
{
printf("删除失败,表为空\n");
return 0;
}
int pos = 0;
printf("请选择删除的学生序号:\n");
scanf("%d",&pos);
//判断
if(pos<1 || pos>S->len)
{
printf("删除失败,无此学生\n");
return 0;
}
//开始删除
for(int i=pos; i<S->len; i++)
{
S->data[i-1]=S->data[i];
}
printf("删除成功\n");
S->len--;
return 1;
}
//按位置进行修改学生信息
int list_update_pos(stuListPtr S)
{
//判断逻辑
if(NULL==S || list_empty(S))
{
printf("修改失败,表为空\n");
return 0;
}
int pos=0;
printf("请选择修改信息的学生序号:\n");
scanf("%d",&pos);
if(pos<1 || pos>S->len)
{
printf("修改失败,无此学生\n");
return 0;
}
//开始修改
printf("请输入需要修改学生的信息:\n");
printf("姓名:");
scanf("%s",S->data[pos-1].name);
printf("性别:");
scanf("%s",S->data[pos-1].sex);
printf("成绩:");
scanf("%d",&S->data[pos-1].score);
printf("修改成功\n");
return 1;
}
//按位置查找学生
datatype *list_search_pos(stuListPtr S)
{
if(NULL==S||list_empty(S)){
printf("查找失败,表为空\n");
return NULL;
}
int pos=0;
printf("请输入需要查找学生编号\n");
scanf("%d",&pos);
if(pos<1||pos>S->len){
printf("查找失败,学生编号不存在\n");
return NULL;
}
printf("该学生信息为:\n");
printf("姓名\t性别\t成绩\n");
printf("%s\t%s\t%d\n",S->data[pos-1].name,\
S->data[pos-1].sex,\
S->data[pos-1].score);
return &S->data[pos-1];
}
//按姓名进行查找学生,返回查到的位置
int list_search_value(stuListPtr S)
{
//判断逻辑
if(NULL==S || list_empty(S))
{
printf("查找失败,表为空\n");
return 0;
}
//开始查找
char name[20];
int pos=0;
printf("请输入需要查找学生姓名:\n");
scanf("%s",name);
for(int i=0; i<S->len; i++)
{
if(strcmp(S->data[i].name,name) == 0)
{
pos = i+1;
printf("该学生是%d号学生\n",pos);
return pos;
}else if(strcmp(S->data[i].name,name) != 0)
{
printf("查无此人\n");
return 0;
}
}
}
//清空学生顺序表
void list_free(stuListPtr S)
{
if(NULL != S)
{
free(S);
S = NULL;
}
printf("释放表成功\n");
}
3、测试文件
#include"student.h"
int main(int argc, const char *argv[])
{
//申请一个顺序表
stuListPtr S = list_create();
if(NULL == S)
{
return -1;
}
while(1)
{
printf("**********进入学生信息管理***********\n");
printf("\n");
printf("**********按1:添加学生信息***********\n");
printf("**********按2:查看学生信息***********\n");
printf("**********按3:按编号查找学生信息*****\n");
printf("**********按4:按姓名查找学生信息*****\n");
printf("**********按5:插入学生信息***********\n");
printf("**********按6:删除学生信息***********\n");
printf("**********按7:修改学生信息***********\n");
printf("**********按8:清空学生信息***********\n");
printf("**********按9:退出学生信息管理********\n");
printf("请进行操作选择:");
int num = 0;
scanf("%d",&num);
switch(num)
{
case 1:
//添加学生信息
list_add(S);
break;
case 2:
//查看学生信息
list_show(S);
break;
case 3:
//按编号查找学生信息
list_search_pos(S);
break;
case 4:
//按姓名查找学生信息
list_search_value(S);
break;
case 5:
//插入学生信息
list_insert_pos(S);
break;
case 6:
//删除学生信息
list_delete_pos(S);
break;
case 7:
//修改学生信息
list_update_pos(S);
break;
case 8:
//清空学生信息
list_free(S);
break;
case 9:
return 0;//退出
default:
break;
}
}
return 0;
}
思维导图