9.18 C语言基于顺序表的学生管理系统练习

(C语言全部功能代码如下,如有疑问,欢迎留言探讨!)

用数据结构的顺序表做一个简单的学生管理系统,用分文件编译,管理系统中的简单功能如下:

        printf("\t\t\t1、输入学生信息:\n");
        printf("\t\t\t2、任意位置插入一个学生:\n");
        printf("\t\t\t3、任意位置删除一个学生:\n");
        printf("\t\t\t4、任意位置查找一个学生:\n");
        printf("\t\t\t5、任意位置修改一个学生:\n");
        printf("\t\t\t6、表头插入一个学生:\n");
        printf("\t\t\t7、表尾插入一个学生:\n");
        printf("\t\t\t8、表头删除一个学生:\n");
        printf("\t\t\t9、表尾删除一个学生:\n");
        printf("\t\t\t10、去除重复学生:\n");
        printf("\t\t\t11、按照姓名查找并返回位置:\n");
        printf("\t\t\t12、按照学号从小到大排序:\n");
        printf("\t\t\t13、按照学号查找返回位置:\n");
        printf("\t\t\t14、按照年龄查找并修改:\n");
        printf("\t\t\t15、按照学号查找并修改:\n");
        printf("\t\t\t16、释放顺序表:\n");

1.头文件程序:

#ifndef LIST_H_
#define LIST_H_
#include <myhead.h>
#define MAX 30

typedef struct{//学生信息结构体
	int id;//学号
	char name[20];//姓名
	char major[20];//专业
	int age;
}student;

typedef struct{//顺序表结构体
	student data[MAX];//存储学生信息的数组
	int len;//统计学生个数
}list,*Plist;
/************函数声明*************/
Plist create_list();
int input_list(Plist);
int output_list(Plist);
int full(Plist);
int insert_stu(Plist,int,student);
int empty(Plist);
int delete_stu(Plist,int);
int inserach_stu(Plist,int);
int change_stu(Plist,int,student);
int insert_front(Plist,student);
int insert_rear(Plist,student);
int delete_front(Plist);
int delete_rear(Plist);
int delete_reverse(Plist);
int find_stu_all(Plist,char *);
int buble_sort(Plist);
int binary(Plist,int);
int find_age_dele(Plist,int);
int find_id_change(Plist,int);
int free_list(Plist);
#endif  

2.主程序:

#include "list.h"
int main(int argc, const char *argv[])
{	
	printf("欢迎使用(HQ24081班)%d人的学生管理系统!\n"
		   "选择对应的功能编号即可实现对应功能:\n",MAX);
	int ch;
	int h;
	char a[20];			
	int xuehao;
	int nianling;
	student e;
	Plist L=create_list();
	while(1){
		printf("\t\t\t1、输入学生信息:\n");
		printf("\t\t\t2、任意位置插入一个学生:\n");
		printf("\t\t\t3、任意位置删除一个学生:\n");
		printf("\t\t\t4、任意位置查找一个学生:\n");
		printf("\t\t\t5、任意位置修改一个学生:\n");
		printf("\t\t\t6、表头插入一个学生:\n");
		printf("\t\t\t7、表尾插入一个学生:\n");
		printf("\t\t\t8、表头删除一个学生:\n");
		printf("\t\t\t9、表尾删除一个学生:\n");
		printf("\t\t\t10、去除重复学生:\n");
		printf("\t\t\t11、按照姓名查找并返回位置:\n");
		printf("\t\t\t12、按照学号从小到大排序:\n");
		printf("\t\t\t13、按照学号查找返回位置:\n");
		printf("\t\t\t14、按照年龄查找并修改:\n");
		printf("\t\t\t15、按照学号查找并修改:\n");
		printf("\t\t\t16、释放顺序表:\n");
		printf("请输入你的选择:\n");
		scanf("%d",&ch);
		switch(ch){
			case 1://循环输入 输出学生信息
				input_list(L);	
				output_list(L); break;
			case 2://任意位置插入一个学生
				printf("请输入您要插入的学生的信息:\n");
				{for(int i=1; i<=4; i++){
					if(1==i){
						printf("请输入学生学号:\n");		
						scanf("%d",&e.id);
					}else if(i==2){
						printf("请输入学生姓名:\n");		
						scanf("%s",e.name);
					}else if(i==3){
						printf("请输入学生专业:\n");		
						scanf("%s",e.major);
					}else{
						printf("请输入学生年龄:\n");		
						scanf("%d",&e.age);
					}
				}
				}
				printf("请输入您想在第几个位置插入该学生:\n");
				scanf("%d",&h);
				insert_stu(L,h,e);
				output_list(L);        break;
			case 3://任意位置删除一个学生
				printf("请输入您想删除第几行的学生:\n");
				scanf("%d",&h);		
				delete_stu(L,h);
				output_list(L);        break;
			case 4://任意位置查找一个学生
				printf("请输入您想查找第几行的学生:\n");
				scanf("%d",&h);
				inserach_stu(L,h);     break;
			case 5://任意位置修改一个学生
				printf("请输入您要修改的学生的信息:\n");
				for(int j=1; j<=4; j++){
					if(j==1){
						printf("请输入学生学号:\n");		
						scanf("%d",&e.id);
					}else if(j==2){
						printf("请输入学生姓名:\n");		
						scanf("%s",e.name);
					}else if(j==3){
						printf("请输入学生专业:\n");		
						scanf("%s",e.major);
					}else{
						printf("请输入学生年龄:\n");		
						scanf("%d",&e.age);
					}
				}
				printf("请输入您想在第几个位置修改该学生:\n");
				scanf("%d",&h);
				change_stu(L,h,e);
				output_list(L);        break;
			case 6://表头插入一个学生
				printf("请输入您要插入的学生的信息:\n");
				for(int y=1; y<=4; y++){
					if(y==1){
						printf("请输入学生学号:\n");		
						scanf("%d",&e.id);
					}else if(y==2){
						printf("请输入学生姓名:\n");		
						scanf("%s",e.name);
					}else if(y==3){
						printf("请输入学生专业:\n");		
						scanf("%s",e.major);
					}else{
						printf("请输入学生年龄:\n");		
						scanf("%d",&e.age);
					}
				}
				insert_front(L,e);
				output_list(L);        break;
			case 7://表尾插入一个学生
				printf("请输入您要插入的学生的信息:\n");
				for(int r=1; r<=4; r++){
					if(r==1){
						printf("请输入学生学号:\n");		
						scanf("%d",&e.id);
					}else if(r==2){
						printf("请输入学生姓名:\n");		
						scanf("%s",e.name);
					}else if(r==3){
						printf("请输入学生专业:\n");		
						scanf("%s",e.major);
					}else{
						printf("请输入学生年龄:\n");		
						scanf("%d",&e.age);
					}
				}
				insert_rear(L,e);
				output_list(L);        break;
			case 8:	//表头删除一个学生
				delete_front(L);
				output_list(L);        break;
			case 9:	//表尾删除一个学生
				delete_rear(L);
				output_list(L);        break;
			case 10://去除重复学生
				delete_reverse(L);
				output_list(L);        break;
			case 11://按照姓名查找并返回位置
				printf("输入学生姓名:\n");
				scanf("%s",a);
				find_stu_all(L,a); break;
			case 12://按照学号从小到大排序
				buble_sort(L);
				output_list(L);        break;
			case 13://按照学号查找返回位置
				printf("请输入学号:\n");
				scanf("%d",&xuehao);
				int k1=binary(L,xuehao);
				if(k1!=-1){
					printf("查找成功,该学生在第%d个位置\n",k1+1);
				}else{
					printf("查找失败\n");
				}
			case 14://按照年龄查找并修改
				printf("请输入年龄:\n");
				scanf("%d",&nianling);
				find_age_dele(L,nianling);
				output_list(L);        break;
			case 15://按照学号查找并修改
				printf("请输入学号:\n");
				scanf("%d",&xuehao);
				find_id_change(L,xuehao);
				output_list(L);        break;
			case 16:
				free_list(L);
			default: printf("输入有误:\n");
		}
	}
	return 0;
}

3.函数程序:

