您的位置:首页 > 编程语言 > C语言/C++

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;
}

功能模块图



流程图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: