/* TC 2.01 测试通过 非 tc 请自行修改 */
/* 没有全面测试 自行解决 嘿嘿 by碎心竹 */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#define NAME 16
#define SEX 6
/*
#define NO 6
#define AGE 3
#define CLAS 3
*/
#define ERROR 0
#define OK 1
/*
1、学生名单管理
任务:可以实现学生名单的增加、删除、修改、显示、排序;
姓名、 性别、 年龄、 学号、 班级、 基础课成绩、专业课程成绩,总成绩
name sex age no clas base pro sum
zhangwenhui n 24 123456 5 70 60 130
*/
typedef struct nod
{
int no;
char name[NAME];
char sex[SEX];
short int age;
short int clas;
int base;
int pro;
int sum;
struct nod *next;
}Nod;
int readfile(Nod *head,FILE *fp); /* 从文件读取数据 */
int writefile(FILE *fp,Nod *head); /* 数据写入文件 */
Nod * createnod(void); /* 创建空链表 */
int destroynod(Nod *head); /*销毁 链表 */
int getline(char *pch,int x); /* 字符输入 */
int getdig(int *i); /*数字输入*/
int insetnod (Nod *head); /* 顺序插入一个学员 */
int deletenod(Nod *head); /*删除一个学员 */
int sortnod(Nod *head); /*排序 列表 */
int printnod(Nod *head); /*显示所有 具有分屏功能*/
modifynod(Nod *head); /* 修改学员资料 */
void mainlist(int open,FILE *fp); /* 主菜单*/
main(void)
{
int open = 0; /* 文件打开 */
FILE *fp;
fp = fopen ("data.txt","r");
if (!fp) {
open = 1;
}
textbackground(BLUE);
textcolor(YELLOW);
clrscr();
printf(" \n\n\n\n\n\n\n\n\n\t\t\t *************************\n"
" \t\t\t * *\n"
" \t\t\t * *\n"
" \t\t\t * Welcom to this ! *\n"
" \t\t\t * *\n"
" \t\t\t * *\n"
" \t\t\t *************************\n"
"\n\n\n\n\n\n\n\n\n\nPlease any key to continue........\n");
getch();
mainlist(open,fp);
return 0;
}/* main() */
void mainlist(int open,FILE *fp)
{
int ch;
Nod *head = NULL;
if (fp){
head = createnod();
readfile(head,fp);
}
while(1){
textcolor(YELLOW);
clrscr();
printf("\n\n\n "
"\t\t\t*******************************\n"
"\t\t\t* *\n"
"\t\t\t* 1. Creat a list *\n"
"\t\t\t* 2. Add a student *\n"
"\t\t\t* 3. Del a student *\n"
"\t\t\t* 4. Print list *\n"
"\t\t\t* 5. Modify a student *\n"
"\t\t\t* 6. Sort list for No *\n"
"\t\t\t* 7. Load File * do't use! *\n"
"\t\t\t* 8. Wirte File for list *\n"
"\t\t\t* *\n"
"\t\t\t*******************************\n"
"\t\t\tOther is Exit !!! \n"
);
if(!open)
printf("\n\n\n\n FILE IS OPEN !!!!!!\n");
else
printf("\n\n\n\n FILE NOT OPEN Now is Write Mode !!\n");
ch=getch();
switch(ch){
case '1':if (!open){
textcolor(WHITE);
clrscr();
printf("\n\nFile Is Open Not Write \n\nPlease Input 7 \n\n\n Please any key to continue\n");
getch();
continue;
}
else if(head){
textcolor(WHITE);
clrscr();
printf("Lis Is have Now Not be Create \n\n\nPlease any key to continue\n");
getch();
continue;
}
head = createnod();
textcolor(WHITE);
clrscr();
printf("\nCreat List OK! \n\nPlease Input 2 for Add a studen \n\n\nPlease any key to continue\n");
getch();
break;
case '2':if (!head){
textcolor(WHITE);
clrscr();
printf("\n\nList is Empty\n\n Please Input 1\n\n\n\n Please any key to continue\n");
getch();
continue;
}
else{
clrscr();
insetnod (head);
}
break;
case '3':if (!head){
textcolor(WHITE);
clrscr();
printf("\n\nList is Empty \n\nPlease Input 1\n\n\n\n Please any key to continue\n");
getch();
continue;
}
else{
clrscr();
deletenod(head);
}
break;
case '4':if (!head){
textcolor(WHITE);
clrscr();
printf("\n\nList is Empty\n\n Please Input 1\n\n\n\n Please any key to continue\n");
getch();
continue;
}
else{
clrscr();
printnod(head);
}
break;
case '5':if (!head){
textcolor(WHITE);
clrscr();
printf("\n\nList is Empty Please Input 1\n\n\n Please any key to continue\n");
getch();
continue;
}
else{
textcolor(YELLOW);
clrscr();
modifynod(head);
printf("modif stdent OK\n\n\n Please any key to continue\n");
getch();
}
break;
case '6':if (!head){
textcolor(WHITE);
clrscr();
printf("List is Empty \n\nPlease Input 1\n\n\n Please any key to continue\n");
getch();
continue;
}
else{
textcolor(YELLOW);
clrscr();
sortnod(head);
printf("Sort stdent OK\n\n\n Please any key to continue\n");
getch();
}
break;
/*
case '7':if (open){
clrscr();
printf("File is Not Find Please Create a list to Write it\n\n\n Please any key to continue\n");
getch();
continue;
}
else if (head){
clrscr();
printf("List is being Don't Read file \n\n\n Please any key to continue\n");
getch();
continue;
}
else{
clrscr();
readfile(fp);
}
break;
*/
case '8': if (!head){
textcolor(WHITE);
clrscr();
printf("\n\nList is Empty \n\nPlease Input 1\n\n\n Please any key to continue\n");
getch();
continue;
}
else{
textcolor(YELLOW);
clrscr();
writefile(fp,head);
printf("File Write OK ! \n\n\n\nPlease any key to continue\n");
getch();
}
break;
default : destroynod(head); exit(0);
}
/*break; */
}
}/* mainlist() */
Nod * createnod(void)
{
Nod *head ;
head = (Nod *) malloc( sizeof(Nod) );
if (!head)
return NULL;
head->no = 0;
head->name[0] = '\0';
head->sex[0] = '\0';
head->age = 0;
head->clas = 0;
head->base = 0;
head->pro = 0;
head->sum = 0;
head->next = NULL;
return head;
}/* createnod() */
int insetnod (Nod *head)
{
int no;
Nod *curr, *front, *temp;
if(!head)
return ERROR;
front = curr = head;
textcolor(YELLOW);
clrscr();
printf("Please input this student No.\n"); /* 输入学号 */
getdig(&no);
while(NULL != curr && curr->next->no < no){ /* 寻找 插入位置 */
front = curr;
curr = curr->next;
}
temp = (Nod *) malloc( sizeof(Nod) );
if(!temp)
return ERROR;
temp->no = no;
/* printf("temp no:%d\n",temp->no); */
printf("Please Input this student Name:\n");
getline(temp->name,NAME);
/* printf("temp name :%s\n",temp->name);*/
printf("Please Input this student Sex:\n");
getline(&temp->sex,SEX);
printf("Please Input this student Age:\n");
getdig(&temp->age);
printf("Please Input this student class:\n");
getdig(&temp->clas);
printf("Please Input this student base:\n");
getdig(&temp->base);
printf("Please Input this student Pro:\n");
getdig(&temp->pro);
temp->sum = temp->base + temp->pro;
temp->next = front->next;
front->next = temp;
++head->sum; /* 链表总数+1 */
return OK;
}/* insetnod() */
int getdig(int *no)
{
int ch;
*no = 0;
while ( (ch = getchar()) != '\n' && ch != EOF){
if ( isdigit(ch) && (*no * 10 + (ch -'0')) > 0 ){
*no = *no * 10 + (ch - '0');
}
}
/* printf("no is : %d\n",*no);*/
return OK;
}/* getdig() */
int getline(char *pch,int x)
{
int i,ch;
x -= 1;
i = 0;
if (x < 0)
return ERROR;
while ( (ch = getchar()) != '\n' && ch != EOF){
if (i < x ){
pch[i] = ch;
/* printf("pch is : %c\n",pch[i]);*/
++i;
}
}
if (x > 1 ){
pch[i] = '\0';
/* printf(" \ 0 is input\n"); */
}
return OK;
}/* getline() */
int destroynod(Nod *head) /* 销毁 */
{
Nod *temp;
temp = head;
do{
head = temp;
temp = head->next;
printf("destroy %d\n",temp);
free(head);
}while (temp);
printf("See You \n");
return OK;
}/* destroynod() */
int deletenod(Nod *head) /* 删除 */
{
Nod *curr,*temp;
int no;
temp = curr = head;
printf("Please input this student No.\n"); /* 输入要删除学号 */
getdig(&no);
while(NULL != curr) { /* 寻找 位置 */
if (curr->no == no){
head->next = curr->next;
free(curr);
--temp->sum;
return OK;
}
head = curr;
curr = curr->next;
}
printf("Nod Find No.%d \n\n\n\nPlease any key to continue\n",no);
getch();
return ERROR;
} /* deletenod() */
int printnod(Nod *head)
{
if (!head)
return ERROR;
printf("all student is %d\n",head->sum);
head = head->next;
printf("%6s %10s %5s %5s %5s %5s %5d %5s\n",
"No","name","sex","age","class","base","pro", "sum");
while (head){
printf("%6d %10s %5s %5d %5d %5d %5d %5d\n",
head->no,head->name,head->sex,head->age,head->clas,
head->base,head->pro,head->sum);
head = head->next;
}
printf("Please any key to continue\n");
getch();
return OK;
}
int writefile(FILE *fp,Nod *head)
{
if (!head)
return ERROR;
fp = fopen ("data.txt","w");
head = head->next;
while(head != NULL){
fputs(itoa(head->no,"",10),fp);
fputc(' ',fp);
fputs(head->name,fp);
fputc(' ',fp);
fputs(head->sex,fp);
fputc(' ',fp);
fputs(itoa(head->age,"",10),fp);
fputc(' ',fp);
fputs(itoa(head->clas,"",10),fp);
fputc(' ',fp);
fputs(itoa(head->base,"",10),fp);
fputc(' ',fp);
fputs(itoa(head->pro,"",10),fp);
fputc(' ',fp);
fputs(itoa(head->sum,"",10),fp);
fputc('\n',fp);
head = head->next;
}
fclose(fp);
return OK;
}/* writefile() */
int readfile(Nod *head,FILE *fp)
{
Nod *temp, *suu;
char atmp[20];
if (!fp || !head)
return NULL;
suu = head;
while ( fscanf(fp,"%s",atmp) != EOF ){
/* fscanf(fp,"%s",atmp); */
temp =(Nod *) malloc( sizeof(Nod) );
temp->no = atoi(atmp);
fscanf(fp,"%s",temp->name) ;
fscanf(fp,"%s",temp->sex);
fscanf(fp,"%s",atmp);
temp->age = atoi( atmp );
fscanf(fp,"%s",atmp);
temp->clas = atoi( atmp );
fscanf(fp,"%s",atmp);
temp->base = atoi( atmp );
fscanf(fp,"%s",atmp);
temp->pro = atoi( atmp );
fscanf(fp,"%s",atmp);
temp->sum = atoi( atmp );
temp->next = NULL;
++suu->sum; /* */
head->next = temp;
head = head->next;
}
return OK;
}/* readfile() */
modifynod(Nod *head)/* 修改学员资料 */
{
Nod *temp;
int no;
temp = head;
printf("Please input this student No.\n"); /* 输入要修改学号 */
getdig(&no);
while(NULL != head) { /* 寻找 位置 */
if (temp->no == no){
printf("Please input this student No.\n"); /* 输入学号 */
getdig(&no);
temp->no = no;
printf("Please Input this student Name:\n");
getline(temp->name,NAME);
/* printf("temp name :%s\n",temp->name);*/
printf("Please Input this student Sex:\n");
getline(&temp->sex,SEX);
printf("Please Input this student Age:\n");
getdig(&temp->age);
printf("Please Input this student class:\n");
getdig(&temp->clas);
printf("Please Input this student base:\n");
getdig(&temp->base);
printf("Please Input this student Pro:\n");
getdig(&temp->pro);
temp->sum = temp->base + temp->pro;
return OK;
}
temp = temp->next;
}
printf("Nod Find No.%d \n\n\nPlease any key to continue\n",no);
getch();
return ERROR;
}/* modifynod() */
int sortnod(Nod *head)
{
Nod *list,*r, *temp, *hhead;
int max, i, l, ts;
hhead = head;
max = head -> sum-1;
printf("max: %d\n",max);
for (i = 0; i < max; i++){
head = hhead;
ts = 0; /* 测试 检查 */
for (l = 0; l < max;l++){
list = head -> next;
r = list -> next;
if(list->no > r->no){
temp = head->next;
head->next = list->next;
list -> next = r->next;
r->next = temp;
++ts;
}
head = head->next;
}
if (0 == ts)
return OK;
}
return OK;
}/* sortnod() */