顺序表实现一个学生管理系统
1.创建顺序表,制作简易菜单选项
2.循环输入输出学生信息
3.任意位置插入一个学生
4.任意位置删除一个学生
5.任意位置查找一个学生
6.任意位置修改一个学生
7.表头插入一个学生
8.表尾插入一个学生
9.表头删除一个学生
10.表尾删除一个学生
11.去除重复的学生
12.按照姓名查找返回位置(顺序查找算法)
13.按照姓名从小到大排序(冒泡排序)
14.按照学号查找返回位置(二分查找算法实现)
15.按照年龄查找并修改
16.按照学号查找并删除
main.c
#include "seqlist.h"
void menu(){
printf("***********************\n");
printf("***1.任意插 2.任意删***\n");
printf("***3.任意找 4.任意改***\n");
printf("***5.表头插 6.表尾插***\n");
printf("***7.表头删 8.表尾删***\n");
printf("***9.去除 10.按姓名找**\n");
printf("****11.按姓名排序******\n");
printf("***12.按学号找并返回***\n");
printf("**13.按年龄查找并修改**\n");
printf("**14.按学号查找并删除**\n");
printf("*********0.退出*******\n");
}
int main(int argc, const char *argv[])
{
int input=0;
stu e={1374,"细狗","物理",23};
stu e1={1245,"黑狗","化学",20};
stu e2={1345,"舔狗","电子",24};
int k;
stu e3={123,"李华","自动化",23};
//1.创建顺序表
PList L=Create_List();
//2.循环输入学生信息
Input_List(L);
do{
menu();
printf("请选择并输入选项:");
scanf("%d",&input);
switch(input){
case 1:
//3.任意位置插入一个学生
Insert_Stu(L,3,e);//第三个位置插入数据
Output_List(L);//打印所有信息
break;
case 2:
//4.任意位置删除一个学生
Delete_Stu(L,2);//删除第二个位置学生信息
Output_List(L);//打印所有信息
break;
case 3:
//5.任意位置查找一个学生
Insearch_Stu(L,3);//查找第三个位置学生信息
break;
case 4:
//6.任意位置修改一个学生
Change_Stu(L,3,e1);
Output_List(L);//打印所有信息
break;
case 5:
//7.表头插入一个学生
Insert_Front(L,e2);
Output_List(L);//打印所有信息
break;
case 6:
//8.表尾插入一个学生
Insert_Rear(L,e2);
Output_List(L);//打印所有信息
break;
case 7:
//9.表头删除一个学生
Delete_Front(L);
Output_List(L);//打印所有信息
break;
case 8:
//10.表尾删除一个学生
Delete_Rear(L);
Output_List(L);//打印所有信息
break;
case 9:
//11.去除重复的学生
Delete_Repeat(L);
Output_List(L);//打印所有信息
break;
case 10:
//12.按照姓名查找返回位置(顺序查找算法)
k=Find_Stu(L,"李华");
if(k==-1){
printf("查找失败\n");
}else{
printf("查找成功,该学生是第%d个位置\n",k);
}
break;
case 11:
//13.按照姓名从小到大排序(冒泡算法)
Sort_List(L);
Output_List(L);//打印所有信息
break;
case 12:
//14.按照学号查找返回位置(对于有序的学号用二分查找算法)
k=Binary_Find_Stu(L,1003);
if(k==-1){
printf("查找失败\n");
}else{
printf("查找成功,该学生是第%d个位置\n",k);
}
break;
case 13:
//15.按照年龄查找并修改
Insearch_Stu_Age(L,e3);
Output_List(L);//打印所有信息
break;
case 14:
//16.按照学号查找并删除
Insearch_Stu_Id(L,124);
Output_List(L);//打印所有信息
break;
case 0:break;
default:break;
}
}while(input);
return 0;
}
seqlist.c
#include "seqlist.h"
PList Create_List(){
PList L=(PList)malloc(sizeof(list));
if(NULL==L){
perror("malloc lost");
return NULL;
}
L->len=0;//长度初始化为0
memset(L->data,0,sizeof(stu)*MAX);//数组信息清空
printf("创建成功\n");
return L;//返回顺序表地址
}
int Input_List(PList L){
int n;
printf("请输入学生个数:");
scanf("%d",&n);
for(int i=0;i<n;i++){
if(L->len>MAX){
break;
}
printf("请输入第%d个学生信息:\n",i+1);
printf("请输入学号:");
scanf("%d",&L->data[i].id);
printf("请输入姓名:");
scanf("%s",L->data[i].name);
printf("请输入专业:");
scanf("%s",L->data[i].major);
printf("请输入年龄:");
scanf("%d",&L->data[i].age);
L->len++;//计数器
}
return 0;
}
int Output_List(PList L){
for(int i=0;i<L->len;i++){
printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",
L->data[i].id,L->data[i].name,L->data[i].major,L->data[i].age);
}
return 0;
}
int Full(PList L){//判断是否满
return L->len==MAX;
}
int Insert_Stu(PList L,int post,stu e){
//判断能不能插入
int sub=post-1;//下标
if(sub<0||sub>L->len||L==NULL||L->len==Full(L)){
perror("Input_Stu error");
return -1;
}
for(int i=L->len-1;i>=sub;i--){
L->data[i+1]=L->data[i];
}//腾出要插入的位置,循环移动元素
L->data[sub]=e;//插入元素
L->len++;//长度+1
printf("插入成功\n");
return 0;
}
int Empty(PList L){
return L->len==0;
}
int Delete_Stu(PList L,int post){
int sub=post-1;//下标
//判断能不能删除
if(sub<0||sub>L->len-1||L==NULL||Empty(L)){
perror("Delete_Stu error");
return -1;
}
for(int i=sub;i<L->len;i++){
L->data[i]=L->data[i+1];
}//循环往前移动元素,进行覆盖
L->len--;//长度-1
printf("删除成功\n");
return 0;
}
int Insearch_Stu(PList L,int post){
int sub=post-1;//下标
//判断能不能查找
if(sub<0||sub>L->len-1||L==NULL||Empty(L)){
perror("Insearch_Stu error");
return -1;
}
printf("该学生存在\n");
printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",
L->data[sub].id,L->data[sub].name,L->data[sub].major,L->data[sub].age);
return 0;
}
int Change_Stu(PList L,int post,stu e){
int sub=post-1;//下标
//判断能不能修改
if(sub<0||sub>L->len-1||L==NULL||Empty(L)){
perror("Change_Stu error");
return -1;
}
L->data[sub]=e;
printf("修改成功\n");
return 0;
}
int Insert_Front(PList L,stu e){
//判断能不能头插
if(L==NULL||Full(L)){
perror("Insert_Front error");
return -1;
}
for(int i=L->len-1;i>=0;i--){
L->data[i+1]=L->data[i];
}
L->data[0]=e;
L->len++;
printf("表头插入成功\n");
return 0;
}
int Insert_Rear(PList L,stu e){
//判断能不能尾插
if(L==NULL||Full(L)){
perror("Insert_Rear error");
return -1;
}
L->data[L->len]=e;
L->len++;
printf("表尾插入成功\n");
return 0;
}
int Delete_Front(PList L){
//判断能不能表头删除
if(L==NULL||Empty(L)){
perror("Delete_Front error");
return -1;
}
for(int i=0;i<L->len;i++){
L->data[i]=L->data[i+1];
}
L->len--;
printf("表头删除成功\n");
return 0;
}
int Delete_Rear(PList L){
//判断能不能表尾删除
if(L==NULL||Empty(L)){
perror("Delete_Rear error");
return -1;
}
L->data[L->len-1]=L->data[L->len];
L->len--;
printf("表尾删除成功\n");
return 0;
}
int Delete_Repeat(PList L){
int i,j;
for(i=0;i<L->len;i++){
for(j=i+1;j<L->len;j++){
if(strcmp(L->data[i].name,L->data[j].name)==0){//去除名字重复元素
Delete_Stu(L,j+1);//调用删除函数去除重复的位置
j--;//每次删除后元素往前移动了一个单位,避免漏删
}
}
}
return 0;
}
int Find_Stu(PList L,char *key){
int i,sub=-1;
for(i=0;i<L->len;i++){
if(strcmp(L->data[i].name,key)==0){
sub=i;//输出最后一个名字相同的下标
}
}
return sub;
}
int Sort_List(PList L){//冒泡算法实现按姓名从小到大排序
int i,j,flag=0;
for(i=0;i<L->len-1;i++){
for(j=0;j<L->len-1-i;j++){
if(strcmp(L->data[j].name,L->data[j+1].name)>0){
stu temp=L->data[j];
L->data[j]=L->data[j+1];
L->data[j+1]=temp;
flag=1;
}
}
if(0==flag){
break;//若某躺循环没有出现元素交换,表明剩余元素已经有序,则结束剩余趟数循环
}
flag=0;
}
return 0;
}
int Binary_Find_Stu(PList L,int key){
int first=0,last=L->len-1;//定义二分查找两头
while(first<=last){//判断条件为左边下标小于等于右边下标
int mid=(first+last)/2;//定义中间位置
if(L->data[mid].id>key){
last=mid-1;//如果mid位置值比key大,说明在first-mid之间
}else if(L->data[mid].id<key){
first=mid+1;//如果mid位置
}else{
return mid+1;//找到,返回位置
}
}
return -1;//没找到
}
int Insearch_Stu_Age(PList L,stu e){
//判断能不能修改
if(L==NULL||Empty(L)){
perror("Insearch_Stu_Age error");
return -1;
}
int sub=-1;
for(int i=0;i<L->len;i++){
if(e.age==L->data[i].age){
L->data[i]=e;
sub=i;
}
}
if(sub==-1){
printf("未找到年龄相同的学生,无法修改\n");
}else{
printf("修改成功\n");
}
return 0;
}
int Insearch_Stu_Id(PList L,int id){
//判断能不能删除
if(L==NULL||Empty(L)){
perror("Insearch_Stu_Id error");
return -1;
}
int sub=-1;
for(int i=0;i<L->len;i++){//删除掉所有学号相同的学生信息
if(id==L->data[i].id){
sub=i;
for(int j=sub;j<L->len;j++){
L->data[j]=L->data[j+1];
}
L->len--;
}
}
if(sub==-1){
printf("未找到学号相同的学生,无法删除\n");
}else{
printf("删除成功\n");
}
return 0;
}
seqlist.h
#ifndef __LIST__
#define __LIST__
#define MAX 30
#include <myhead.h>
typedef struct{
int id;
char name[20];
char major[20];
int age;
}stu;//学生信息结构体
typedef struct{//顺序表结构体
stu data[MAX];//存储学生信息的数组
int len;//统计学生个数
}list,*PList;
//函数申明
PList Create_List();
int Input_List(PList L);
int Output_List(PList L);
int Full(PList L);
int Insert_Stu(PList L,int post,stu e);
int Empty(PList L);
int Delete_Stu(PList L,int post);
int Insearch_Stu(PList L,int post);
int Change_Stu(PList L,int post,stu e);
int Insert_Front(PList L,stu e);
int Insert_Rear(PList L,stu e);
int Delete_Front(PList L);
int Delete_Rear(PList L);
int Delete_Repeat(PList L);
int Find_Stu(PList L,char *key);
int Sort_List(PList L);
int Binary_Find_Stu(PList L,int key);
int Insearch_Stu_Age(PList L,stu e);
int Insearch_Stu_Id(PList L,int id);
#endif