一、头文件
#ifndef __LIST_H__
#define __LIST_H__#include <myhead.h>
#define MAX 30typedef struct
{int id;char name[20];char major[20];int age;
}Student;typedef struct
{Student data[MAX];int count; //学生人数
}List,*Plist;/**********函数声明**********/
//申请空间
Plist create_room();
//输入插入的位置
int input_pos();
//判满
int full_empty(Plist L);
//判断位置是否范围内
int pos_YN(Plist L, int pos);
//1.输入学生信息
void list_input(Plist L);
//2.输出学生信息
void list_output(Plist L);
//3.任意位置插入一个学生
void any_sert(Plist L, int pos, Student k);
//4.任意位置删除一个学生
void any_delete(Plist L, int pos);
//5.任意位置查找一个学生
void any_search(Plist L, int pos);
//6.任意位置修改一个学生
void any_change(Plist L, int pos, Student k);
//7.去除学号重复的学生
void cut_repeat(Plist L);
//8.按照姓名查找返回位置(顺序查找)
int find_name(Plist L,char *name);
//9.按照学号从小到大排序(冒泡排序)
void bubble_sord(Plist L);
//10.按照学号查找返回位置(二分查找法)
int find_id(Plist L,int id);
#endif
二、功能函数
1、申请空间
//申请空间
Plist create_room()
{Plist L = malloc(sizeof(List)*MAX); //申请空间if(NULL == L){printf("申请失败!");return NULL;}else{L->count = 0; //学生人数初始化为0return L;}
}
//输入插入的位置
int input_pos()
{int pos;printf("请输入插入/删除/查找/修改的位置:");scanf("%d",&pos);return pos;
}
//判满or空
int full_empty(Plist L)
{//判满if(L->count == MAX){return 1;}//判空else if(L->count == 0){return -1;}else{return 0;}
}//判断位置是否范围内
int pos_YN(Plist L, int pos)
{if(NULL == L || pos-1<0 || pos-1>L->count || full_empty(L) != 0){printf("访问失败!\n");return 1;}return 0;
}
2、输入输出学生信息
//1.输入学生信息
void list_input(Plist L)
{int n;printf("请输入人数:");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->count++;}
}
//输出学生信息
void list_output(Plist L)
{for(int i=0; i<L->count; 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);}
}
3、任意位置插入一个学生
//2.任意位置插入一个学生
void any_sert(Plist L, int pos, Student k)
{if( pos_YN(L , pos) )return;//空间+1,其余学生向后移动for(int i=L->count; i>=pos; i--){L->data[i] = L->data[i-1];}L->data[pos-1] = k; //插入一个学生L->count++;printf("/*****插入成功*****/\n");
}
4、任意位置删除一个学生
//3.任意位置删除一个学生
void any_delete(Plist L, int pos)
{if( pos_YN(L , pos) )return;int i;for(i = pos-1; i<L->count; i++){L->data[i] = L->data[i+1];}L->count--;printf("/*****删除成功*****/\n");
}
5、任意位置查找一个学生
//4.任意位置查找一个学生
void any_search(Plist L, int pos)
{if( pos_YN(L, pos) )return;printf("第%d位学生信息如下:\n",pos);printf("学号%d\t姓名%s\t专业%s\t年龄%d\n",L->data[pos-1].id, L->data[pos-1].name, L->data[pos-1].major, L->data[pos-1].age);
}
6、任意位置修改一个学生
//5.任意位置修改一个学生
void any_change(Plist L, int pos, Student k)
{if( pos_YN(L, pos) )return;L->data[pos-1] = k;printf("/*****修改成功*****/\n");
}
7、去除学号重复的学生
//6.去除学号重复的学生
void cut_repeat(Plist L)
{for(int i=0; i<L->count; i++){for( int j=i+1; j<L->count; j++){if( L->data[i].id == L->data[j].id){any_delete(L, j+1);j--;}}}
}
8、按照姓名查找返回位置
//7.按照姓名查找返回位置(顺序查找)
int find_name(Plist L, char *name)
{int flag = -1;for(int i=0; i<L->count; i++){if( strcmp(name, L->data[i].name )==0 ){flag = i;}}if(flag == -1){printf("/*****未找到*****/\n");return flag;}else{printf("/*****已找到******/\n");return flag+1;}
}
9、按照学号从小到大排序
//8.按照学号从小到大排序(冒泡排序)
void bubble_sord(Plist L)
{for(int i=1; i<L->count; i++){int flag = 0;for(int j=0; j<L->count-i; j++){if(L->data[j].id > L->data[j+1].id){Student temp = L->data[j];L->data[j] = L->data[j+1];L->data[j+1] = temp;flag = 1;}}if(flag == 0){break;}}printf("/*****排序成功*****/\n");
}
10、按照学号查找返回位置
//9.按照学号查找返回位置(二分查找法)
int find_id(Plist L,int id)
{int i=0, j=L->count-1;while( i<=j ){int mid = (i+j)/2;if( L->data[mid].id < id ){i = mid + 1;}else if( L->data[mid].id > id ){j = mid - 1;}else{return mid+1;} }return -1;
}
三、主函数
#include "list1.h"int main(int argc, const char *argv[])
{//申请空间Plist L = create_room();while(1){printf("\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");int choice;printf("请选择:");scanf("%d",&choice);switch(choice){case 1: //输入学生信息list_input(L); break;case 2: //任意位置插入一个学生Student k1;printf("请输入插入学生信息(学号、姓名、专业、年龄):");scanf("%d %s %s %d", &k1.id, k1.name, k1.major, &k1.age);any_sert(L, input_pos(), k1);list_output(L);break;case 3: //任意位置删除一个学生any_delete(L, input_pos() );list_output(L);break;case 4://任意位置查找一个学生any_search(L, input_pos() );break;case 5: //任意位置修改一个学生Student k2;printf("请输入修改学生信息(学号、姓名、专业、年龄):");scanf("%d %s %s %d", &k2.id, k2.name, k2.major, &k2.age);any_change(L, input_pos(), k2);list_output(L);break;case 6: //去除学号重复的学生cut_repeat(L);list_output(L);break;case 7: //按照姓名查找返回位置(顺序查找)char name[20];printf("请输入要查找的学生姓名:");scanf("%s",name);int sub0 = find_name(L,name);printf("%s在第%d位\n",name, sub0 );break;case 8: //按照学号从小到大排序(冒泡排序)bubble_sord(L);list_output(L);break;case 9://按照学号查找返回位置(二分查找法)int id;printf("请输入要查找的学生学号:");scanf("%d",&id);int sub1 = find_id(L,id);if(sub1 != -1){printf("学号%d在%d位\n",id, sub1 );}else{printf("/*****查找失败*****/\n");}break;case 0: //退出return 0;default : printf("请重新选择:");scanf("%d",&choice);break;}}free(L); //释放内存L = NULL; //置空return 0;
}
四、结果