首页 代码代码

代码代码

举报
开通vip

代码代码#include #include #include #include #include #define LEN sizeof(struct student) typedef struct student{ long numb; int chinese; int math; int english; int totalscore; char name[12]; struct student *next; } STU; //声明部分 STU* creat(); void output(STU ...

代码代码
#include #include #include #include #include #define LEN sizeof(struct student) typedef struct student{ long numb; int chinese; int math; int english; int totalscore; char name[12]; struct student *next; } STU; //声明部分 STU* creat(); void output(STU *head); STU* creatByN(int num); STU* findByNumb(STU *head, long num); STU* findByNumbEx(STU *head, long num, STU **ppBefore); STU* findByName(STU *head, char *name); void find(STU *head); STU* del(STU *head); STU* insert(STU *head); void update(STU *head); STU* sort(STU *head); void save_info(STU *head); STU *load_info(); void Backup_info(STU *head); int n;//全局变量 void main() { STU *head; int choice; for(;;){ system("cls");/*清屏*/ printf("\t欢迎使用成绩管理系统\t\n"); printf("\t1:输入多个学生信息\t\n"); printf("\t2:显示全部学生信息\t\n"); printf("\t3:删除\t\n"); printf("\t4:查找\t\n"); printf("\t5:插入\t\n"); printf("\t6:修改\t\n"); printf("\t7:排序\t\n"); printf("\t8:保存到文件\t\n"); printf("\t9:从文件加载\t\n"); printf("\t10:备份\t\n"); printf("\t0:退出\t\n"); printf("*请输入数字(0-9)进行功能选择 :"); scanf("%d",&choice); if(choice==0) break; switch(choice){ case 1: head=creat(); break; case 2: output(head); break; case 3: head=del(head); break; case 4: find(head); break; case 5: head=insert(head); break; case 6: update(head); break; case 7: head=sort(head);break; case 8: save_info(head); break; case 9: head=load_info(); break; case 10:Backup_info(head);break; } printf("按任意键继续....\n"); getch();/*暂停*/ } printf("欢迎使用,再见!\n"); } STU *creat()/*创建链 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf */ { STU *head,*pnew,*ptail; head=NULL; n=0;//初始化 printf("现在进行学生信息的输入,学号输入为0时结束\n"); while(1) { //不断申请新节点 pnew=(STU *)malloc(LEN); printf("学号\t姓名\t语文\t数学\t英语\t总分\n"); scanf("%ld",&pnew->numb); if(pnew->numb==0) break; scanf("%s",pnew->name); scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english); pnew->totalscore=0; pnew->totalscore=pnew->chinese+pnew->math+pnew->english; pnew->next=NULL;//将节点连接到链表尾部 n++; if(n==1){ head=pnew; ptail=pnew; } else{ ptail->next=pnew; ptail=pnew; }//这个算法的思路是让pnew指向新开辟的结点,ptail指向链表中最后一个结点,把pnew所指的结点连接在ptail所指的结点后面,用"ptail->next=pnew"来实现. } return head;//因为可能对head进行赋值,所以有返回值 } void output(STU *head) { STU *p;//定义一个可动指针,使其不断下移完成多个输出 printf("当前共有%d个节点:\n",n); printf("学号\t姓名\t语文\t数学\t英语\t总分\n"); for(p=head;p!=NULL;p=p->next) printf("%ld\t%s\t%d\t%d\t%d\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore); }//无变动不返回 struct student *creatByN(int num) { STU *head,*pnew,*ptail; int i; //链表初始化 head=NULL; n=0; //链表创建,一个循环 for(i=0;inumb); scanf("%s",pnew->name); scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english); pnew->next=NULL;//将pnew所指向的节点,插入到链表尾部 n++; if(n==1){ head=pnew; ptail=pnew; } else{ ptail->next=pnew; ptail=pnew; } } return head; } STU* findByNumb(STU *head, long num) { STU *p,*presult; presult=NULL; for(p=head;p!=NULL;p=p->next) if(p->numb==num){ presult=p;// 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 此时指针的位置 break; } return presult; } STU* findByName(STU *head, char *name) { STU *p,*presult; presult=NULL; for(p=head;p!=NULL;p=p->next) if(strcmp(p->name,name)==0){ presult=p; break; } return presult;//位置变更有返回值 } STU* findByNumbEx(STU *head, long num, STU **ppBefore) { STU *p,*presult,*pBefore; presult=pBefore=NULL; for(p=head;p!=NULL;pBefore=p,p=p->next)//记录指针的前一个位置 if(p->numb==num){ presult=p; break; } *ppBefore=pBefore; return presult; } void find(STU *head) { int num,choice; STU *pr; char name[12]; printf("输入要查找的方式(1:按学号,2:按姓名):"); scanf("%d",&choice); if(choice==1){ printf("输入要查找的学号:"); scanf("%ld",&num); pr=findByNumb(head,num); } else if(choice==2){ printf("输入要查找的姓名:"); scanf("%s",name); pr=findByName(head,name); } if(pr==NULL) printf("对不起,查无此人\n"); else{ printf("找到了,该生信息如下:\n"); printf("学号\t姓名\t语文\t数学\t英语\t总分\n"); printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english,pr->totalscore); } } void update(STU *head) { int num; STU *pr; printf("输入要查找的学号:"); scanf("%ld",&num); pr=findByNumb(head,num); if(pr==NULL) printf("对不起,查无此人\n"); else{ printf("找到了,该生信息如下:\n"); printf("学号\t姓名\t语文\t数学\t英语\t总分\n"); printf("%ld\t%s\t%d\t%d\t%d\n",pr->numb,pr->name,pr->chinese,pr->math,pr->english); printf("请输入修改信息\n"); printf("学号\t姓名\t语文\t数学\t英语\t总分\n"); scanf("%ld%s%d%d%d%d",&pr->numb,&pr->name,&pr->chinese,&pr->math,&pr->english); pr->totalscore=0; pr->totalscore=pr->chinese+pr->math+pr->english; } } STU* del(STU *head) { long num; STU *pCur,*pBefore; //查找要删除的节点,用pCur记录该节点 printf("输入要删除的学号:"); scanf("%ld",&num); pCur=findByNumbEx(head,num,&pBefore); //如果该节点存在,进行删除 if(pCur!=NULL){ n--;//记录删除后节点个数 //根据pCur所指节点位置进行判断:头节点或后续节点 //删除的是头节点 if(pCur==head){ head=pCur->next; } //删除的是后续节点 else{ //获取前向节点指针pBefore //利用pBefore和pCur完成删除 pBefore->next=pCur->next; } } return head; } STU* insert(STU *head) { STU *pCur,*pnew,*pBefore,*p; //申请一个新节点,并赋值 pnew=(STU *)malloc(LEN); printf("学号\t姓名\t语文\t数学\t英语\t总分\n"); scanf("%d",&pnew->numb); scanf("%s",&pnew->name); scanf("%d%d%d",&pnew->chinese,&pnew->math,&pnew->english); pnew->totalscore=0; pnew->totalscore=pnew->chinese+pnew->math+pnew->english; pnew->next=NULL; if(head==NULL)//链表为空 head=pnew; else{//链表不为空 //找位置,即获取pCur for(p=head;p!=NULL;pBefore=p,p=p->next) if(p->numb > pnew->numb){ pCur=p; break; } //没有找到pCur,则应将pnew插入到尾节点之后 if(p==NULL){ pBefore->next=pnew; } //找到pCur,则应将pnew插入到pCur之前,根据pCur的位置分为:头结点之前和中间节点之前两种情况 else{ //pCur是头结点 if(pCur==head){ pnew->next=pCur; head=pnew; } //pCur是中间结点 else{ pnew->next=pCur; pBefore->next=pnew; } } } n++; return head; } STU* sort(STU *head) { STU *first; /*排列后有序链的表头指针*/ STU *tail; /*排列后有序链的表尾指针*/ STU *p_min; /*保留键值更小的节点的前驱节点的指针*/ STU *min; /*存储最小节点*/ STU *p; /*当前比较的节点*/ (STU *)malloc(LEN); first = NULL; while (head != NULL) /*在链表中找键值最小的节点。*/ { /*注意:这里for语句就是体现选择排序思想的地方*/ for (p=head,min=head; p->next!=NULL; p=p->next) /*循环遍历链表中的节点,找出此时最小的节点。*/ { if (p->next->totalscore < min->totalscore) /*找到一个比当前min小的节点。*/ { p_min = p; /*保存找到节点的前驱节点:显然p->next的前驱节点是p。*/ min = p->next; /*保存键值更小的节点。*/ } } /*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/ /*第一件事*/ if (first == NULL) /*如果有序链表目前还是一个空链表*/ { first = min; /*第一次找到键值最小的节点。*/ tail = min; /*注意:尾指针让它指向最后的一个节点。*/ } else /*有序链表中已经有节点*/ { tail->next = min; /*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/ tail = min; /*尾指针也要指向它。*/ } /*第二件事*/ if (min == head) /*如果找到的最小节点就是第一个节点*/ { head = head->next; /*显然让head指向原head->next,即第二个节点,就OK*/ } else /*如果不是第一个节点*/ { p_min->next = min->next; /*前次最小节点的next指向当前min的next,这样就让min离开了原链表。*/ } } if (first != NULL) /*循环结束得到有序链表first*/ { tail->next = NULL; /*单向链表的最后一个节点的next应该指向NULL*/ } head = first; return head; } //保存 void save_info(STU *head) { STU *p; FILE *fp; char filename[20]; printf("输入保存文件的文件名:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL){ printf("can not open the file"); exit(0); } fprintf(fp,"当前共有%d个节点:\n",n); fprintf(fp,"学号\t姓名\t语文\t数学\t英语\t总分\n"); for(p=head;p!=NULL;p=p->next) fprintf(fp,"%ld\t%s\t%d\t%d\t%d%\t%d\n",p->numb,p->name,p->chinese,p->math,p->english,p->totalscore); fclose(fp); printf("保存成功!\n"); } //加载 STU *load_info() { STU *head,*pnew,*ptail; FILE *fp; char filename[20],secondLine[20]; int num,i; printf("输入读取文件的文件名:"); scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL){ printf("can not open the file"); exit(0); } fscanf(fp,"当前共有%d个节点:",&num); //过滤第二行 for(i=0;i<6;i++) fscanf(fp,"%s",secondLine); //链表初始化 head=NULL; n=0; //链表创建,一个循环 for(i=0;inumb,&pnew->name,&pnew->chinese,&pnew->math,&pnew->english,&pnew->totalscore); pnew->next=NULL; //将pnew所指向的节点,插入到链表尾部 n++;//记录加载后节点个数 if(n==1){ head=pnew; ptail=pnew; } else{ ptail->next=pnew; ptail=pnew; } } fclose(fp); printf("读取成功!\n"); return head; } void Backup_info(STU *head)//备份 { FILE *in,*out; char infile[10],outfile[10]; printf("Enter the inflie name:\n"); scanf("%s",infile); printf("Enter the outflie name:\n"); scanf("%s",outfile); if((in=fopen(infile,"r"))==NULL) { printf("cannot open infile\n"); exit(0); } if((out=fopen(outfile,"w"))==NULL) { printf("cannot open outfile\n"); exit(0); } while(! feof(in)) fputc(fgetc(in),out); fclose(in); fclose(out); printf("备份成功!\n"); }
本文档为【代码代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_536107
暂无简介~
格式:doc
大小:45KB
软件:Word
页数:12
分类:互联网
上传时间:2013-09-12
浏览量:50