📄 z.c
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h" /*屏幕操作函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/
#define N 3
typedef struct
{
char Num[6]; /*学生学号*/
char Name[6]; /*学生名字*/
int Age; /*学生年龄*/
char Sex[6]; /*学生性别*/
}stuifo;
typedef struct z1
{
char no[6]; /*学生学号*/
char name[6]; /*学生名字*/
char grade[5]; /*学生年级*/
char sub[9]; /*学生专业*/
int score[N]; /*学生分数*/
float sum; /*学生总分*/
float average; /*学生均分*/
int order; /*学生排名*/
struct z1 *next;
}STUDENT;
typedef struct node /*排序二叉树*/
{
stuifo data; /*二叉树关键字*/
struct node *lchild,*rchild;
}bstnode;
int menu_select(); /*菜单函数*/
void append(); /*追加记录*/
void print(STUDENT *h); /* 显示所有记录*/
void save(STUDENT *h); /*追加记录*/
void computer(STUDENT *h); /*计算总分和均分*/
void search(STUDENT *h); /*按名称查找*/
STUDENT *init(); /*初始化函数*/
STUDENT *create(); /*创建链表*/
STUDENT *delete(STUDENT *h); /*删除记录*/
STUDENT *insert(STUDENT *h); /*插入记录*/
STUDENT *load(); /*读入记录*/
STUDENT *sort(STUDENT *h); /*排序*/
bstnode *CREATBST();
bstnode *INSERTBST(bstnode *t,bstnode *s);
bstnode *BSTSEARCH(bstnode *t,char k);
/*主函数*/
main()
{ bstnode *t;
int i;char k;
STUDENT *head; /*链表定义头指针*/
head=init(); /*初始化链表*/
clrscr();
for(;;) /*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{
case 0:head=init();break; /*初始化*/
case 1:head=create();break; /*创建链表*/
case 2:head=delete(head);break; /*删除*/
case 3:head=insert(head);break; /*插入*/
case 4:print(head);break; /*打印*/
case 5:search(head);break; /*搜索*/
case 6:save(head);break; /*保存到文件*/
case 7:head=load(); break; /*读取于文件*/
case 8:computer(head);break; /*计算*/
case 9:head=sort(head);break; /*排序*/
case 10:append();break; /*追加到文件*/
case 11:BSTSEARCH(t,k); /*学生信息显示*/
case 12:exit(0); /*退出*/
}
}
}
/*菜单函数*/
menu_select()
{
char *menu[]={"*************************MENU*************************",
"| 0. Clean list |",
"| 1. Enter list |",
"| 2. Del a data from list |",
"| 3. Insert a data to list |",
"| 4. Print a list of all student |",
"| 5. Search a data on name by one student |",
"| 6. Save the file |",
"| 7. Load the file |",
"| 8. Count the score by grade and course |",
"| 9. Sort to make new file |",
"| 10. Add a record to file |",
"| 11. Display the student's data |",
"| 12. Quit the system |",
"******************************************************"};
char s[3]; /*以字符形式保存选择号*/
int c,i;
gotoxy(1,25); /*移动光标*/ printf("press any key enter menu......\n");
textcolor(2);
getch(); /*输入任一键*/
clrscr(); /*清屏幕*/
gotoxy(10,2); /*移动光标*/
clrscr(); /*清屏*/
/*输出主菜单数组*/
for(i=0;i<15;i++)
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
gotoxy(10,16);
do{
printf("\n Enter you choice(0~12):");
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<0||c>12);
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
/*初始化函数*/
STUDENT *init()
{return NULL;}
/*创建链表*/
STUDENT *create()
{ int i; int s;
STUDENT *h=NULL,*info; /*STUDENT指向结构体的指针*/
bstnode *t;
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT));/*申请空间*/
if(!info) /*如果指针info为空*/
{
printf("\nout of memory"); /*输出内存溢出*/
return NULL;
}
inputs("enter no:",info->no,6); /*输入学号并校验*/
if(info->no[0]=='+')break; /*如果学号首字符为+则结束输入*/
inputs("enter name:",info->name,6); /*输入姓名,并进行校验*/
inputs("enter grade:",info->grade,5);/*提示开始输入年级*/
inputs("enter sub:",info->sub,9); /*提示开始输入专业*/
t=CREATBST(info); /*学生信息读入树*/
printf("please input %d score \n",N);/*提示开始输入成绩*/
s=0;
for(i=0;i<N;i++) /*N门课程循环N次*/
{
do{
printf("score%d:",i+1); /*提示输入第几门课程*/
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)/*确保成绩在0~100之间*/
printf("bad data,repeat input\n"); /*出错提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i];
}
info->sum=s; /*将总分保存*/
info->average=(float)s/N; /*求出平均值*/
info->order=0;/*未排序前此值为0*/
info->next=h; /*将头结点做为新输入结点的后继结点*/
h=info; /*新输入结点为新的头结点*/
}
return(h);
}
/*将结点插入树*/
bstnode *INSERTBST(bstnode *t,bstnode *s)
{bstnode *f,*p;
p=t;
while(p!=NULL)
{f=p;
if(!strcmp(s->data.Name,p->data.Name)) return t;
if(strcmp(s->data.Name,p->data.Name)<0) p=p->lchild;
else p=p->rchild;
}
if(t==NULL) return s;
if(strcmp(s->data.Name,f->data.Name)<0) f->lchild=s;
else f->rchild=s;
return t;
}
/*创建学生信息的树*/
bstnode *CREATBST(STUDENT *info)
{ bstnode *t,*s;
STUDENT *h;
char *endflag="0";
stuifo tempdata;
t=NULL;
strcpy(tempdata.Name,info->name);
if(strcmp(tempdata.Name,endflag)!=0)
{s=malloc(sizeof(bstnode));
s->lchild=s->rchild=NULL;
strcpy(s->data.Name,tempdata.Name);
strcpy(tempdata.Num,info->no);
strcpy(s->data.Num,tempdata.Num);
printf("Input the student's sex:");
scanf("%s",tempdata.Sex);
strcpy(s->data.Sex,tempdata.Sex);
printf("Input the student's age:");
scanf("%d",&tempdata.Age);
s->data.Age=tempdata.Age;
t=INSERTBST(t,s); /*引用插入函数*/
}
return t;
}
bstnode *BSTSEARCH(bstnode *t,char k)
{
do{
printf("\nplease input a name of the student whose score you want to see: \n");
scanf("%s",k);
while(t!=NULL)
{if(strcmp(t->data.Name,k)==0)break;
if(strcmp(t->data.Name,k)>0)t=t->lchild;
else t=t->rchild;
}
printf("\n--Num:%ld, Name:%s, Age;%d, Sex:%s \n",t->data.Num,t->data.Name,
t->data.Age,t->data.Sex);getch();
}while(k!=0);
}
/*输入字符串,并进行长度验证*/
inputs(char *prompt, char *s, int count)
{
char p[255];
do{
printf(prompt);/*显示提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n");
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
void print(STUDENT *h)
{
int i=0; /*统计记录条数*/
STUDENT *p; /*移动指针*/
clrscr(); /*清屏*/
p=h; /*初值为头指针*/
printf("\n\n\n********************************STUDENT**********************************\n");
printf("|rec|nO |name |grade| sub | sc1| sc2| sc3| sum | ave |order|\n");
printf("|---|------|------|-----|---------|----|----|----|--------|-------|-----|\n");
while(p!=NULL)
{
i++;
printf("|%2d |%-6s|%-6s|%-5s|%-9s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i,
p->no,p->name,p->grade,p->sub,p->score[0],p->score[1],p->score[2],p->sum,
p->average,p->order);
p=p->next;
}
printf("**********************************end************************************\n");
}
/*删除记录*/
STUDENT *delete(STUDENT *h)
{
STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
char s[6]; /*存放学号*/
clrscr();
printf("please deleted no\n");
scanf("%s",s); /*输入要删除记录的学号*/
q=p=h; /*给q和p赋初值头指针*/
while(strcmp(p->no,s)&&p!=NULL)/*当记录的学号不是要找的,或指针不为空时*/
{
q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}
if(p==NULL) /*如果p为空,说明链表中没有该结点*/
printf("\nlist no %s student\n",s);
else /*p不为空,显示找到的记录信息*/
{
printf("*****************************have found******************************\n");
printf("|no | name |grade| sub | sc1| sc2| sc3| sum | ave |order|\n");
printf("|------|------|-----|---------|----|----|----|--------|-------|-----|\n");
printf("|%-6s|%-6s|%-5s|%-9s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
p->name,p->grade,p->sub,p->score[0],p->score[1],p->score[2],p->sum,
p->average,p->order);
printf("********************************end**********************************\n");
getch(); /*压任一键后,开始删除*/
if(p==h) /*如果p==h,说明被删结点是头结点*/
h=p->next;
else
q->next=p->next;/*不是头指针,将p的后继结点作为q的后继结点*/
free(p); /*释放p所指结点空间*/
printf("\n have deleted No %s student\n",s);
printf("Don't forget save\n");/*提示删除后不要忘记保存文件*/
}
return(h); /*返回头指针*/
}
/*查找记录*/
void search(STUDENT *h)
{
STUDENT *p; /* 移动指针*/
char s[6]; /*存放姓名的字符数组*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -