标签:
#include <stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<stdlib.h> using namespace std; #define INITLISTSIZE 5 #define LISTINCREMENT 5 #define M 1000007 typedef struct z1 { char no[11]; char name[15]; int score[3]; int sum; float average; int order; } student; typedef struct SqList { student *elem; int listsize; int length; } SqList; student HashTable[M]; void init(SqList &L); int menu_select(); void create(SqList &L); void print(SqList L); void del(SqList &L); void append(SqList &L); void insert(SqList &L); void save(SqList L); void load(SqList &L); void compute(SqList &L); void Insert_Sort(SqList &L);//插入排序 void Select_Sort(SqList &L);//选择排序 void quick_sort(int l, int r,SqList &L);//快排 void Binary_Search(SqList &L);//折半查找 void hash_search(SqList L);//哈希查找 void Squence_Search(SqList L);//顺序查找 void creathashtable(SqList L); void Select_Sort1(SqList &L);//按学号排序 int main() { int select; SqList L; init(L); while(1) { switch(menu_select()) { case 0: init(L); break; case 1: create(L); break; case 2: print(L); break; case 3: int opt; printf("1:顺序查找\n2:二分查找\n3:哈希查找\n"); scanf("%d",&opt); if(opt==1) Squence_Search(L); else if(opt==2) Binary_Search(L); else if(opt==3) hash_search(L); break; case 4: compute(L); break; case 5: del(L); break; case 6: append(L); break; case 7: insert(L); break; case 8: save(L); break; case 9: load(L); break; case 10: printf("1:插入排序\n2:选择排序\n3:快速排序\n"); scanf("%d",&select); if(select==1) Insert_Sort(L); else if(select==2) Select_Sort(L); else if(select==3) quick_sort(0,L.length-1,L); break; case 11: exit(0); } } return 0; } int menu_select() { int choice; printf("****************************菜单*******************************\n"); printf(" 0 初始化 \n"); printf(" 1 输入 \n"); printf(" 2 打印 \n"); printf(" 3 查找 \n"); printf(" 4 计算 \n"); printf(" 5 删除 \n"); printf(" 6 追加 \n"); printf(" 7 插入 \n"); printf(" 8 保存 \n"); printf(" 9 读入 \n"); printf(" 10 排序 \n"); printf(" 11 退出 \n"); printf("Enter your choice(0-11):"); scanf("%d",&choice); return choice; } void init(SqList &L) { L.elem=(student *)malloc(INITLISTSIZE*sizeof(student)); L.listsize=INITLISTSIZE; L.length=0; } void create(SqList &L) { int i=0; while(1) { printf("请输入学号:"); scanf("%s",L.elem[i].no); if(L.elem[i].no[0]==‘@‘) break; printf("请输入姓名:"); scanf("%s",L.elem[i].name); printf("请输入数学成绩:"); scanf("%d",&L.elem[i].score[0]); printf("请输入英语成绩:"); scanf("%d",&L.elem[i].score[1]); printf("请输入数据结构成绩:"); scanf("%d",&L.elem[i].score[2]); L.elem[i].sum=0; L.elem[i].average=0; L.elem[i].order=0; L.length++; i++; } } void print(SqList L) { int i; for(i=0; i<L.length; i++) { printf("学号:%s 姓名:%s 数学:%d 英语:%d 数据结构:%d 总分:%d 平均分:%.2f 排名:%d\n",L.elem[i].no,L.elem[i].name,L.elem[i].score[0],L.elem[i].score[1],L.elem[i].score[2],L.elem[i].sum,L.elem[i].average,L.elem[i].order); } } //删除 void del(SqList &L) { printf("输入要删除的学生学号:"); char number[11]; scanf("%s",number); int i=0; while(i<L.length&&strcmp(number,L.elem[i].no)) i++; while(i<L.length-1) { L.elem[i]=L.elem[i+1]; i++; } L.length-=1; } //追加 void append(SqList &L) { printf("请输入要增加的学生信息:"); char no[11]; printf("请输入学号:"); scanf("%s",no); char name[15]; printf("请输入姓名:"); scanf("%s",name); int score[3]; printf("请输入成绩:"); scanf("%d%d%d",&score[0],&score[1],&score[2]); float sum=0; float average=0; strcpy(L.elem[L.length].no,no); strcpy(L.elem[L.length].name,name); memcpy(L.elem[L.length].score,score,sizeof(score)); L.elem[L.length].sum=sum; L.elem[L.length].average=average; L.elem[L.length].order=0; L.length+=1; } //插入 void insert(SqList &L) { printf("请输入指定的学生学号:"); char no[11]; scanf("%s",no); student *p; p=L.elem; while(p&&strcmp(p->no,no)) p++; if(!p) printf("没有此人!\n"); else { student *q; for(q=L.elem+L.length; q>=p; q--) { *(q+1)=*q; } } printf("请输入学号:"); scanf("%s",p->no); printf("请输入姓名:"); scanf("%s",p->name); printf("请输入数学成绩:"); scanf("%d",&p->score[0]); printf("请输入英语成绩:"); scanf("%d",&p->score[1]); printf("请输入数据结构成绩:"); scanf("%d",&p->score[2]); L.length++; } //计算 void compute(SqList &L) { student *p; for(p=L.elem; p<L.elem+L.length; p++) { p->sum=p->score[0]+p->score[1]+p->score[2]; p->average=p->sum/3.0; } } //保存 void save(SqList L) { FILE *fp; if((fp=fopen("student.txt","w"))==NULL) { printf("文件打开失败\n"); getchar(); exit(1); } student *p; for(p=L.elem; p<L.elem+L.length; p++) { fprintf(fp,"%s %s %d %d %d %d %f %d\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); } fclose(fp); } //读取 void load(SqList &L) { int i=0; FILE *fp; if((fp=fopen("student.txt","r"))==NULL) { printf("文件打开失败\n"); getchar(); exit(1); } student *p; p=L.elem; while(fscanf(fp,"%s%s%d%d%d%d%f%d",p->no,p->name,&p->score[0],&p->score[1],&p->score[2],&p->sum,&p->average,&p->order)==8) { p++; i++; } L.length=i; fclose(fp); } //直接插入排序 void Insert_Sort(SqList &L) { student p; int i, j; for (i = 1; i < L.length; i++) if (L.elem[i].sum > L.elem[i - 1].sum) { p = L.elem[i]; for (j = i - 1; j >= 0 && L.elem[j].sum < p.sum; j--) L.elem[j + 1] = L.elem[j]; L.elem[j + 1] = p; } student *t; i=0; for(t=L.elem; t<L.elem+L.length; t++) { L.elem[i].order=i+1; i++; } } //选择排序 void Select_Sort(SqList &L) { for (int i = 0; i <L.length - 1; i++) { int index = i; for (int j = i + 1; j < L.length; j++) { if (L.elem[index].sum <L.elem[j].sum) { index = j; } } student p; p = L.elem[index]; L.elem[index] = L.elem[i]; L.elem[i] = p; } student *t; int i=0; for(t=L.elem; t<L.elem+L.length; t++) { L.elem[i].order=i+1; i++; } } //快速排序 void quick_sort(int s,int t,SqList &L) { int i=s,j=t,x=L.elem[(i+j)/2].sum; student y; do { while(L.elem[i].sum>x) i++; while(L.elem[j].sum<x) j--; if(i<=j) { y=L.elem[j]; L.elem[j]=L.elem[i]; L.elem[i]=y; i++; j--; } } while(i<j); if(j>s) quick_sort(s,j,L); if(i<t) quick_sort(i,t,L); student *p; i=0; for(p=L.elem; p<L.elem+L.length; p++) { L.elem[i].order=i+1; i++; } } //顺序查找 void Squence_Search(SqList L) { int i; char search_number[11]; printf("输入要查找的学生学号:"); scanf("%s",search_number); for( i=0; i<L.length; i++) { if(strcmp(search_number,L.elem[i].no)==0) { printf("%s %s %d %d %d %d %.2f %d\n",L.elem[i].no,L.elem[i].name,L.elem[i].score[0],L.elem[i].score[0],L.elem[1].score[2],L.elem[i].sum,L.elem[i].average,L.elem[i].order); break; } } if(i==L.length) printf("错误!!!没有此学生信息!\n"); } //二分查找 void Binary_Search(SqList &L) { Select_Sort1(L); char search_number[11]; printf("输入要查找的学生学号:"); scanf("%s",search_number); int low=0,high=L.length; while(low<=high) { int mid=low+(low+high)/2; if(strcmp(L.elem[mid].no,search_number)==0) { printf("%s %s %d %d %d %d %.2f %d\n",L.elem[mid].no,L.elem[mid].name,L.elem[mid].score[0],L.elem[mid].score[0],L.elem[mid].score[2],L.elem[mid].sum,L.elem[mid].average,L.elem[mid].order); return; } else if(strcmp(L.elem[mid].no,search_number)<0) low=mid+1; else if(strcmp(L.elem[mid].no,search_number)>0) high=mid-1; } printf("错误!!!没有此学生信息!\n"); } //建立哈希表 void creathashtable(SqList L) { int i=0; while(i<L.length) { int len=strlen(L.elem[i].no); int j=0; int sum=0; while(j<4&&len) { sum+=(L.elem[i].no[len-1]-‘0‘)*pow(10,j); j++; len--; } if(strlen(HashTable[sum].no)==0) HashTable[sum]=L.elem[i]; else { while(strlen(HashTable[sum].no)!=0) { sum++; } HashTable[sum]=L.elem[i]; } i++; } } //哈希查找 void hash_search(SqList L) { creathashtable(L); char search_number[11]; printf("输入要查找的学生学号:"); scanf("%s",search_number); int len=strlen(search_number); int j=0; int sum=0; while(j<4&&len) { sum+=(search_number[len-1]-‘0‘)*pow(10,j); j++; len--; } student *p=&HashTable[sum]; while(strcmp(p->no,search_number)!=0) { p++; } printf("%s %s %d %d %d %d %.2f %d\n",p->no,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order); } //按学号排序 void Select_Sort1(SqList &L) { for (int i = 0; i <L.length - 1; i++) { int index = i; for (int j = i + 1; j < L.length; j++) { if (strcmp(L.elem[index].no,L.elem[j].no)>0) { index = j; } } student p; p = L.elem[index]; L.elem[index] = L.elem[i]; L.elem[i] = p; } }
标签:
原文地址:http://www.cnblogs.com/calmwithdream/p/5432314.html