1.顺序表
代码:
seqlist.h:
#ifndef SEQLIST_H
#define SEQLIST_H
#include<myhead.h>
#define MAX 20
typedef int datatype;
typedef struct
{
datatype data[MAX];
int len;
}SeqList,*SeqListPtr;
//声明顺序表的创建函数
SeqListPtr list_create();
//判空函数,空返回真,非空返回假
int list_empty(SeqListPtr L);
//判满函数,满返回真,非满返回假
int list_full(SeqListPtr L);
//添加元素
int list_add(SeqListPtr L, datatype e);
//遍历顺序表
void list_show(SeqListPtr L);
//定义按任意位置插入函数
int list_insert_pos(SeqListPtr L, int pos, datatype e);
//定义任意位置删除函数
int list_delete_pos(SeqListPtr L, int pos);
//定义按值查找位置函数
int list_search_value(SeqListPtr L, datatype e);
//按位置进行修改
int list_update_pos(SeqListPtr L, int pos, datatype e);
//按值进行修改
int list_update_value(SeqListPtr L, datatype old_e, datatype new_e);
#endif
seqlist.c:
#include"seqlist.h"
//定义顺序表的创建函数
SeqListPtr list_create()
{
//在堆区申请一个顺序表的大小空间
SeqListPtr L = (SeqListPtr)malloc(sizeof(SeqList));
if(NULL == L)
{
printf("创建失败\n");
return NULL;
}
//程序执行至此,表示顺序表创建成功
memset(L->data, 0, sizeof(L->data)); //将数组初始化
L->len = 0; //顺序表长度为0
printf("创建成功\n");
return L;
}
//判空函数,空返回真,非空返回假
int list_empty(SeqListPtr L)
{
return L->len==0;
}
//判满函数,满返回真,非满返回假
int list_full(SeqListPtr L)
{
return L->len==MAX;
}
//添加元素
int list_add(SeqListPtr L, datatype e)
{
//判断逻辑
if(NULL==L || list_full(L))
{
printf("添加失败\n");
return -1;
}
//添加逻辑:将要添加的元素放到最后一个位置
L->data[L->len] = e;
//表的变化
L->len++;
printf("添加成功\n");
return 0;
}
//遍历顺序表
void list_show(SeqListPtr L)
{
//判断逻辑
if(NULL == L || list_empty(L))
{
printf("遍历失败\n");
return ;
}
//遍历
printf("顺序表中元素分别是:");
for(int i=0; i<L->len; i++)
{
printf("%d\t", L->data[i]);
}
printf("\n");
}
//定义任意位置插入函数
int list_insert_pos(SeqListPtr L, int pos, datatype e)
{
//判断逻辑
if(NULL==L || list_full(L) || pos<0 || pos>L->len)
{
printf("插入失败\n");
return -1;
}
//腾空逻辑
for(int i=L->len-1; i>=pos; i--)
{
L->data[i+1] = L->data[i];//将前面的元素后移
}
//插入数据
L->data[pos] = e;
//表长变化
L->len++;
printf("插入成功\n");
return 0;
}
//定义任意位置删除函数
int list_delete_pos(SeqListPtr L, int pos)
{
//判断逻辑
if(NULL==L || list_empty(L) || pos<0 || pos>=L->len)
{
printf("删除失败\n");
return -1;
}
//删除逻辑
for(int i=pos+1; i<L->len; i++)
{
L->data[i-1] = L->data[i]; //将元素向前偏移
}
//表长变化
L->len --;
printf("删除成功\n");
return 0;
}
//定义按值查找位置函数
int list_search_value(SeqListPtr L, datatype e)
{
//判断逻辑
if(NULL==L || list_empty(L))
{
printf("查找失败\n");
return -1;
}
//遍历整个顺序表
for(int i=0; i<L->len; i++)
{
if(L->data[i] == e)
{
return i; //返回查找到的数据下标
}
}
printf("没找到\n");
return -1;
}
//按位置进行修改
int list_update_pos(SeqListPtr L, int pos, datatype e)
{
//判断逻辑
if(NULL==L || pos<0 || pos>=L->len || list_empty(L))
{
printf("修改失败\n");
return -1;
}
//正常进行修改
L->data[pos] = e;
printf("修改成功\n");
return 0;
}
//按值进行修改
int list_update_value(SeqListPtr L, datatype old_e, datatype new_e)
{
//判断逻辑
if(NULL==L || list_empty(L))
{
printf("修改失败\n");
return -1;
}
//根据旧值找的位置
int res = list_search_value(L, old_e);
if(res == -1)
{
printf("没有要修改的值\n");
return -1;
}
//调用函数完成按位置修改
list_update_pos(L, res, new_e);
printf("修改成功\n");
return 0;
}
main.c:
#include"seqlist.h"
int main(int argc, const char *argv[])
{
//创建一个顺序表
SeqListPtr L = list_create();
if(NULL == L)
{
return -1;
}
//调用添加函数
list_add(L, 520);
list_add(L, 1314);
list_add(L, 999);
list_add(L, 666);
//调用遍历函数
list_show(L);
//调用任意位置插入函数
list_insert_pos(L, 0, 100);
list_insert_pos(L, 2, 100);
list_insert_pos(L, 6, 100);
//输出
list_show(L);
//调用删除函数
list_delete_pos(L, 3);
list_show(L);
//调用查找函数
int res = list_search_value(L, 999);
if(res >= 0)
{
printf("您要找的元素在第%d个位置\n", res+1);
}
//调用按位置修改函数
list_update_pos(L, 0, 1234);
list_show(L);
//调用按值修改函数
list_update_value(L, 999, 888);
list_show(L);
return 0;
}
运行结果:
2.班级管理系统
代码:
head.h:
#ifndef HEAD_H
#define HEAD_H
#include<myhead.h>
#define MAX 100 //最大容量
//定义学生类型
typedef struct Stu
{
char name[20];
int age;
double score;
}Stu,* Stu_str;
//定义班级类型
typedef struct Class
{
struct Stu student[MAX]; //存放学生的容器
int size; //实际人数
}Class,* Class_str;
//函数声明
void create_menu();
Class_str create();
int empty(Class_str C);
int full(Class_str C);
int del(Class_str C, int pos);
int update(Class_str C,int pos,char *a, int b, double c);
int search(Class_str C, char *n);
void input(Class_str C);
void sort(Class_str C);
void maxmin(Class_str C);
void output(Class_str C);
void destroy(Class_str C);
void class_add(Class_str C);
void class_del(Class_str C);
void class_update(Class_str C);
void class_search(Class_str C);
#endif
hs.h:
#include "head.h"
//定义创建菜单函数
void create_menu()
{
printf("\n\t\t======班级管理系统========\n");
printf("\t\t1、录入班级学生信息\n");
printf("\t\t2、按成绩把班级学生信息降序\n");
printf("\t\t3、展示成绩最高和最低学生的信息\n");
printf("\t\t4、展示班级学生信息\n");
printf("\t\t5、销毁班级\n");
printf("\t\t6、增加班级学生信息\n");
printf("\t\t7、删除班级学生信息\n");
printf("\t\t8、修改班级学生信息\n");
printf("\t\t9、查询班级学生信息\n");
printf("\t\t0、退出\n");
}
//定义创建班级函数
Class_str create()
{
//申请内存
Class_str C = (Class_str)malloc(sizeof(Class));
if(NULL == C)
{
printf("创建失败!");
return NULL;
}
//内存空间初始化
memset(C->student,0,sizeof(C->student));
C->size = 0;
printf("创建成功!\n");
//返回内存地址
return C;
}
//判空函数,空返回真,非空返回假
int empty(Class_str C)
{
return C->size==0;
}
//判满函数,满返回真,非满返回假
int full(Class_str C)
{
return C->size==MAX;
}
//定义添加函数
int add(Class_str C, char *a, int b, double c)
{
//判断逻辑
if(NULL==C || full(C))
{
printf("添加失败\n");
return -1;
}
//添加逻辑:将要添加的元素放到最后一个位置
strcpy(C->student[C->size].name,a);
C->student[C->size].age = b;
C->student[C->size].score = c;
//表的变化
C->size++;
printf("添加成功!\n");
return 0;
}
//定义删除函数
int del(Class_str C, int pos)
{
//判断逻辑
if(NULL==C || empty(C) || pos<0 || pos>=C->size)
{
printf("删除失败!\n");
return -1;
}
//删除逻辑
for(int i=pos+1; i<C->size; i++)
{
C->student[i-1] = C->student[i]; //将元素向前偏移
}
//表长变化
C->size --;
printf("删除成功!\n");
return 0;
}
//定义修改函数
int update(Class_str C,int pos,char *a, int b, double c)
{
//判断逻辑
if(NULL==C || pos<0 || pos>=C->size || empty(C))
{
printf("修改失败!\n");
return -1;
}
//正常进行修改
strcpy(C->student[pos].name,a);
C->student[pos].age = b;
C->student[pos].score = c;
printf("修改成功!\n");
return 0;
}
//定义查找函数
int search(Class_str C, char *n)
{
//判断逻辑
if(NULL==C || empty(C))
{
printf("查找失败!\n");
return -1;
}
//遍历整个顺序表
for(int i=0; i<C->size; i++)
{
if(strcmp(C->student[i].name,n) == 0)
{
return i; //返回查找到的数据下标
}
}
printf("班里没有这名同学!\n");
return -1;
}
//定义班级学生信息录入函数
void input(Class_str C)
{
printf("请输入班级学生人数:");
scanf("%d",&C->size);
getchar();
putchar(10);
for(int i=0; i<C->size; i++)
{
printf("请输入第%d个学生的名字:", i+1);
scanf("%s", C->student[i].name);
printf("请输入第%d个学生的年龄:", i+1);
scanf("%d", &C->student[i].age);
printf("请输入第%d个学生的分数:", i+1);
scanf("%lf", &C->student[i].score);
putchar(10);
}
printf("录入成功!\n");
}
//定义按成绩把班级学生信息降序函数
void sort(Class_str C)
{
if(NULL == C)
{
printf("班级不存在!");
return;
}
for(int i=1;i<C->size;i++)
{
for(int j=0;j<C->size - i;j++)
{
if(C->student[j].score < C->student[j+1].score)
{
Stu temp = C->student[j];
C->student[j] = C->student[j+1];
C->student[j+1] = temp;
}
}
}
printf("排序成功!\n");
}
//定义展示成绩最好和最差学生信息函数
void maxmin(Class_str C)
{
if(NULL == C)
{
printf("班级不存在!");
return;
}
int max = 0,maxi = 0,min = 0,mini = 0;
max = C->student[0].score;
min = C->student[0].score;
for(int i=0;i<C->size;i++)
{
if(max < C->student[i].score)
{
max = C->student[i].score;
maxi = i;
}
if(min > C->student[i].score)
{
min = C->student[i].score;
mini = i;
}
}
printf("班级成绩最好学生信息如下:\n");
printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
C->student[maxi].name, C->student[maxi].age, C->student[maxi].score);
printf("班级成绩最差学生信息如下:\n");
printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
C->student[mini].name, C->student[mini].age, C->student[mini].score);
}
//定义展示班级学生信息函数
void output(Class_str C)
{
if(NULL == C || empty(C))
{
printf("班级不存在!\n");
return;
}
printf("班级学生信息如下:\n");
for(int i=0; i<C->size; i++)
{
printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
C->student[i].name, C->student[i].age, C->student[i].score);
}
}
//定义销毁班级函数
void destroy(Class_str C)
{
//释放内存
if(NULL != C)
{
free(C); //释放空间
C = NULL;
}
}
//定义增加班级学生信息函数
void class_add(Class_str C)
{
char a[20] = {0};
int b = 0;
double c = 0;
printf("请输入要添加的学生姓名:");
scanf("%s",a);
printf("请输入要添加的学生年龄:");
scanf("%d",&b);
printf("请输入要添加的学生分数:");
scanf("%lf",&c);
add(C,a,b,c);
}
//定义删除班级学生信息函数
void class_del(Class_str C)
{
char n[20] = {0};
printf("请输入要删除的学生姓名:");
scanf("%s",n);
getchar();
int pos = search(C,n);
del(C,pos);
}
//定义修改班级学生信息函数
void class_update(Class_str C)
{
char n[20] = {0}, a[20] = {0};
int b = 0;
double c = 0;
printf("请输入要修改的学生姓名:");
scanf("%s",n);
putchar(10);
int pos = search(C,n);
printf("请输入修改后的学生姓名:");
scanf("%s",a);
printf("请输入修改后的学生年龄:");
scanf("%d",&b);
printf("请输入修改后的学生分数:");
scanf("%lf",&c);
update(C,pos,a,b,c);
}
//定义查询班级学生信息函数
void class_search(Class_str C)
{
char n[20] = {0};
printf("请输入要查询的学生姓名:");
scanf("%s",n);
putchar(10);
int pos = search(C,n);
printf("该学生信息如下:\n");
printf("\t姓名\t年龄\t分数\n\t%s\t%d\t%lf\n", \
C->student[pos].name, C->student[pos].age, C->student[pos].score);
}
main.h:
#include "head.h"
int main(int argc, const char *argv[])
{
//菜单
int menu =0;
//创建一个班级
Class_str C = create();
if(NULL == C)
{
return -1;
}
while(1)
{
create_menu(); //创建菜单
printf("请输入操作码:");
scanf("%d",&menu);
getchar();
switch(menu)
{
case 1:
{
input(C); //录入
}
break;
case 2:
{
sort(C); //排序
}
break;
case 3:
{
maxmin(C); //成绩最好最差的学生
}
break;
case 4:
{
output(C); //输出
}
break;
case 5:
{
destroy(C); //销毁
C = NULL;
printf("销毁成功!\n");
}
break;
case 6:
{
class_add(C); //添加
}
break;
case 7:
{
class_del(C); //删除
}
break;
case 8:
{
class_update(C); //修改
}
break;
case 9:
{
class_search(C); //查询
}
break;
case 0:goto END;
default:printf("不存在该操作码!\n");
}
}
END:
return 0;
}
运行结果:
3.思维导图: