(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");
}