C语言学生管理系统课程设计
2016-07-25 07:22
666 查看
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #define MAX_SIZE 100 //定义符号常量 struct student //学生信息结构体 { int ID; //自动序号 char studentNumber[MAX_SIZE]; //学号 char name[MAX_SIZE]; //姓名 char sex[MAX_SIZE]; //性别 int age; //年龄 char address[MAX_SIZE]; //地址 struct student * pre; //学生结构体指针,指向前节点指针 struct student * next; //学生结构体指针,指向后节点指针 }; void mainMenu(void); //mainMenu()函数原型,软件片头 void caoZuoTiShi1(void);//caoZuoTiShi()函数,软件的命令选择与功能描述 void caoZuoTiShi2(void); void commandSelect(void); //commandSelect()函数,实现各个功能 void delay(void); //延迟器 void delayTime(int n); //延迟时间与显示符号 struct student *creatDoubleLianBiao(void); //创建双向链表 void LianBiaoID(struct student *head); //为链表自动加上ID号 void printDoubleLianBiao(struct student *head); //显示链表 void saveToPc(struct student *head); //保存数据库到文件 struct student *readFromPc(void); //调入数据库文件到内存 struct student *shenQingOneNode(void); //创建一个节点 struct student *insertDoubleLast(struct student *head); //添加尾条 struct student *insertDoubleTop(struct student *head); //添加头条 int countNodeNum(struct student *head); //统计链表的节点数 struct student *searByIndex(struct student *head,int index);//按索引查找节点,索引从1开始 struct student *inseryBeforByIndex(struct student *head,int index);//匹配添加ID号前 struct student *inseryAfterByIndex(struct student *head,int index);//匹配添加ID号后 struct student *deleteTopNode(struct student *head);//删除头条 struct student *deleteLastNode(struct student *head);//删除尾条 struct student *deleteByIndex(struct student *head,int index);//匹配ID删除 struct student *deleteByID1ToID2(struct student *head,int index1,int index2);//匹配ID1至ID2删除 void changeNodeByID(struct student *head, int index);//匹配ID号修改记录 void printOneNode(struct student *oneNode);//显示一条记录 int selectOneOrZero(void); //选1或选0 void searchNodesByID(struct student *head);//ID查询 void searchNodesBySn(struct student *head);//学号查询 void searchNodesByName(struct student *head);//姓名查询 void searchNodesBySex(struct student *head);//性别查询 void searchNodesByAge(struct student *head);//年龄查询 void searchNodesByAddress(struct student *head);//地址查询 void backUpFromPc(void); //备份数据库 void jiaohuanNodeDat(struct student *p,struct student *q); //节点数据交换(不交换指针) void upsortsn(struct student *head); //排序,按学号升序 void dropsortsn(struct student *head); //排序,按学号降序 void upsortage(struct student *head); //排序,按年龄升序 void dropsortage(struct student *head); //排序,按年龄降序 void upsortsex(struct student *head); //排序,按性别 void upsortaddress(struct student *head); //排序,按地址 void upsortname(struct student *head); //排序,按姓名 int main() { mainMenu(); caoZuoTiShi1(); commandSelect(); return 0; } void mainMenu(void) //mainMenu()函数,软件片头 { printf("\n"); printf("\t\t***********************************\t\t\n"); printf("\t\t* 学 生 信 息 管 理 系 统 *\t\t\n"); printf("\t\t***********************************\t\t\n"); printf("\t\t* 作者: *\t\t\n"); printf("\t\t* 公司:balance of love *\t\t\n"); printf("\t\t* 日期:2015-6 *\t\t\n"); printf("\t\t***********************************\t\t\n"); printf("\n"); } void caoZuoTiShi1(void) //caoZuoTiShi()函数,操作提示,软件的命令与功能 { printf("\n"); printf("\t\t ~~~操 作 提 示~~~ \t\t\n"); printf("\t\t-----------------------------------\t\t\n"); printf("\t\t| 数字命令 | 功能描述 |\t\t\n"); printf("\t\t-----------------------------------\t\t\n"); printf("\t\t| -1 >>> 退出系统 |\t\t\n"); printf("\t\t| 0 >>> 显示命令 |\t\t\n"); printf("\t\t| 1 >>> 创建数据库 |\t\t\n"); printf("\t\t| 2 >>> 加载数据库 |\t\t\n"); printf("\t\t| 3 >>> 增加记录 |\t\t\n"); printf("\t\t| 4 >>> 删除记录 |\t\t\n"); printf("\t\t| 5 >>> 修改记录 |\t\t\n"); printf("\t\t| 6 >>> 查询记录 |\t\t\n"); printf("\t\t| 7 >>> 显示记录 |\t\t\n"); printf("\t\t| 8 >>> 排序记录 |\t\t\n"); printf("\t\t| 9 >>> 保存数据库 |\t\t\n"); printf("\t\t| 10 >>> 备份数据库 |\t\t\n"); printf("\t\t-----------------------------------\t\t\n"); printf("\n"); } void caoZuoTiShi2(void) { printf("\t\t-----------------------------------------------------------\t\n"); printf("\t|库 操 作| -1.退出,0.命令,1.创建,2.加载,9.保存,10.另存 |\t\n"); printf("\t|记录操作| 3. 增加,4.删除,5.修改,6.查询,7.显示,8. 排序 |\t\n"); printf("\t\t-----------------------------------------------------------\t\n"); } void commandSelect(void) //commandSelect()函数,实现各个功能 { int number,number3,number4,number6,number8; int flag3=1,flag4=1,flag6=1,flag8=1; int id,id1,id2; struct student *DoubleLianBiaoTou=NULL; printf("\n输入数字命令[0:调出数字命令菜单]->"); scanf("%d",&number); while (1) { switch(number) { case 0: { printf("\n~显示命令菜单~\n"); caoZuoTiShi2(); break; } case 1: { printf("\n~创建数据库~\n"); DoubleLianBiaoTou=creatDoubleLianBiao(); break; } case 2: { printf("\n~加载数据库~\n"); DoubleLianBiaoTou=readFromPc(); break; } case 3: { flag3=1; if (NULL==DoubleLianBiaoTou) { printf("\n"); printf("数据库不存在\n"); printf("@请先创建数据库或加载数据库@\n"); break; } printf("\n~添加记录~\n"); printf("\n选择添加记录模式:\n"); printf("30:退出,31:添加头条,32:添加尾条,33:匹配添加ID号前,34:匹配添加ID号后,37:显示记录\n"); scanf("%d",&number3); while (1==flag3) { switch(number3) { case 31: { printf("\n"); printf("~添加头条~\n"); DoubleLianBiaoTou=insertDoubleTop(DoubleLianBiaoTou); break; } case 32: { printf("\n"); printf("~添加尾条~\n"); DoubleLianBiaoTou=insertDoubleLast(DoubleLianBiaoTou); break; } case 33: { printf("\n"); printf("~匹配添加ID号前~\n"); printf("\n"); printf("输入ID号->"); scanf("%d",&id); DoubleLianBiaoTou=inseryBeforByIndex(DoubleLianBiaoTou,id); break; } case 34: { printf("\n"); printf("~匹配添加ID号后~\n"); printf("\n"); printf("输入ID号->"); scanf("%d",&id); DoubleLianBiaoTou=inseryAfterByIndex(DoubleLianBiaoTou,id); break; } case 37: { printDoubleLianBiao(DoubleLianBiaoTou); break; } case 30: { printf("\n"); printf("~退出添加记录,返回主菜单~\n"); caoZuoTiShi1(); flag3=0; break; } default: { printf("无效命令,请重新选择\n"); break; } } if (1==flag3) { printf("\n选择添加记录模式:\n"); printf("30:退出,31:添加头条,32:添加尾条,33:匹配添加ID号前,34:匹配添加ID号后,37:显示记录\n"); scanf("%d",&number3); } } break; } case 4: { flag4=1; if (NULL==DoubleLianBiaoTou) { printf("\n"); printf("数据库不存在\n"); printf("@请先创建数据库或加载数据库@\n"); break; } printf("\n~删除记录~\n"); printf("\n选择删除记录模式:\n"); printf("40:退出,41:删除头条,42:删除尾条,43:匹配ID删除,44:匹配ID1至ID2删除,47:显示记录\n"); scanf("%d",&number4); while (1==flag4) { switch(number4) { case 41: { printf("\n"); printf("~删除头条~\n"); if (NULL!=DoubleLianBiaoTou) { DoubleLianBiaoTou=deleteTopNode(DoubleLianBiaoTou); } else { printf("@数据库已删空@\n"); break; } break; } case 42: { printf("\n"); printf("~删除尾条~\n"); if (NULL!=DoubleLianBiaoTou) { DoubleLianBiaoTou=deleteLastNode(DoubleLianBiaoTou); } else { printf("@数据库已删空@\n"); break; } break; } case 43: { printf("\n"); printf("~匹配ID删除~\n"); printf("\n"); printf("输入ID号->"); scanf("%d",&id); if (NULL!=DoubleLianBiaoTou) { DoubleLianBiaoTou=deleteByIndex(DoubleLianBiaoTou,id); } else { printf("@数据库已删空@\n"); break; } break; } case 44: { printf("\n"); printf("~匹配ID1至ID2删除~\n"); printf("\n"); printf("输入ID1号->"); scanf("%d",&id1); printf("输入ID2号->"); scanf("%d",&id2); if (NULL!=DoubleLianBiaoTou) { DoubleLianBiaoTou=deleteByID1ToID2(DoubleLianBiaoTou,id1,id2); } else { printf("@数据库已删空@\n"); break; } break; } case 47: { printDoubleLianBiao(DoubleLianBiaoTou); break; } case 40: { printf("\n"); printf("~退出删除记录,返回主菜单~\n"); caoZuoTiShi1(); flag4=0; break; } default: { printf("无效命令,请重新选择\n"); break; } } if (1==flag4) { printf("\n选择删除记录模式:\n"); printf("40:退出,41:删除头条,42:删除尾条,43:匹配ID删除,44:匹配ID1至ID2删除,47:显示记录\n"); scanf("%d",&number4); } } break; } case 5: { if (NULL==DoubleLianBiaoTou) { printf("\n"); printf("数据库不存在\n"); printf("@请先创建数据库或加载数据库@\n"); break; } printf("\n"); printf("~修改记录~\n"); printf("~~匹配ID修改记录~~\n"); printf("\n"); printf("输入ID号->"); scanf("%d",&id); printf("\n"); changeNodeByID(DoubleLianBiaoTou,id); break; } case 6: { flag6=1; if (NULL==DoubleLianBiaoTou) { printf("\n"); printf("数据库不存在\n"); printf("@请先创建数据库或加载数据库@\n"); break; } printf("\n~查询记录~\n"); printf("\n选择查询记录模式:\n"); printf("60:退出,61:ID查询,62:学号查询,63:姓名查询,"); printf("64:性别查询,65:年龄查询,66:地址查询\n"); scanf("%d",&number6); while (1==flag6) { switch(number6) { case 61: { printf("\n"); printf("~ID查询~\n"); printf("\n"); searchNodesByID(DoubleLianBiaoTou); break; } case 62: { printf("\n"); printf("~学号查询~\n"); printf("\n"); searchNodesBySn(DoubleLianBiaoTou); break; } case 63: { printf("\n"); printf("~姓名查询~\n"); printf("\n"); searchNodesByName(DoubleLianBiaoTou); break; } case 64: { printf("\n"); printf("~性别查询~\n"); printf("\n"); searchNodesBySex(DoubleLianBiaoTou); break; } case 65: { printf("\n"); printf("~年龄查询~\n"); printf("\n"); searchNodesByAge(DoubleLianBiaoTou); break; } case 66: { printf("\n"); printf("~地址查询~\n"); printf("\n"); searchNodesByAddress(DoubleLianBiaoTou); break; } case 60: { printf("\n"); printf("~退出查询记录,返回主菜单~\n"); caoZuoTiShi1(); flag6=0; break; } default: { printf("无效命令,请重新选择\n"); break; } } if (1==flag6) { printf("\n选择查询记录模式:\n"); printf("60:退出,61:ID查询,62:学号查询,63:姓名查询,"); printf("64:性别查询,65:年龄查询,66:地址查询\n"); scanf("%d",&number6); } } break; } case 7: { printf("\n~显示记录~\n"); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 8: { flag8=1; if (NULL==DoubleLianBiaoTou) { printf("\n"); printf("数据库不存在\n"); printf("@请先创建数据库或加载数据库@\n"); break; } printf("\n~排序记录~\n"); printf("\n选择排序记录模式:\n"); printf("80:退出,81:学号升序,82:学号降序,83:年龄升序,84:年龄降序\n"); printf(" 85:姓名排序,86:性别排序,87:地址排序\n"); scanf("%d",&number8); while (1==flag8) { switch(number8) { case 81: { printf("\n"); printf("~学号升序~\n"); printf("\n"); upsortsn(DoubleLianBiaoTou); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 82: { printf("\n"); printf("~学号降序~\n"); printf("\n"); dropsortsn(DoubleLianBiaoTou); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 83: { printf("\n"); printf("~年龄升序~\n"); printf("\n"); upsortage(DoubleLianBiaoTou); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 84: { printf("\n"); printf("~年龄降序~\n"); printf("\n"); dropsortage(DoubleLianBiaoTou); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 85: { printf("\n"); printf("~姓名排序~\n"); printf("\n"); upsortname(DoubleLianBiaoTou); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 86: { printf("\n"); printf("~性别排序~\n"); printf("\n"); upsortsex(DoubleLianBiaoTou); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 87: { printf("\n"); printf("~地址排序~\n"); printf("\n"); upsortaddress(DoubleLianBiaoTou); printDoubleLianBiao(DoubleLianBiaoTou); break; } case 80: { printf("\n"); printf("~退出排序记录,返回主菜单~\n"); caoZuoTiShi1(); flag8=0; break; } default: { printf("无效命令,请重新选择\n"); break; } } if (1==flag8) { printf("\n选择排序记录模式:\n"); printf("80:退出,81:学号升序,82:学号降序,83:年龄升序,84:年龄降序\n"); printf(" 85:姓名排序,86:性别排序,87:地址排序\n"); scanf("%d",&number8); } } break; } case 9: { printf("\n~保存数据库~\n"); saveToPc(DoubleLianBiaoTou); break; } case 10: { printf("\n~备份数据库~\n"); backUpFromPc(); break; } case -1: { printf("\a"); //报警声,蜂鸣器,一声 printf("欢迎再次使用本系统"); delayTime(8); //延迟6个延迟时段 exit(0); //exit(0)正常退出,exit(-1)不正常退出 } default: { printf("\a\a\a"); //报警声,三声 printf("无效命令,请重新选择\n"); break; } } printf("\n输入数字命令[0:调出数字命令菜单]->"); scanf("%d",&number); } } void upsortage(struct student *head) //排序,按年龄升序 { struct student *p; struct student *q; for (p=head; p!=NULL; p=p->next) { for (q=p->next; q!=NULL; q=q->next) { if (p->age>q->age) { jiaohuanNodeDat(p,q); } } } return ; } void dropsortage(struct student *head) //排序,按年龄降序 { struct student *p; struct student *q; for (p=head; p!=NULL; p=p->next) { for (q=p->next; q!=NULL; q=q->next) { if (p->age<q->age) { jiaohuanNodeDat(p,q); } } } return ; } void dropsortsn(struct student *head) //排序,按学号降序 { struct student *p; struct student *q; for (p=head; p!=NULL; p=p->next) { for (q=p->next; q!=NULL; q=q->next) { if (strcmp(p->studentNumber,q->studentNumber)<0) { jiaohuanNodeDat(p,q); } } } return ; } void upsortaddress(struct student *head) //排序,按地址 { struct student *p; struct student *q; for (p=head; p!=NULL; p=p->next) { for (q=p->next; q!=NULL; q=q->next) { if (strcmp(p->address,q->address)>0) { jiaohuanNodeDat(p,q); } } } return ; } void upsortsex(struct student *head) //排序,按性别 { struct student *p; struct student *q; for (p=head; p!=NULL; p=p->next) { for (q=p->next; q!=NULL; q=q->next) { if (strcmp(p->sex,q->sex)>0) { jiaohuanNodeDat(p,q); } } } return ; } void upsortname(struct student *head) //排序,按姓名 { struct student *p; struct student *q; for (p=head; p!=NULL; p=p->next) { for (q=p->next; q!=NULL; q=q->next) { if (strcmp(p->name,q->name)>0) { jiaohuanNodeDat(p,q); } } } return ; } void upsortsn(struct student *head) //排序,按学号升序 { struct student *p; struct student *q; for (p=head; p!=NULL; p=p->next) { for (q=p->next; q!=NULL; q=q->next) { if (strcmp(p->studentNumber,q->studentNumber)>0) { jiaohuanNodeDat(p,q); } } } return ; } void jiaohuanNodeDat(struct student *p,struct student *q) //节点数据交换(不交换指针) { char sn[MAX_SIZE],name[MAX_SIZE],sex[MAX_SIZE],address[MAX_SIZE]; int age; strcpy(sn,p->studentNumber); strcpy(p->studentNumber,q->studentNumber); strcpy(q->studentNumber,sn); strcpy(name,p->name); strcpy(p->name,q->name); strcpy(q->name,name); strcpy(sex,p->sex); strcpy(p->sex,q->sex); strcpy(q->sex,sex); strcpy(address,p->address); strcpy(p->address,q->address); strcpy(q->address,address); age=p->age; p->age=q->age; q->age=age; return ; } void searchNodesByAddress(struct student *head)//地址查询 { struct student *p=NULL; int i=0; char address[MAX_SIZE]; p=head; if (NULL==p) { return; } printf("输入地址->"); scanf("%s",address); printf("\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); while (NULL!=p) { if (NULL!=strstr(p->address,address)) { i++; printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address); } p=p->next; } printf("----------------------------------------------------------------------\n"); printf("\t\t\t共有 %d 条记录\n",i); printf("\n"); return; } void searchNodesByAge(struct student *head)//年龄查询 { struct student *p=NULL; int i=0; int age; p=head; if (NULL==p) { return; } printf("输入年龄->"); scanf("%d",&age); printf("\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); while (NULL!=p) { if (p->age==age) { i++; printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address); } p=p->next; } printf("----------------------------------------------------------------------\n"); printf("\t\t\t共有 %d 条记录\n",i); printf("\n"); return; } void searchNodesBySex(struct student *head)//性别查询 { struct student *p=NULL; char sex[MAX_SIZE]; int i=0; int sexnum; p=head; if (NULL==p) { return; } printf("输入性别->"); printf("1:男,2:女\n"); scanf("%d",&sexnum); while(!(1==sexnum||2==sexnum)) { printf("选择无效,请再次选择\n"); printf("性别->"); printf("1:男,2:女\n"); scanf("%d",&sexnum); } if(1==sexnum) { strcpy(sex,"男"); } else { strcpy(sex,"女"); } printf("\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); while (NULL!=p) { if (NULL!=strstr(p->sex,sex)) { i++; printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address); } p=p->next; } printf("----------------------------------------------------------------------\n"); printf("\t\t\t共有 %d 条记录\n",i); printf("\n"); return; } void searchNodesByName(struct student *head)//姓名查询 { struct student *p=NULL; int i=0; char name[MAX_SIZE]; p=head; if (NULL==p) { return; } printf("输入姓名->"); scanf("%s",name); printf("\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); while (NULL!=p) { if (NULL!=strstr(p->name,name)) { i++; printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address); } p=p->next; } printf("----------------------------------------------------------------------\n"); printf("\t\t\t共有 %d 条记录\n",i); printf("\n"); return; } void searchNodesBySn(struct student *head)//学号查询 { struct student *p=NULL; int i=0; char sn[MAX_SIZE]; p=head; if (NULL==p) { return; } printf("输入学号->"); scanf("%s",sn); printf("\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); while (NULL!=p) { if (NULL!=strstr(p->studentNumber,sn)) { i++; printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address); } p=p->next; } printf("----------------------------------------------------------------------\n"); printf("\t\t\t共有 %d 条记录\n",i); printf("\n"); return; } void searchNodesByID(struct student *head)//ID查询 { struct student *p=NULL; int i=0; int index; p=head; if (NULL==p) { return; } printf("输入ID->"); scanf("%d",&index); printf("\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); while (NULL!=p) { if (p->ID==index) { i++; printf("%-8d%-16s%-8s%-8s%-8d%s\n",i,p->studentNumber,p->name,p->sex,p->age,p->address); } p=p->next; } printf("----------------------------------------------------------------------\n"); printf("\t\t\t共有 %d 条记录\n",i); printf("\n"); return; } void changeNodeByID(struct student *head, int index)//匹配ID号修改记录 { struct student *p=NULL; int sexnum; p=searByIndex(head,index); if (NULL==p) { return ; } else { printOneNode(p); printf("请输入新的对应信息:\n\n"); printf("修改学号?"); if(1==selectOneOrZero()) { printf("学号->"); scanf("%s",p->studentNumber); } printf("修改姓名?"); if(1==selectOneOrZero()) { printf("姓名->"); scanf("%s",p->name); } printf("修改性别?"); if(1==selectOneOrZero()) { printf("性别->"); printf("1:男,2:女\n"); scanf("%d",&sexnum); while(!(1==sexnum||2==sexnum)) { printf("选择无效,请再次选择\n"); printf("性别->"); printf("1:男,2:女\n"); scanf("%d",&sexnum); } if(1==sexnum) { strcpy(p->sex,"男"); } else { strcpy(p->sex,"女"); } } printf("修改年龄?"); if(1==selectOneOrZero()) { printf("年龄->"); scanf("%d",&(p->age)); } printf("修改地址?"); if(1==selectOneOrZero()) { printf("地址->"); scanf("%s",p->address); } printf("\n"); printOneNode(p); printf("^-^修改成功^-^\n"); } } int selectOneOrZero(void) //选1或选0 { int sexnum; printf("\n0:略过,1:修改->"); scanf("%d",&sexnum); while(!(1==sexnum||0==sexnum)) { printf("选择无效,请再次选择\n"); printf("0:略过,1:修改->"); scanf("%d",&sexnum); } return sexnum; } void printOneNode(struct student *oneNode)//显示一条记录 { struct student *p=NULL; p=oneNode; if (NULL==p) { return; } printf("\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); printf("%-8d%-16s%-8s%-8s%-8d%s\n",p->ID,p->studentNumber,p->name,p->sex,p->age,p->address); printf("----------------------------------------------------------------------\n"); printf("\n"); return; } struct student *deleteByID1ToID2(struct student *head,int index1,int index2)//匹配ID1至ID2删除 { struct student *p1=NULL; struct student *p2=NULL; struct student *p=NULL; p1=searByIndex(head,index1); p2=searByIndex(head,index2); if (NULL==p1) { free(p1); free(p2); free(p); printf("ID %d 超标\n",index1); return head; } if (NULL==p2) { free(p1); free(p2); free(p); printf("ID %d 超标\n",index2); return head; } if (index1>index2) { p=p1; p1=p2; p2=p; } if (NULL==(p1->pre)&&NULL==(p2->next)) { free(p1); free(p2); free(p); printf("数据库全部删除!!!\n"); return NULL; } if (NULL==(p1->pre)&&NULL!=(p2->next)) { head=p2->next; (p2->next)->pre=NULL; free(p1); free(p2); free(p); LianBiaoID(head); return head; } if (NULL!=(p1->pre)&&NULL==(p2->next)) { (p1->pre)->next=NULL; free(p1); free(p2); free(p); LianBiaoID(head); return head; } (p1->pre)->next=p2->next; (p2->next)->pre=p1->pre; free(p1); free(p2); free(p); LianBiaoID(head); return head; } struct student *deleteByIndex(struct student *head,int index)//匹配ID删除 { struct student *p=NULL; p=searByIndex(head,index); if (NULL==p) { return head; } if (p->pre==NULL) { head=deleteTopNode(head); LianBiaoID(head); return head; } if (p->next==NULL) { head=deleteLastNode(head); LianBiaoID(head); return head; } (p->pre)->next=p->next; (p->next)->pre=p->pre; free(p); LianBiaoID(head); return head; } struct student *deleteLastNode(struct student *head)//删除尾条 { struct student *p=NULL; p=head; if (head->next==NULL) { printf("数据库已删空\n"); free(head); return NULL; } while (p->next!=NULL) { p=p->next; } (p->pre)->next=NULL; free(p); LianBiaoID(head); return head; } struct student *deleteTopNode(struct student *head)//删除头条 { struct student *p=NULL; p=head; if (head->next==NULL) { printf("@数据库已删空@\n"); free(head); return NULL; } head=p->next; (p->next)->pre=NULL; free(p); LianBiaoID(head); return head; } struct student *inseryAfterByIndex(struct student *head,int index)//匹配添加ID号后 { struct student *p=NULL; struct student *m=NULL; p=searByIndex(head,index); if (NULL==p) return head; m=shenQingOneNode(); if (p->next != NULL) { m->next=p->next; p->next=m; m->pre=p; (m->next)->pre=m; LianBiaoID(head); return head; } else { p->next=m; m->pre=p; LianBiaoID(head); return head; } } struct student *inseryBeforByIndex(struct student *head,int index)//匹配添加ID号前 { struct student *p=NULL; struct student *q=NULL; struct student *m=NULL; p=searByIndex(head,index); if (NULL==p) return head; m=shenQingOneNode(); if (head==p) { m->next=head; head->pre=m; head=m; LianBiaoID(head); return head; } else { q=p->pre; m->next=p; q->next=m; p->pre=m; m->pre=q; LianBiaoID(head); return head; } } struct student *searByIndex(struct student *head,int index)//按索引查找节点,索引从1开始 { int count=countNodeNum(head); int i=1; struct student *p=NULL; if (index>count||index<=0) { printf("@索引超标@\n"); return NULL; } p=head; while (i<index) { p=p->next; i++; } return p; } int countNodeNum(struct student *head) //统计链表的节点数 { struct student *p=NULL; int count=0; p=head; if (NULL==p) return count; while (p!=NULL) { count++; p=p->next; } return count; } struct student *insertDoubleTop(struct student *head) //添加头条,插入首记录 { struct student *p=NULL; p=shenQingOneNode(); p->next=head; head->pre=p; head=p; LianBiaoID(head); return head; } struct student *insertDoubleLast(struct student *head) //添加尾条,插入尾记录 { struct student *q=NULL; struct student *p=NULL; q=head; p=shenQingOneNode(); printf("\n"); while (q->next!=NULL) { q=q->next; } q->next=p; p->pre=q; LianBiaoID(head); return head; } struct student *readFromPc(void) //从文件调入数据库到内存 { FILE *sourceFile=NULL; char source[MAX_SIZE]; struct student *head=NULL; struct student *p=NULL; struct student *tail=NULL; int flag=1; int panduan; printf("\n"); printf("输入调入的数据库路径及文件名【形如:d:/hqg/huqig1.dat】->"); scanf("%s",source); sourceFile=fopen(source,"r"); while (NULL==sourceFile) { printf("打开文件 %s 失败,请重新输入->",source); scanf("%s",source); sourceFile=fopen(source,"r"); } p=(struct student *)malloc(sizeof(struct student)); if (NULL==p) { printf("申请内存空间失败!!!\n"); exit(-1); //exzit(0); } panduan=fscanf(sourceFile,"%d",&(p->ID)); if (1==panduan) { fscanf(sourceFile,"%s",p->studentNumber); fscanf(sourceFile,"%s",p->name); fscanf(sourceFile,"%s",p->sex); fscanf(sourceFile,"%d",&(p->age)); fscanf(sourceFile,"%s",p->address); p->pre=NULL; p->next=NULL; } head=p; tail=p; while (1==flag) { p=(struct student *)malloc(sizeof(struct student)); if (NULL==p) { printf("申请内存空间失败!!!\n"); exit(-1); //exzit(0); } panduan=fscanf(sourceFile,"%d",&(p->ID)); if (1==panduan) { fscanf(sourceFile,"%s",p->studentNumber); fscanf(sourceFile,"%s",p->name); fscanf(sourceFile,"%s",p->sex); fscanf(sourceFile,"%d",&(p->age)); fscanf(sourceFile,"%s",p->address); p->pre=NULL; p->next=NULL; tail->next=p; p->pre=tail; tail=p; } else { flag=0; } } printf("数据库文件加载成功...\n"); fclose(sourceFile); return head; } void backUpFromPc(void) //备份数据库 { FILE * sourceFile=NULL, * endFile=NULL; char source[MAX_SIZE],end[MAX_SIZE]; char ch; int i=1,j=1; printf("\n"); printf("请输入源文件名【包含路径与文件名】->"); scanf("%s",source); sourceFile=fopen(source,"r"); while (sourceFile==NULL) { if (3==i) { printf("\n备份数据库失败!!!\n"); exit(-1); } printf("打开文件失败v_v\n"); printf("请重新输入->"); scanf("%s",source); sourceFile=fopen(source,"r"); i++; } printf("请输入目标文件名【包含路径与文件名】->"); scanf("%s",end); endFile=fopen(end,"w"); while (endFile==NULL) { if (3==j) { printf("\n备份数据库失败!!!\n"); exit(-1); } printf("打开文件失败v_v\n"); printf("请重新输入->"); scanf("%s",end); endFile=fopen(end,"w"); j++; } for ( ch=fgetc(sourceFile); ch != EOF; ch=fgetc(sourceFile) ) { fputc(ch,endFile); } fclose(sourceFile); fclose(endFile); printf("文件备份成功^_^,从 %s 到 %s \n",source,end); } void saveToPc(struct student *head) //输出链表内容到文件 { struct student * p=NULL; FILE * outFilePointer=NULL; //文件指针 char outName[MAX_SIZE]; //保存文件名 int i=1; if (head==NULL) { printf("\n~数据不存在,不能保存~\n"); return; } printf("输入保存的路径及文件名【形如:d:/hqg/huqig1.dat】->"); scanf("%s",outName); outFilePointer=fopen(outName,"w"); // w 'w' "w" while (NULL==outFilePointer) //while (outFilePointer=NULL) while (NULL=outFilePointer) { if (3==i) { printf("\n保存数据库失败!!!\n"); exit(-1); } printf("保存 %s 文件失败,请重新输入->",outName); scanf("%s",outName); outFilePointer=fopen(outName,"w"); i++; } p=head; while (p!=NULL) { fprintf(outFilePointer,"%-8d%-16s%-8s%-8s%-8d%s\n",p->ID,p->studentNumber,p->name,p->sex,p->age,p->address); p=p->next; } fprintf(outFilePointer,"END!!!\n"); fclose(outFilePointer); //关闭文件 printf("文件保存成功^_^\n"); } void delay(void) //延迟器 { int n=200000000; while (n>0) n--; return; } void delayTime(int n) // { int i; for (i=0; i<n; i++) { delay(); printf("."); } return; } struct student *shenQingOneNode(void) // 创建一个节点 { struct student *p=NULL; int sexnum; p=(struct student *)malloc(sizeof(struct student)); if (NULL==p) { printf("创建节点失败\n"); exit(-1); } printf("\n"); printf("输入节点的内容:\n"); printf("学号->"); scanf("%s",p->studentNumber); printf("姓名->"); scanf("%s",p->name); printf("性别->"); printf("1:男,2:女\n"); scanf("%d",&sexnum); while(!(1==sexnum||2==sexnum)) { printf("选择无效,请再次选择\n"); printf("性别->"); printf("1:男,2:女\n"); scanf("%d",&sexnum); } if(1==sexnum) { strcpy(p->sex,"男"); } else { strcpy(p->sex,"女"); } printf("年龄->"); scanf("%d",&(p->age)); printf("地址->"); scanf("%s",p->address); p->pre=NULL; p->next=NULL; return p; } struct student *creatDoubleLianBiao(void) //创建双向链表 { struct student *head=NULL; struct student *tail=NULL; struct student *p=NULL; int i; p=shenQingOneNode(); head=p; tail=p; printf("1:继续创建, 2:退出创建\n"); scanf("%d",&i); while(!(1==i||2==i)) { printf("选择无效,请再次选择\n"); printf("1:继续创建, 2:退出创建\n"); scanf("%d",&i); } while (1==i) { p=shenQingOneNode(); tail->next=p; p->pre=tail; tail=p; printf("1:继续创建, 2:退出创建\n"); scanf("%d",&i); while(!(1==i||2==i)) { printf("选择无效,请再次选择\n"); printf("1:继续创建, 2:退出创建\n"); scanf("%d",&i); } if (2==i) break; } LianBiaoID(head); return head; } void LianBiaoID(struct student *head) //为链表自动加上ID号 { struct student *p=NULL; int ID=0; p=head; if (NULL==p) return; while (p!=NULL) { ID++; p->ID=ID; p=p->next; } return ; } void printDoubleLianBiao(struct student *head) //显示链表 { struct student *p=NULL; int i=0; p=head; if (NULL==p) { printf("\n链表不存在\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); return; } printf("\n"); printf("\t\t\t档 案 信 息 表\n"); printf("----------------------------------------------------------------------\n"); printf("ID\t学号\t\t姓名\t性别\t年龄\t地址\n"); printf("----------------------------------------------------------------------\n"); while (p!=NULL) { printf("%-8d%-16s%-8s%-8s%-8d%s\n",p->ID,p->studentNumber,p->name,p->sex,p->age,p->address); p=p->next; i++; } printf("----------------------------------------------------------------------\n"); printf("\n"); printf("\t\t\t共有 %d 条记录\n",i); printf("\n"); return; }
功能模块图
流程图
相关文章推荐
- 如何成为一个牛逼的C/C++程序员?
- 20160724-leetcode-string
- 简单的顺序表c语言实现
- c语言实现简单链表
- 李洪强漫谈iOS开发[C语言-021]-运算符
- C++ Union
- 一起talk C栗子吧(第一百七十七回:C语言实例--字符及字符串输入函数二)
- boost::function与回调函数
- 浅析C++const
- C语言课程设计——学生信息管理系统(BUG挺多,敬请指正)
- C语言排序算法
- C语言排序算法
- 20160724-leetcode-array
- 20160724-leetcode-array
- hdu 3699 fzu 2009 A hard Aoshu Problem 枚举 模拟
- 【华为机试】题目+解答+自己不足+提升
- c++ memset 、memcpy、strcpy、strlen、strcat、ASCII 问题
- c语言第一天 终端的使用 .c .o .out 文件的解释 快捷键等
- Leetcode 18. 4Sum (Medium) (cpp)
- 【每日算法】C语言8大经典排序算法(2)