用链表编写一个学生信息管理系统

发布于2022-01-13 19:12:01

实现用结构对学生信息进行管理. 具体要求: 1, 用结构实现对学生信息进行管理(学号,姓名, 电话) 2, 从键盘输入n,分别输入学生的信息,动态建立一个长度为n的链表. 3, 遍历链表,输入学生的电话

1个回答
admin
网友回答2022-01-13
//给我800财富 #include<stdio.h> #include<stdlib.h> #include<string.h> #define N 60 #define BufLen 1024 typedef struct tagRecord { char name[N]; char num[N]; char tel[N]; struct tagRecord *next; }Record,*PtRecord; typedef enum tagType { ByName=1, ByNum, ByTel, }Type; typedef enum tagMenu { Quit=0, Add, Del, Find, Output, OutputAll, Alter, }Menu; void processmenu(Menu m); void init(); void begin(); void freeall(); int add(); void del(int n); PtRecord find(char *v,Type t); void output(int n); void outputall(); void alter(); char temp[BufLen]={'\0'},temp2[BufLen]={'\0'},quit[]="quit"; PtRecord head,tail; int main() { begin(); system("PAUSE"); return EXIT_SUCCESS; } //处理菜单 void processmenu(Menu m) { //无法处理wfchl int t,wfchl=0; PtRecord p; switch(m) { case Quit: freeall(); exit(0); break; case Add: add(); break; case Del: printf("请输入要删除的是第几个记录:"); scanf("%d",&t); del(t); break; case Find: printf("子菜单:\n1、按姓名查找\n2、按学号查找\n3、按电话号码查找\n请选择一个:"); scanf("%d",&t); switch(t) { case ByName: strcpy(temp2,"不存在姓名为"); printf("请输入要查找的记录的姓名:"); break; case ByNum: strcpy(temp2,"不存在学号为"); printf("请输入要查找的记录的学号:"); break; case ByTel: printf("请输入要查找的记录的电话号码:"); strcpy(temp2,"不存在电话号码为"); break; default: printf("无法处理的子菜单命令。\n"); wfchl=1; break; } if(!wfchl) { scanf("%s",temp); p=find(temp,(Type)t); if(p) { printf("找到了。\n这个记录的信息是:%s,%s,%s。\n",(*p).name,(*p).num,(*p).tel); } else { strcat(temp2,temp); strcat(temp2,"的记录。"); printf("%s\n",temp2); } } break; case Output: printf("请输入要输出第几个记录的信息:"); scanf("%d",&t); output(t); break; case OutputAll: outputall(); break; case Alter: alter(); break; default: printf("无法处理的菜单命令。\n"); break; } } void init() { head=NULL; tail=NULL; printf("初始化系统。\n"); while(add()); } void begin() { Menu m; char menuinfor[BufLen]={'\0'}; sprintf(menuinfor, "菜单:\n%d、退出\n%d、添加记录\n%d、删除记录\n%d、查找记录\n%d、输出某个记录\n%d、输出所有记录\n%d、修改记录\n请选择一个菜单:", Quit,Add,Del,Find,Output,OutputAll,Alter); init(); while(1) { printf("%s",menuinfor); scanf("%d",&m); processmenu(m); } } void freeall() { PtRecord p=head,q=NULL; head=NULL; tail=NULL; while(p) { q=(*p).next; free(p); p=q; } } //添加一个记录 //返回值表示本次添加操作是正常结束,还是异常结束 //返回1表示正常结束,返回0表示应用户要求终止输入 int add() { int r=1; PtRecord p; printf("添加记录。\n请输入姓名,学号,电话号码信息(以空格分隔),%s终止输入:\n",quit); scanf("%s",&temp); if(strcmp(temp,quit)) { p=(PtRecord)malloc(sizeof(Record)); strcpy((*p).name,temp); scanf("%s %s",(*p).num,(*p).tel); (*p).next=NULL; if(!head) { head=p; tail=p; } else { (*tail).next=p; tail=p; } printf("记录添加成功。\n"); } else { r=0; } return r; } //删除第n个记录 void del(int n) { int i=1; PtRecord p,q; if(n<=0) { printf("删除失败。\n第%d个记录不存在。\n",n); } else { if(!head) { printf("删除失败。\n系统中没有记录了。\n"); } else { p=head; q=NULL; while((i<n)&&p) { q=p; p=(*p).next; i++; } if(p) { if(p==head) { head=(*head).next; if(NULL==head) { tail=NULL; } } else { (*q).next=(*p).next; tail=(NULL==(*q).next ? q : tail); } printf("删除成功。\n第%d个记录:\n%s,%s,%s已删除。\n",n,(*p).name,(*p).num,(*p).tel); free(p); } else { printf("删除失败。\n第%d个记录不存在。\n",n); } } } } //查找类型为t,值为v的记录 //返回值为指向此记录的指针 //返回NULL表示找不到符合要求的记录 PtRecord find(char *v,Type t) { PtRecord p; //0表示还未找到 int f=0; for(p=head;(!f)&&p;) { switch(t) { case ByName: if(!strcmp((*p).name,v)) { f=1; } break; case ByNum: if(!strcmp((*p).num,v)) { f=1; } break; case ByTel: if(!strcmp((*p).tel,v)) { f=1; } break; default: break; } if(!f) { p=(*p).next; } } return p; } //判断pt指向的记录是否匹配r int ismatch(Record r,PtRecord pt) { int bl=1; if(strcmp(r.name,"*") && strcmp(r.name,(*pt).name)) { bl=0; } if(bl && strcmp(r.num,"*") && strcmp(r.num,(*pt).num)) { bl=0; } if(bl && strcmp(r.tel,"*") && strcmp(r.tel,(*pt).tel)) { bl=0; } return bl; } //输出第n个记录的信息 void output(int n) { int i=1; PtRecord p; if(n<=0) { printf("第%d个记录不存在。\n",n); } else { p=head; while((i<n)&&p) { p=(*p).next; i++; } if(p) { printf("第%d个记录的信息:%s,%s,%s。\n",n,(*p).name,(*p).num,(*p).tel); } else { printf("第%d个记录不存在。\n",n); } } } //输出所有记录的信息 void outputall() { PtRecord p=head; int i=1; if(NULL==head) { printf("系统中没有记录了。\n"); } while(p) { printf("第%d个记录的信息:%s,%s,%s。\n",i++,(*p).name,(*p).num,(*p).tel); p=(*p).next; } } void change(PtRecord p1,PtRecord p2) { if(strcmp((*p2).name,"*")) { strcpy((*p1).name,(*p2).name); } if(strcmp((*p2).num,"*")) { strcpy((*p1).num,(*p2).num); } if(strcmp((*p2).tel,"*")) { strcpy((*p1).tel,(*p2).tel); } } void alter() { Record r,r2; PtRecord p=head; printf("请输入要修改的记录的姓名,学号,电话号码(只需提供关键信息以便查找要修改的记录,"); printf("其它以*表示,如* 张三 *、* * 15987921583):\n"); scanf("%s %s %s",r.name,r.num,r.tel); while(p) { if(ismatch(r,p)) { printf("找到如下一条匹配你的模式的记录:\n"); printf("%s,%s,%s。\n",(*p).name,(*p).num,(*p).tel); printf("请输入将此记录修改后的新的姓名,学号,电话号码(不需修改的用*代替):\n"); scanf("%s %s %s",r2.name,r2.num,r2.tel); change(p,&r2); printf("此条记录修改成功。\n"); } p=(*p).next; } }

回到
顶部