学生管理系统:学习了一点文件指针的操作和链表操作,以前总想搞下子,刚好碰到同学要做这个,自己瞎搞了一通。
实现功能:数据添加,查找,删除,插入,修改只是在查找加几句就没写。
#include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #include <ctime> #include <cmath> #include <string> #include <cstring> #include <stack> #include <queue> #include <list> #include <vector> #include <map> #include <set> using namespace std; const int INF=0x3f3f3f3f; const double eps=1e-10; const double PI=acos(-1.0); #define maxn 500 #define LEN sizeof(struct student) struct student { char number[20]; //学号 char name[20]; //姓名 char sex[5]; //性别 char classn[20]; //班级 int score1; //数学分数 int score2; //英语分数 int score3; //计算机分数 struct student *next; //结构体指针 }; FILE *r; FILE *w; void Menu()//主菜单 { system("cls"); printf("************学生成绩管理系统****************\n"); printf(" 1-文件读出学生信息\n"); printf(" 2-手动输入学生信息读入到文件\n"); printf(" 3-按学号查询学生信息\n"); printf(" 4-按学号删除学生信息\n"); printf(" 5-按学号从小到大插入学生信息\n"); printf(" 6-浏览显示全部学生成绩\n"); printf(" 0-退出\n"); printf("输入功能编号\n"); } struct student *tail; struct student *input() { struct student *head,*p1,*p2; //开辟一个LEN大小的空间,并让p1,p2指针指向它 p2=p1=(struct student *)malloc(LEN); //将头指针置为NULL head=NULL; //创建链表节点并给节点的元素赋值 //printf("请输入学生的学号和姓名:"); //while(~scanf("%ld %s",&p1->num,p1->name); while(~fscanf(r,"%s%s%s%s%d%d%d",p1->number, p1->name, p1->sex, p1->classn, &p1->score1, &p1->score2, &p1->score3)) { //n=n+1; if(NULL==head) { head=p1; } else { p2->next=p1; } p2=p1; p1=(struct student *)malloc(LEN); // printf("请输入学生的学号和姓名:"); // scanf("%ld %s",&p1->num,p1->name); } //将尾节点的指针置为NULL p2->next=NULL; tail = p2; printf("从文件读出信息完毕\n"); printf("可以继续输入功能编号\n"); return head; } struct student * Add(struct student * head) { struct student *p1,*p2; //开辟一个LEN大小的空间,并让p1,p2指针指向它 p2=p1=(struct student *)malloc(LEN); //创建链表节点并给节点的元素赋值 printf("添加学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数\n"); printf("输入:2333 代表添加结束\n"); p2 = head; while(1) { scanf("%s",p1->number); if(strcmp(p1->number,"2333") == 0) break; scanf("%s%s%s%d%d%d",p1->name,p1->sex,p1->classn,&p1->score1,&p1->score2,&p1->score3); struct student *pp = p1; if(NULL==head) { head=p1; } else { p2->next=p1; } p2=p1; p1=(struct student *)malloc(LEN); fprintf(w,"%s %s %s %s %d %d %d\n",pp->number, pp->name, pp->sex, pp->classn, pp->score1, pp->score2, pp->score3); } //将尾节点的指针置为NULL printf("添加信息到文件完毕\n"); printf("可以继续输入功能编号\n"); p2->next=NULL; return head; } void Serach(struct student * head) { struct student *p1,*p2; p1=head; printf("输入需要查询的学号"); char number[20]; scanf("%s",number); if(NULL==head) { printf("链表为空!\n"); return ; } //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点 //如果找到相应节点,或者已经遍历到尾节点就跳出循环 while(strcmp(p1->number,number) != 0&&p1->next!=NULL) { p2=p1; p1=p1->next; } if(strcmp(p1->number,number) == 0) printf("%s%9s%5s%6s%9d%9d%9d\n",p1->number,p1->name,p1->sex, p1->classn, p1->score1, p1->score2, p1->score3); else printf("链表中没有要查询的元素.\n"); printf("可以继续输入功能编号\n"); } struct student * Delete(struct student * head) { struct student *p1; struct student *p2; p1=head; //判断链表是否为空 printf("输入需要删除的学号"); char number[20]; scanf("%s",number); if(NULL==head) { printf("链表为空!\n"); return head; } //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点 //如果找到相应节点,或者已经遍历到尾节点就跳出循环 while(strcmp(p1->number,number)!=0&&p1->next!=NULL) { p2=p1; p1=p1->next; } //判断是否找到相应节点 if(strcmp(p1->number,number) == 0) { //要删除的节点是不是链表的第一个节点 //如果是,就将头指针指向该节点的后一个节点 //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 if(head==p1) { head=p1->next; } else { p2->next=p1->next; } //n=n-1; printf("%s 节点已删除.\n",number); } else { printf("链表中没有要删除的元素.\n"); } printf("可以继续输入功能编号\n"); return head; } struct student *Insert(struct student * head) { struct student *p0; struct student *p1; struct student *p2; p1=head; //判断链表是否为空,如果是空链表,就将新节点作为第一个节点 printf("插入学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数\n"); printf("输入:1333 代表插入结束\n"); while(1) { p0=(struct student *)malloc(LEN); scanf("%s",p0->number); if(strcmp(p0->number,"1333") == 0) break; scanf("%s%s%s%d%d%d",p0->name,p0->sex,p0->classn,&p0->score1,&p0->score2,&p0->score3); if(NULL==head) { head=p0; p0->next=NULL; } else { //遍历每一个节点中的学号,与新学号比较大小 //如果找到一个学号比新学号大,就将新学号的节点插入它之前 //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 while(strcmp(p0->number,p1->number) > 0&&(p1->next!=NULL)) { p2=p1; p1=p1->next; } //找到一个比新学号大的节点 if(strcmp(p0->number, p1->number) <= 0) { //判断该节点是否为头节点,如果是,则将新节点设置为头节点 if(p1==head) { head=p0; } else { p2->next=p0; } p0->next=p1; } else { p1->next=p0; p0->next=NULL; } } printf("%s 插入成功!\n", p0->number); } printf("插入结束!\n"); printf("可以继续输入功能编号\n"); return head; } void Print(struct student *head) { struct student * p; p=head; //判断链表是否为空 if(NULL==head) { printf("链表为空!\n"); return ; } else { //循环打印链表中的元素 //printf("%d 个记录分别为:\n",n); while(p!=NULL) { printf("%s %s\n",p->number,p->name); //指针指向下一个节点 p=p->next; } } printf("可以继续输入功能编号\n"); } int main() { Menu(); int num; struct student *head =NULL; struct student *stu; tail = NULL; while(1) { scanf("%d", &num); Menu(); if(num == 0) break; switch(num) { case 1://fopen("student.txt","r");//在根目录中 r = fopen("C:\\Users\\JONE\\Desktop\\student.txt", "r"); if (r==NULL) puts("null"); head = input(); fclose(r); break; case 2: w = fopen("C:\\Users\\JONE\\Desktop\\myfile.txt", "w"); if(w==NULL) puts("null"); if(head == NULL) head = Add(tail); else tail = Add(tail); fclose(w); break; case 3: Serach(head); break; case 4: head = Delete(head); break; case 5: head = Insert(head); break; case 6: Print(head); break; } } return 0; }
时间: 2024-10-19 04:06:21