将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数 :
1】顺序表的创建,
2】判满、
3】判空、
4】往顺序表里增加学生信息、
5】遍历学生信息
6】任意位置插入学生信息
7】任意位置删除学生信息
8】修改学生信息
9】查找(按学生的学号查找)、
10】删除重复学生信息
11】销毁顺序表
主函数main.c
#include "stu.h"
int main()
{ int i; stu_p S = stu_create(); if(NULL == S) return 0; else { do { printf("1.添加学生信息\t"); printf("2.遍历学生信息\t"); printf("3.插入学生信息\t"); printf("4.删除学生信息\n"); printf("5.查找学生信息\t"); printf("6.修改学生信息\t"); printf("7.删除重复信息\t"); printf("8.退出信息系统\n"); printf("请输入选项:"); scanf("%d", &i); switch(i) { case 1:stu_add(S);break; case 2:stu_show(S);break; case 3:stu_insert(S);break; case 4:stu_delet(S);break; case 5:stu_find(S);break; case 6:stu_change(S);break; case 7:stu_repeatdel(S);break; case 8:stu_free(S);printf("已退出\n");break; default:printf("没有这个选项,请重新选择"); } }while(8 != i); } return 0;
}
功能函数stu.c
#include"stu.h" //申请顺序表空间
stu_p stu_create()
{ //申请数据结构大小的堆空间 stu_p S = (stu_p)malloc(sizeof(stu)); if(NULL == S) { printf("申请顺序表失败"); return NULL; } memset(S -> name, 0, sizeof(S -> name)); memset(S -> id, 0, sizeof(S -> id)); S -> len = 0; printf("申请顺序表成功\n"); return S;
} //添加学生信息
void stu_add(stu_p S)
{ if(stu_full(S)) { printf("满\n"); return; } printf("请输入学生姓名:"); scanf("%s", S -> name[S -> len]); printf("请输入学生id:"); scanf("%d", &S -> id[S -> len]); S -> len++; stu_show(S);
}
//位插信息
void stu_insert(stu_p S)
{ if(stu_full(S)) { printf("满\n"); return; } printf("请输入要插入的位置:"); int in; scanf("%d", &in); if(in > S -> len || in <= 0 || in > MAX) { printf("所选位置错误\n"); return; } //将插入的位置空出来 for(int i = S -> len; i >= in; i--) { S -> id[i] = S -> id[i - 1]; strcpy(S -> name[i], S -> name[i - 1]); } printf("请输入学生姓名:"); scanf("%s", S -> name[in - 1]); printf("请输入学生id:"); scanf("%d", &S -> id[in - 1]); S -> len++; stu_show(S);
} //位删信息
void stu_delet(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("请输入要删除的位置:"); int in; scanf("%d", &in); if(in > S -> len || in <= 0) { printf("所选位置错误\n"); return; } for(int i = in - 1; i < S -> len; i++) { S -> id[i] = S -> id[i + 1]; strcpy(S -> name[i], S -> name[i + 1]); } S -> len--; stu_show(S);
}
//位改
void stu_change(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("请输入要修改的位置:"); int in; scanf("%d", &in); if(in > S -> len || in <= 0) { printf("所选位置错误\n"); return; } printf("请输入学生姓名:"); scanf("%s", S -> name[in - 1]); printf("请输入学生id:"); scanf("%d", &S -> id[in - 1]); stu_show(S);
}
//查找学生信息
void stu_find(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("请输入学生的ID:"); int ID, i = 0; scanf("%d", &ID); do { if(S -> id[i] == ID) { printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]); return; } i++; }while(i <= S -> len); printf("没有这个学生\n"); }
//删重
void stu_repeatdel(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } for(int i = 0; i < S -> len; i++) { //遍历后面的值 for(int j = i + 1; j < S -> len; j++) { //重复的进行删除 if(S -> id[i] == S -> id[j]) { for(int k = j; k < S -> len; k++) { S -> id[k] = S -> id[k + 1]; strcpy(S -> name[k], S -> name[k + 1]); } S -> len--; j--;//对删除后位置的值进行重新对比 } } } stu_show(S);
} //释放堆空间
void stu_free(stu_p S)
{ free(S); S = NULL;
}
//判空
int stu_null(stu_p S)
{ return 0 == S -> len;
} //判满
int stu_full(stu_p S)
{ return MAX == S -> len;
} //回显顺序表
void stu_show(stu_p S)
{ if(stu_null(S)) { printf("空\n"); return; } printf("——————————————\n"); for(int i = 0; i < S -> len; i++) printf("[%d]姓名:%s\tID:%d\n",i+1, S -> name[i], S -> id[i]); printf("——————————————\n");
}
功能函数头文件stu.h
#ifndef __STU_H__
#define __STU_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX 8typedef struct student
{char name[MAX][24];int id[MAX];int len;
}stu, *stu_p;stu_p stu_create();
int stu_full(stu_p S);
int stu_null(stu_p S);
void stu_add(stu_p S);
void stu_show(stu_p S);
void stu_insert(stu_p S);
void stu_delet(stu_p S);
void stu_change(stu_p S);
void stu_find(stu_p S);
void stu_repeatdel(stu_p S);
void stu_free(stu_p S);
#endif
实现效果
申请顺序表成功
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:1
——————————————
[1]姓名:1 ID:1
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:1
请输入学生姓名:2
请输入学生id:2
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:1
请输入学生姓名:3
请输入学生id:3
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:4
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:1 ID:4
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:5
请输入学生的ID:4
[4]姓名:1 ID:4
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:6
请输入要修改的位置:4
请输入学生姓名:4
请输入学生id:4
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:5
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
[5]姓名:1 ID:5
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:1
请输入学生姓名:1
请输入学生id:1
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
[5]姓名:1 ID:5
[6]姓名:1 ID:1
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:7
——————————————
[1]姓名:1 ID:1
[2]姓名:2 ID:2
[3]姓名:3 ID:3
[4]姓名:4 ID:4
[5]姓名:1 ID:5
——————————————
1.添加学生信息 2.遍历学生信息 3.插入学生信息 4.删除学生信息
5.查找学生信息 6.修改学生信息 7.删除重复信息 8.退出信息系统
请输入选项:8
已退出
一个学生信息还可封装在一个学生结构体中,使用顺序结构体嵌套学生结构体。
此方法在一个学生的信息较多时可以使用,方便学生信息覆盖时代码的书写。
-
顺序表
-
顺序存储的线性表
-
实现存储的方式
-
使用数组存储元素,实现逻辑上相连,物理内存也相连
-
使用malloc在堆区申请一片连续的空间,来存放逻辑相连的数据
-
-
顺序表的组成
-
需要有一个能够存储数据元素的容器,可以是数组,也可以是连续的堆区空间
-
还需有一个变量来记录当前顺序表的长度(存储元素的个数)
-
-
顺序表的结构体原型
-
typedef struct sequence { int data[max];//元素 int len;//长度 }seq, *seq_p; //类型重定义结构体,结构体指针
-
结构体使用.引出结构体变量 结构体指针使用->引出结构体变量
-
-
顺序表的相关函数操作
-
创建顺序表
-
在堆区申请空间,返回给main使用
-
函数返回值类型:顺序表类型的指针
-
函数名:符合命名规则
-
参数列表:无
-
注意事项
-
申请堆区空间后,判断是否成功
-
申请成功后,需要将顺序表的长度(为0)和数组初始化
-
-
-
判满
-
函数功能
-
判断顺序表存储空间是否存满,即len == max
-
-
函数返回值
-
逻辑判断,存满返回1,不满返回0
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
-
-
判空
-
函数功能
-
判断顺序表是否为空(即len是否为0)
-
-
函数返回值
-
逻辑判断,为空返回1,有元素返回0
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
-
-
数据存储
-
函数功能
-
将数据存入顺序表
-
-
函数返回值
-
逻辑值:成功返回1,失败返回0
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
-
注意事项
-
判断顺序表是否为满
-
-
-
遍历
-
函数的功能
-
依次打印输出顺序表里的数据
-
-
函数返回值
-
void
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
-
注意事项
-
判断顺序表是否为空
-
-
-
按位置插入
-
函数的功能
-
输入位置和数据存入数据表
-
-
函数返回值
-
逻辑值:成功返回1,失败返回0
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
函数内部需要外部传参插入位置和存入数据
-
-
注意事项
-
判断顺序表是否为满
-
插入位置是否合理
-
-
-
按位置删除
-
函数的功能
-
输入位置将数据表中对应的数据删除
-
-
函数返回值
-
逻辑值:成功返回1,失败返回0
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
函数内部需要外部传参删除位置
-
-
注意事项
-
判断顺序表是否为空
-
删除位置是否合理
-
-
-
修改数据
-
函数的功能
-
输入位置将数据表中对应的数据修改
-
-
函数返回值
-
逻辑值:成功返回1,失败返回0
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
函数内部需要外部传参修改位置
-
-
注意事项
-
判断顺序表是否为空
-
修改位置是否合理
-
-
-
查找数据
-
函数的功能
-
输入数据查找对应的数据的位置
-
-
函数返回值
-
找到返回位置,找不到返回0
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
函数内部需要外部传参数据
-
-
注意事项
-
判断顺序表是否为空
-
-
-
去重
-
函数的功能
-
删除重复数据
-
-
函数返回值
-
void
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
-
注意事项
-
判断顺序表是否为空
-
-
-
销毁
-
函数的功能
-
释放堆空间
-
-
函数返回值
-
void
-
-
函数名
-
符合命名规则
-
-
参数列表
-
顺序表(传顺序表的地址)
-
-
-
-