学生信息录入小程序,大家都来帮忙看看哈!!!
程序代码:
#include<stdio.h> #include<stdlib.h> #include<windows.h> struct student { long num; //索引,具有唯一标识不允许重复!!! char name[20]; char sex[10]; char brith[15]; char remark[30]; struct student *next; }; struct student *creat(void)//创建n个同学的链表,以输入NUM==0结束!!! { struct student *p1, *p2; struct student *head=NULL; int m=0; long n; for( ; ; ) { p1=(struct student *)malloc(sizeof(struct student)); printf(" num:"); scanf("%ld",&n); if(n==0) { p2->next=NULL; return head; } p1->num=n; printf(" name:"); scanf("%s",&p1->name); printf(" sex:"); scanf("%s",&p1->sex); printf(" brith:"); scanf("%s",&p1->brith); printf(" remark:"); scanf("%s",&p1->remark); if(m==0) { head=p1; } else p2->next=p1; p2=p1; m++; } return head; } struct student *search1(long num,char *name,struct student *h)//查询返回该num所在地址! { struct student *p1; int n=1; p1=h; for(;p1!=NULL;) { if(p1->num==num||strcmp(p1->name,name)==0) { printf("%-13ld %-13s %-13s %-13s %-200s\n",h->num,h->name,h->sex,h->brith,h->remark); n++; } if(p1->num==num) return p1; p1=p1->next; } if(n==1) { printf("没有查找到该数据!"); } return NULL; } struct student *search2(long num,char *name,struct student *h)//返回num所在地址的前一地址! { struct student *p1, *p2; int n=1; p1=h; p2=h; if(h==NULL) { //printf("没有查找到该数据\n"); return NULL; } if(h->num==num) { return p2; } else if(p1->next==NULL) { if(p1->num==num) { //printf("%-13ld %-13s %-13s %-13s %-20s\n",h->num,h->name,h->sex,h->brith,h->remark); return p2; } else { //printf("没有查找到该数据!"); return NULL; } } else { for(;p1!=NULL;) { p2=p1; p1=p1->next; if(p1->num==num) { printf("%-13ld %-13s %-13s %-13s %-20s\n",h->num,h->name,h->sex,h->brith,h->remark); return p2; } } } //printf("没有查找到该数据!"); return NULL; } struct student *add(struct student *p1,struct student *p2,struct student *h)//add插入 { struct student *p3; if(p1!=NULL) { p3=(struct student *)malloc(sizeof(struct student)); printf(" num:"); scanf("%ld",&p3->num); printf(" name:"); scanf("%s",&p3->name); printf(" sex:"); scanf("%s",&p3->sex); printf(" brith:"); scanf("%s",&p3->brith); printf(" remark:"); scanf("%s",&p3->remark); p1->next=p3; p3->next=p2; return h; } return h; } struct student *delet(struct student *p1,struct student *p2,struct student *h)//delete删除 { if(p1==NULL) { return h; } if(p1->num==h->num)//1 { if(p1->num==p2->num) { h=h->next; return h; } else p1->next=p2->next; } else if(p1==NULL)//z1 { printf("\n");//bcz } else p1->next=p2->next; return h; } struct student *revise(struct student *p1,struct student *h)//revise修改 { struct student *p2; if(p1==NULL) { return h; } //p2=p1; p2=(struct student *)malloc(sizeof(struct student)); printf(" num:"); scanf("%ld",&p1->num); printf(" name:"); scanf("%s",&p1->name); printf(" sex:"); scanf("%s",&p1->sex); printf(" brith:"); scanf("%s",&p1->brith); printf(" remark:"); scanf("%s",&p1->remark); p2=p1->next; p1=p2; return h; } int print(struct student *h)//printf输出! { for(;h!=NULL;) { printf("%-13ld %-13s %-13s %-13s %-20s\n",h->num,h->name,h->sex,h->brith,h->remark); h=h->next; } return 0; } void menu1(void)//菜单一 { system("CLS"); printf("\t\t\t单链表C语言实现实例\n"); printf("\t\t|————————————————|\n"); printf("\t\t| |\n");printf("\t\t| [1] 建 立 新 表 |\n"); printf("\t\t| [2] 查 找 数 据 |\n"); printf("\t\t| [3] 插 入 数 据 |\n"); printf("\t\t| [4] 删 除 数 据 |\n"); printf("\t\t| [5] 修 改 数 据 |\n"); printf("\t\t| [6] 打 印 数 据 |\n"); printf("\t\t| [7] 帮 助() |\n"); printf("\t\t| [8] 退 出 |\n"); printf("\t\t| |\n"); printf("\t\t| 如未建立新表,请先建立! |\n"); printf("\t\t| |\n"); printf("\t\t|————————————————|\n"); printf("\t\t 请输入你的选项(1-8):"); } void menu2(void)//菜单2 { system("CLS"); printf("\t\t 请输入你的查询方式(1-2):\n"); printf("\t\t|————————————————|\n"); printf("\t\t| [1] 按 学 号 查 询\n"); printf("\t\t| [2] 按 姓 名 查 询\n"); printf("\t\t| |\n"); printf("\t\t| 如未建立新表,请先建立! |\n"); printf("\t\t|————————————————|\n"); printf("\t\t 请输入你的选项(1-2):"); } int main() { int m, choise; long num; struct student *head, *p1, *p2; char name[20], *a="0"; head=NULL; menu1(); for( ; ; ) { scanf("%d",&choise); switch(choise) { case 1: head=creat();system("CLS");break; case 2: printf("请选择查询方式:"); menu2(); scanf("%d",&m); if(m==1) { printf("输入你所要查找的人的学号:"); scanf("%ld",&num); printf("学号 姓名 性别 生日 备注\n"); search1(num,a,head); } else if(m==2) { printf("输入你所要查找的人的姓名:"); scanf("%s",name); printf("学号 姓名 性别 生日 备注\n"); search1(0,name,head); } printf("\n按回车键回到主菜单。"); getchar(); getchar(); break; case 3: printf("学号 姓名 性别 生日 备注\n");//输出表后便于操作! print(head); printf("输入你要在哪个学号后面插入(如在排头插入请输入0):"); scanf("%ld",&num); if(num==0) { p1=(struct student *)malloc(sizeof(struct student)); printf(" num:"); scanf("%ld",&p1->num); printf(" name:"); scanf("%s",&p1->name); printf(" sex:"); scanf("%s",&p1->sex); printf(" brith:"); scanf("%s",&p1->brith); printf(" remark:"); scanf("%s",&p1->remark); p1->next=head; head=p1; } else { p1=search1(num,a,head); if(p1==NULL) { goto a; } p2=p1->next; head=add(p1,p2,head); } a: printf("\n按回车键回到主菜单!"); getchar(); getchar(); break; case 4: printf("学号 姓名 性别 生日 备注\n");//输出表后便于操作! print(head); printf("\n输入你所要删除的人的学号:"); scanf("%ld",&num); p1=search2(num,a,head); p2=search1(num,a,head); head=delet(p1,p2,head); printf("\n按回车键回到主菜单!"); getchar(); getchar(); break; case 5: printf("学号 姓名 性别 生日 备注\n");//输出表后便于操作! print(head); printf("\n输入你所要修改的人的学号:"); scanf("%ld",&num); p1=search1(num,a,head); revise(p1,head); printf("\n按回车键回到主菜单!"); getchar(); getchar(); break; case 6: printf("学号 姓名 性别 生日 备注\n"); print(head); printf("\n按回车键回到主菜单。"); getchar(); getchar(); break; case 7: printf("1.“学号”索引具有唯一标识.不允许重复.系统默认唯一重复时查询时优先显示,不警告!!!\n"); printf("2.创建n个同学的链表,当输入NUM为0时结束 !!!\n"); printf("3.“姓名”不能为0 !!!\n"); printf("4.“插入”“删除”“修改”时输入无效学号系统不予提示保留本次操作前建表内容!!!\n");//已修复!!! printf("5.未建表时不允许使用“删除”功能否则会引起奔溃!!!\n");//已修复!!! printf("6.请按提示正确操作!!!\n"); printf("\n按回车键回到主菜单!"); getchar(); getchar(); break; case 8: return 0;break; default: printf("你输入了非法字符!按回车键回到主菜单。"); } system("CLS"); menu1(); } }呵呵,学习c3个多月了,谢谢论坛里帮助过我的人,自己写的很吃力,但还是坚持写完了,大家帮忙看看,有什么问题帮忙指出来,格式,逻辑的都行哈!!一定虚心接受!
studentLDDNO2.zip
(3.01 KB)
[ 本帖最后由 清微御宇 于 2012-5-29 23:15 编辑 ]