有头头指针双向链.docx
《有头头指针双向链.docx》由会员分享,可在线阅读,更多相关《有头头指针双向链.docx(57页珍藏版)》请在冰豆网上搜索。
![有头头指针双向链.docx](https://file1.bdocx.com/fileroot1/2023-2/5/d38fcdb7-4e6f-42da-b3be-1b9eba56662b/d38fcdb7-4e6f-42da-b3be-1b9eba56662b1.gif)
有头头指针双向链
有头结点的双向链表(只有头指针)
/*说明:
不同类型的结构在定义和存盘及装载时算法不同*/
#include
#include
#include
/*结构定义*/
typedefstructnode
{
charnumb[15];/*编号*/
charname[15];/*姓名*/
intage;/*年龄*/
charsex[2];/*性别*/
floatywcj;/*语文成绩*/
floatsxcj;/*数学成绩*/
floatyycj;/*英语成绩*/
floatzcj;/*总成绩*/
structnode*next;/*结构指针*/
structnode*pre;
}LNode,*Link;
/*变量定义*/
LNode*head,*p;
charchs,ch,sname[15];
/*函数说明*/
intmenu_select();/*主程序选择菜单*/
intmenu_delselect();/*删除选择菜单*/
intmenu_inselect();/*插入选择菜单*/
intmenu_findselect();/*查找选择菜单*/
voidmenu_prog();/*主程序执行菜单*/
voidmenu_delprog();/*删除执行菜单*/
voidmenu_inprog();/*插入执行菜单*/
voidmenu_findprog();/*查找执行菜单*/
voidplaypasword(char*s);/*密码采用*号表示*/
voidsetpasword();/*建立密码*/
voidmadpasword();/*修改密码*/
voidsave();/*保存文件*/
voidload();/*装载文件*/
LNode*inilink(LNode*head);/*初始化*/
voidsetlink(LNode*head);/*建立链表*/
voidprintlink(LNode*head);/*输出链表*/
voidprintlinks(LNode*head);/*逆向输出链表*/
voiddistroylink(LNode*head);/*消链表*/
voidinsert(LNode*head);/*插入尾部数据*/
voidinserts(LNode*head);/*插入任意位置数据*/
voiddelnumb(LNode*head);/*删除编号*/
voiddelname(LNode*head);/*删除姓名*/
LNode*findnumb(LNode*head);/*查找编号*/
LNode*findname(charstrname[],LNode*p);/*查找姓名*/
voidsortdata(LNode*head);/*数据排序*/
voidmadedata(LNode*head);/*修改数据*/
voidsortsdata(LNode*head);/*数据统计*/
intflagint(charstrnum[]);/*判字串中是否均为数字*/
intflagints(charstrnum[]);/*判字串中是否为数字或小数点*/
main()
{/*主程序*/
FILE*fp;
charcha[20],chb[20];
inti=0;
fp=fopen("pasword.exe","rb");
if(fp==NULL)setpasword();
elsefclose(fp);
head=NULL;/*头指针初值为空*/
clrscr();/*清屏*/
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("*数据结构课程设计实例*\n");
printf("**\n");
printf("*学生成绩管理系统*\n");
printf("*(有头双链表)*\n");
printf("**\n");
printf("*作者:
孙俊杰*\n");
printf("**\n");
printf("*2008年1月1日*\n");
printf("**\n");
printf("*初始密码:
1234*\n");
printf("**\n");
printf("*数据库名:
ee.dat*\n");
printf("**\n");
printf("************************************\n");
printf("\n");
printf("\n");
fp=fopen("pasword.exe","rb");
fgets(cha,81,fp);
printf("请输入密码:
");
playpasword(chb);
while(strcmp(cha,chb)<0||strcmp(cha,chb)>0)
{
i++;
if(i==3)
{
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("*密码错误无权使用!
!
!
*\n");
printf("**\n");
printf("*谢谢*\n");
printf("**\n");
printf("**\n");
printf("*如想使用本软件请与作者联系*\n");
printf("**\n");
printf("*2007年1月1日*\n");
printf("**\n");
printf("************************************\n");
printf("\n");
printf("\n");
scanf("%*c");
exit(0);
}
printf("密码错误!
!
!
\n");
printf("请输入密码:
");
playpasword(chb);
}
menu_prog();
}
voidmenu_prog()
{/*选项菜单执行系统*/
for(;;)
{
switch(menu_select())
{
case1:
if(head!
=NULL)
{
printf("\n系统中已经存在数据库!
不能新建立数据库!
!
!
");
printf("\n请退出系统后重新操作!
!
!
");
printf("\n");
printf("按任意键继续.........");
getch();
break;
}
else{
head=inilink(head);/*初始化链表算法*/
setlink(head);/*建立链表算法*/
if(head!
=NULL&&head->next!
=NULL)printlink(head);/*输出链表
算法*/
elseif(head->next==NULL)
{
free(head);head=NULL;
}
printf("\n");
printf("按任意键继续.........");
getch();
break;
}
case2:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
printlink(head);/*显示数据算法*/
printlinks(head);/*逆向输出链表*/
printf("\n");
}
printf("按任意键继续.........");
getch();
break;
case3:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
menu_delprog();/*调用删除窗口*/
}
printf("按任意键继续.........");
getch();
break;
case4:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
menu_inprog();/*调用插入窗口*/
}
printf("按任意键继续.........");
getch();
break;
case5:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
menu_findprog();/*调用查找窗口*/
}
printf("按任意键继续.........");
getch();
break;
case6:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
madedata(head);/*修改算法*/
}
printf("按任意键继续.........");
getch();
break;
case7:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
sortdata(head);/*排序算法*/
}
printf("按任意键继续.........");
getch();
break;
case8:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
sortsdata(head);/*统计算法*/
}
printf("按任意键继续.........");
getch();
break;
case9:
madpasword();/*修改密码*/
printf("按任意键继续.........");
getch();
break;
case10:
save();/*将程序中数据保存到磁盘文件中*/
printf("按任意键继续.........");
getch();
break;
case11:
if(head!
=NULL)
{
printf("\n系统中已经存在数据库!
不能打开新数据库!
!
!
");
printf("\n请退出系统后重新操作!
!
!
");
printf("\n");
printf("按任意键继续.........");
getch();
break;
}
else{
load();/*将磁盘文件内容装载到内存中*/
printf("按任意键继续.........");
getch();
break;
}
case12:
if(head!
=NULL)
{
printf("\n是否保存内存中的数据?
(y/n):
");
scanf("%c%*c",&ch);
if(ch=='y')save();/*将程序中数据保存到磁盘文件中*/
distroylink(head);
}
exit(0);
}
}
}
voidmenu_delprog()
{/*删除菜单执行系统*/
inti;
for(;;)
{
i=menu_delselect();
switch(i)
{
case1:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
delnumb(head);/*删除编号算法*/
}
printf("按任意键继续.........");
getch();
break;
case2:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
delname(head);/*删除姓名算法*/
}
printf("按任意键继续.........");
getch();
break;
case3:
break;
}
if(i==3)break;
}
}
voidmenu_inprog()
{/*插入菜单执行系统*/
inti;
for(;;)
{
i=menu_inselect();
switch(i)
{
case1:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
insert(head);/*插入尾部数据算法*/
}
printf("按任意键继续.........");
getch();
break;
case2:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{
inserts(head);/*插入任意位置数据算法*/
}
printf("按任意键继续.........");
getch();
break;
case3:
break;
}
if(i==3)break;
}
}
voidmenu_findprog()
{/*查找菜单执行系统*/
inti;
for(;;)
{
i=menu_findselect();
switch(i)
{
case1:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{/*编号查找算法*/
ch='y';
while(ch=='y')
{
p=findnumb(head);
if(p!
=NULL)
{
printf("编号姓名年龄性别语文成绩数
学成绩英语成绩总成绩\n");
printf("%s%8s%6d%6s%11.2f%11.2f%11.2f%11.2f\n",p-
>numb,p->name,p->age,p->sex,p->ywcj,p->sxcj,p->yycj,p->zcj);
}
elseprintf("数据库中无此编号的数据!
!
!
");
printf("\n是否重新查找另一个编号的记录?
(y/n):
");
scanf("%c%*c",&ch);
}
}
printf("按任意键继续.........");
getch();
break;
case2:
if(head==NULL)printf("请先建立链表后再进行操作!
");
else{/*姓名查找算法*/
printlink(head);
chs='y';ch='y';
while(chs=='y')
{
printf("请输入要查找记录的姓名:
");
gets(sname);
p=head->next;
while(ch=='y')
{
p=findname(sname,p);
if(p!
=NULL)
{
printf("编号姓名年龄性别语文成绩
数学成绩英语成绩总成绩\n");
printf("%s%8s%6d%6s%11.2f%11.2f%11.2f%11.2f\n",p-
>numb,p->name,p->age,p->sex,p->ywcj,p->sxcj,p->yycj,p->zcj);
printf("\n是否继续查找相同姓名的记录?
(y/n):
");
scanf("%c%*c",&ch);
if(ch=='y')p=p->next;
}
else{
printf("查找结束或该数据库中无此姓名的记录!
!
!
");
break;
}
}
printf("\n是否重新进行查找操作?
(y/n):
");
scanf("%c%*c",&chs);
}
}
printf("按任意键继续.........");
getch();
break;
case3:
break;
}
if(i==3)break;
}
}
intmenu_select()
{/*选项菜单系统*/
chars[8];
intc;
clrscr();/*清屏*/
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("**\n");
printf("*有头双向链表基本操作窗口*\n");
printf("**\n");
printf("**\n");
printf("************************************\n");
printf("\n");
printf("01:
学生成绩库的建立操作\n");
printf("02:
学生成绩库的显示操作\n");
printf("03:
学生成绩库的删除操作\n");
printf("04:
学生成绩库的插入操作\n");
printf("05:
学生成绩库的查找操作\n");
printf("06:
学生成绩库的修改操作\n");
printf("07:
学生成绩库的排序操作\n");
printf("08:
学生成绩库的统计操作\n");
printf("09:
修改系统的密码操作\n");
printf("10:
将数据存入磁盘文件\n");
printf("11:
将磁盘文件装入内存\n");
printf("12:
退出系统\n");
do{
printf("\n");
printf("输入你的选择号:
1---12:
");
gets(s);
c=atoi(s);
}while(c<0||c>12);
return(c);
}
intmenu_delselect()
{/*删除菜单系统*/
chars[8];
intc;
clrscr();/*清屏*/
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("**\n");
printf("*学生成绩库的删除操作窗口*\n");
printf("**\n");
printf("**\n");
printf("************************************\n");
printf("\n");
printf("01:
按编号删除记录\n");
printf("02:
按姓名删除记录\n");
printf("03:
退出\n");
do{
printf("\n");
printf("输入你的选择号:
1---3:
");
gets(s);
c=atoi(s);
}while(c<0||c>3);
return(c);
}
intmenu_inselect()
{/*插入菜单系统*/
chars[8];
intc;
clrscr();/*清屏*/
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("**\n");
printf("*学生成绩库的插入操作窗口*\n");
printf("**\n");
printf("**\n");
printf("************************************\n");
printf("\n");
printf("01:
插入到数据库尾部\n");
printf("02:
插入到任意位置处\n");
printf("03:
退出\n");
do{
printf("\n");
printf("输入你的选择号:
1---3:
");
gets(s);
c=atoi(s);
}while(c<0||c>3);
return(c);
}
intmenu_findselect()
{/*查找菜单系统*/
chars[8];
intc;
clrscr();/*清屏*/
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("**\n");
printf("*学生成绩库的查找操作窗口*\n");
printf("**\n");
printf("**\n");
printf("************************************\n");
pr