#include "list.h"
Plist create_list(){//创建顺序表
	Plist L=malloc(sizeof(list));
	if(NULL==L){
		printf("申请空间失败\n");
		return NULL;
	}
	L->len=0;//长度初始化为0
	printf("创建成功\n");
	return L;//返回顺序表地址
}
int input_list(Plist L){
	int n;
	printf("要输入的学生个数:\n");
	scanf("%d",&n);
	for(int i=0; i<n; i++){
		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){
	int i;
	for(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){//判满
	if(L->len==MAX){
		return 1;
	}
	return 0;
}
int insert_stu(Plist L,int pos,student e){
	int sub=pos-1;//下标
	if(sub<0||sub>L->len||L==NULL||full(L)){
		printf("插入失败\n");
		return -1;
	}
	int i;
	for(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){//判空
	if(L->len==0){
		return 1;
	}
	return 0;
}
int delete_stu(Plist L,int pos){
	int sub=pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty(L)){
		printf("删除失败\n");
		return -1;
	}
	for(int i=sub; i<L->len; i++){
		L->data[i]=L->data[i+1];
	}
	L->len--;
	printf("删除成功\n");
}
int inserach_stu(Plist L,int pos){
	int sub=pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty(L)){
		printf("查找失败\n");
		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 pos,student e){
	int sub=pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty(L)){
		printf("修改失败\n");
		return -1;
	}
	L->data[sub]=e;
	printf("修改成功\n");
	return 0;
}
int insert_front(Plist L,student e){
	if(L==NULL||full(L)){
		printf("表头插入失败\n");
		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,student e){
	if(L==NULL||full(L)){
		printf("表尾插入失败\n");
		return -1;
	}
    L->data[L->len]=e;
    L->len++;
	printf("表尾插入成功\n");
	return 0;
}
int delete_front(Plist L){
	if(L==NULL||full(L)){
		printf("表头删除失败\n");
		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||full(L)){
		printf("表尾删除失败\n");
		return -1;
	}
	L->data[L->len-1]=L->data[L->len];
	L->len--;
	printf("表尾删除成功\n");
	return 0;
}
int delete_reverse(Plist L){
	for(int i=0; i<L->len; i++){
		for(int 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;
}
#if 0
int find_stu(Plist L,char key[20]){
	int sub=-1;
	for(int i=0; i<L->len; i++){
		if(strcmp(key,L->data[i].name)==0){
			sub=i;
		}
	}
	if(sub==-1){
		return -1;
	}
	return sub+1;
}
#endif

int find_stu_all(Plist L,char key[20]){
	int sub=-1;
	for(int i=0; i<L->len; i++){
		if(strcmp(key,L->data[i].name)==0){
			printf("位置:%d\t是%s\n",i+1, L->data[i].name);
			sub=i;
		}
	}
	if(sub==-1){
		printf("查找失败,不存在该学生\n");
		return -1;
	}
	return 0;
}


int buble_sort(Plist L){
	int i,j,flag;
	student temp;
	for(i=1; i<L->len; i++){
		flag=999;
		for(j=0; j<L->len; j++){
			if(L->data[j].id>L->data[j+1].id){
				flag=888;
				temp=L->data[j+1];
				L->data[j]=L->data[j+1];
				L->data[j+1]=temp;
			}
		}
		if(flag==999){
			break;
		}
	}
	return 0;
}
int binary(Plist L,int key){
	int i=0,j=L->len-1,mid;
	while(i<=j){
		mid=(i+j)/2;
		if(key>L->data[mid].id){
			i=mid+1;
		}
		else if(key<L->data[mid].id){
			j=mid-1;
		}
		else{
			return mid;
		}
	}
	return -1;
}
int find_age_dele(Plist L,int age){
	int i,sub=-1;
	for(i=0; i<L->len; i++){
		if(L->data[i].age==age){
			sub=i;
		}
	}
	if(sub==-1){
		printf("查找失败\n");
	}else{
		for(i=sub; i<L->len; i++){
			L->data[i]=L->data[i+1];
		}
		L->len--;
		printf("查找成功,该学生已经被删除\n");
	}
	return 0;
}
int find_id_change(Plist L,int id){
	student e={10086,"狼狗","工程技术学院",99};
	buble_sort(L);
	int i=0,j=L->len-1,mid;
	int sub=-1;
	while(i<=j){
		mid=(i+j)/2;
		if(id>L->data[mid].id){
			i=mid+1;
		}else if(id<L->data[mid].id){
			j=mid-1;
		}else{
			sub=mid;
			break;
		}
	}
	if(sub==-1){
		printf("查找失败\n");
	}else{
		change_stu(L,sub+1,e);
	}
	return 0;
}
int free_list(Plist L){
	if(L==NULL){
		return -1;
	}
	free_list(L);
	L=NULL;
	printf("释放成功\n");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值