成绩管理系统|数据结构课程设计
/* file name: slist.c *//* 单向键结链表,插入、删除使用排序 */
//学会对文件操作文件操作和单链表一起使用
#include
#include #include #include
void read_func(void);void write_func(void);void insert_func(void);void sort_func(void);void delete_func(void);void display_func(void);void modify_func(void);void anykey_func(void);
struct student{char name[20];int score;struct student *next;};
struct student *ptr, *head, *current, *prev;//全部声明为全局变量
int main(void){char option1;
system("cls");//清屏read_func();while(1){printf("****************************************\n");printf(" 1.insert\n");printf(" 2.delete\n");printf(" 3.display\n");printf(" 4.modify\n");printf(" 5.quit\n");printf("****************************************\n");printf(" Please enter your choice (1-5)...");option1=getche();printf("\n");switch(option1){case '1':insert_func();break;case '2':delete_func();break;case '3':display_func();break;case '4':modify_func();break;case '5':// write_func();exit(0);//这里也处理的比较好}}}
void read_func(void){FILE *fptr;
head=(struct student *) malloc(sizeof(struct student));head->next = NULL;
/* 开始时,若表中不存在数据,则要求输入第一笔数据 */if((fptr=fopen("slist.dat","r")) == NULL){printf(" Data file not exist\n");printf(" Press any key to edit first record...\n");getch();insert_func();//不存在就实行插入操作}else{ptr=(struct student *) malloc(sizeof(struct student));while(fscanf(fptr, "%s %d", ptr->name, &ptr->score) != EOF){sort_func();ptr=(struct student *) malloc(sizeof(struct student));}fclose(fptr);}}
void write_func(void){FILE *fptr;
fptr=fopen("slist.dat","w");current=head->next;while(current != NULL){fprintf(fptr, "%s %d\n", current->name, current->score);current = current->next;}fclose(fptr);}
void insert_func(void) //一插入就比较字符串(2 2想比较很简单) 不是等到全部插完了才比较{char s_temp[4];ptr=(struct student *) malloc(sizeof(struct student));printf(" Student name : ");gets(ptr->name);printf(" Student score: ");gets(s_temp);ptr->score = atoi(s_temp);//把字符串转化为 整数 为什么不直接把成绩存在ptr->score ???
sort_func();}
/*以分数高低由大到小排列*/void sort_func(void){//插入数据prev = head;current = head->next;while ((current != NULL) && (current->score > ptr->score)){prev = current;current = current->next;}ptr->next = current;prev->next = ptr;}
void delete_func(void){char del_name[20];printf(" Delete student name: ");gets(del_name);
prev = head;current = head->next;while ((current != NULL) && (strcmp(current->name , del_name)!=0))//用到了strcmp 比较字符串{prev = current;current = current->next;}if (current != NULL){prev->next = current->next;free(current);printf(" %s student record deleted\n",del_name);}elseprintf(" Student %s not found\n",del_name);
anykey_func();}
void modify_func(void){char n_temp[20],s_temp[4];printf(" Modify student name: ");gets(n_temp);//这样输入姓名current=head->next;
while ((current != NULL) && (strcmp(current->name , n_temp)!=0)){prev = current;current = current->next;}if (current != NULL){printf(" **************************\n");printf(" Student name : %s\n",current->name);printf(" Student score: %d\n",current->score);printf(" **************************\n");printf(" Please enter new score: ");gets(s_temp);current->score = atoi(s_temp);printf(" %s student record modified\n",n_temp);}elseprintf(" Student %s not found\n",n_temp);
anykey_func();}
void display_func(void){int count=0;system("cls");if(head->next == NULL){printf(" No student record\n");}else{printf(" NAME SCORE\n");printf(" ---------------------------\n");current=head->next;while(current != NULL){printf(" %-20s %3d\n", current->name, current->score);count++;current=current->next;if(count % 20 == 0) getch();}printf(" ---------------------------\n");printf(" Total %d record(s) found\n", count);}anykey_func();}
void anykey_func(void)//任何键继续{printf(" Press any key to continue...");getch();printf("\n");}