单链表图书信息查询交并差折半查找书名通信录.docx
- 文档编号:4464877
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:55
- 大小:25.44KB
单链表图书信息查询交并差折半查找书名通信录.docx
《单链表图书信息查询交并差折半查找书名通信录.docx》由会员分享,可在线阅读,更多相关《单链表图书信息查询交并差折半查找书名通信录.docx(55页珍藏版)》请在冰豆网上搜索。
单链表图书信息查询交并差折半查找书名通信录
单链表图书信息查询
#include
#include
#include
#include
#include
#defineMAX_NAME20
#defineNULL0
charinfo[5][MAX_NAME]={"书号","书名","作者","出版社","ISBN"};
intfoundone=0;
inttotalfound=0;//找到的书本数
structstudent
{
charoptname[5][MAX_NAME];
intfoundflag;
structstudent*next;
};
structstudent*head,*tail;
//***********************************************************************
//搜索选项菜单
voidmenu_search()
{
inti;
printf("*************************************\n");
printf("*请选择查询的方式*\n");
printf("*************************************\n");
for(i=0;i<5;i++)
printf("%d.\t%s\n",i+1,info[i]);
printf("*************************************\n");
}
//主菜单
voidmenu()
{
system("cls");
printf("*************************************\n");
printf("*1.图书信息查询*\n");
printf("*2.图书信息增加*\n");
printf("*3.退出*\n");
printf("*************************************\n");
printf("请输入要操作的序号:
");
}
intisExist(charnumber[])//判断输入的书号是否已经存在
{
structstudent*p;
p=head;
while(p!
=NULL&&(strcmp(p->optname[0],number)!
=0))p=p->next;
if(p==NULL)
return0;
else
return1;
}
//增加图书信息模块
voidaddIn()
{
charname[5][MAX_NAME];
structstudent*p;
inti;
while
(1)
{
system("cls");
printf("**************************************************\n");
printf("*输入图书的信息,以输入学号为#结束输入*\n");
printf("**************************************************\n");
printf("输入图书学号:
");
fflush(stdin);
scanf("%s",name[0]);
if(isExist(name[0]))
{
printf("!
!
!
该学号已经存在,请重新输入。
\n按任意键重新输入...\n");
getch();
}
else
{
if(strcmp(name[0],"#")==0)
{
printf("**************************************************\n");
printf("输入结束。
按任意键返回主菜单...\n");
getch();
return;
}
for(i=1;i<5;i++)
{
printf("输入图书%s:
",info[i]);
fflush(stdin);
scanf("%s",name[i]);
}
p=(structstudent*)malloc(sizeof(structstudent));
for(i=0;i<5;i++)
strcpy(p->optname[i],name[i]);
p->foundflag=0;
if(head==NULL)
{
head=p;
tail=p;
}
else
{
tail->next=p;
tail=p;
}
tail->next=NULL;
}
}
}
//**********************************************************************
//搜索图书信息模块
intsearch_By(charname[],intindex)
{
inti,n=1;
structstudent*q;
system("cls");
foundone=0;
q=head;
if(head==NULL)return0;
while(q!
=NULL)
{
q->foundflag=0;
q=q->next;
}
totalfound=0;//标志
q=head;
printf("**************************************************\n");
printf("*查询信息如下*\n");
printf("**************************************************\n");
printf("序号");
for(i=0;i<5;i++)printf("\t%s",info[i]);
printf("\n");
printf("**************************************************\n");
while(q!
=NULL)
{
if(strcmp(q->optname[index],name)==0)
{
q->foundflag=1;//标志已查询过的书籍信息
totalfound++;//找到的书本数
foundone=1;
printf("%d.",n);//序号
for(i=0;i<5;i++)printf("\t%s",q->optname[i]);//显示书籍信息
printf("\n");
n++;
}
q=q->next;
}
if(foundone==0)return1;
return2;
}
voidsearchFunc(intmission)
{
intflag,index;
charname[MAX_NAME];
system("cls");
menu_search();
printf("输入要查询的项目序号:
");
scanf("%d",&index);
index--;
if(index<0||index>4)//判断是否在1~5之间
{
printf("输入的序号有误!
按任意键返回主菜单...\n");
getch();
return;
}
printf("*************************************\n");
printf("输入【%s】内容:
",info[index]);
scanf("%s",name);
flag=search_By(name,index);
printf("**************************************************\n");
switch(flag)
{
case0:
printf("当前没有可用的图书信息");break;
case1:
printf("没有找到相关的图书信息");break;
case2:
printf("【%d】条信息已找到",totalfound);break;
}
if(mission==1)
{
printf(",按任意键返回主菜单...\n");
getch();
}
}
//****************************************************************************
//主函数
voidmain()
{
intorder;
while
(1)
{
menu();
fflush(stdin);
scanf("%d",&order);
switch(order)
{
case1:
searchFunc
(1);break;
case2:
addIn();break;
case3:
exit(0);break;
default:
printf("输入的序号有误,请检查后重新输入...\n");
getch();
break;
}
}
}
数据结构C语言版折半查找
/*
数据结构C语言版折半查找
P219
编译环境:
Dev-C++4.9.9.2
日期:
2011年2月15日
*/
#include
#include
#defineN11//数据元素个数
typedefintKeyType;//设关键字域为整型
typedefstruct//数据元素类型
{
KeyTypekey;//关键字域
intothers;//其它部分
}ElemType;
//Search_Seq.h静态查找表的顺序存储结构
typedefstruct
{
//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
ElemType*elem;
intlength;//表长度
}SSTable;
ElemTyper[N]={
{05,1},{13,2},{19,3},{21,4},
{37,5},{56,6},{64,7},{75,8},
{80,9},{88,10},{92,11}
};//数据元素(以教科书P219的数据为例),全局变量
//静态查找表(顺序表和有序表)的基本操作(7个)
//构造一个含n个数据元素的静态顺序查找表ST(数据来自全局数组r)
intCreat_Seq(SSTable*ST,intn)
{
inti;
(*ST).elem=(ElemType*)calloc(n+1,sizeof(ElemType));
//动态生成n+1个数据元素空间(0号单元不用)
if(!
(*ST).elem)
return0;
for(i=1;i<=n;i++)
*((*ST).elem+i)=r[i-1];//将全局数组r的值依次赋给ST
(*ST).length=n;
return1;
}
//重建静态查找表为按关键字非降序排序
voidAscend(SSTable*ST)
{
inti,j,k;
for(i=1;i<(*ST).length;i++)
{
k=i;
(*ST).elem[0]=(*ST).elem[i];//待比较值存[0]单元
for(j=i+1;j<=(*ST).length;j++)//从中找到第i小的值
if((*ST).elem[j].key<(*ST).elem[0].key)
{
k=j;
(*ST).elem[0]=(*ST).elem[j];
}
if(k!
=i)//有更小的值则交换
{
(*ST).elem[k]=(*ST).elem[i];
(*ST).elem[i]=(*ST).elem[0];
}
}
}
//构造一个含n个数据元素的静态按关键字非降序查找表ST,
//数据来自全局数组r
intCreat_Ord(SSTable*ST,intn)
{
intf;
f=Creat_Seq(ST,n);//构建一个静态表
if(f)//静态表存在,则对其进行重建
Ascend(ST);
returnf;
}
//销毁表ST
intDestroy(SSTable*ST)
{
free((*ST).elem);
(*ST).elem=NULL;
(*ST).length=0;
return1;
}
//算法9.2P220
//在有序表ST中折半查找其关键字等于key的数据元素。
若找到,则函数
//值为该元素在表中的位置,否则为0。
intSearch_Bin(SSTableST,KeyTypekey)
{
intlow,high,mid;
low=1;//置区间初值
high=ST.length;
while(low<=high)
{
mid=(low+high)/2;
if(key==ST.elem[mid].key)//找到待查元素
returnmid;
elseif(key high=mid-1;//继续在前半区间进行查找 else low=mid+1;//继续在后半区间进行查找 } return0;//顺序表中不存在待查元素 } //按顺序对ST的每个元素调用函数Visit()一次且仅一次。 intTraverse(SSTableST,void(*Visit)(ElemType)) { ElemType*p; inti; p=++ST.elem;//p指向第一个元素,第0个元素没有用 for(i=1;i<=ST.length;i++) Visit(*p++); return1; } voidprint(ElemTypec)//Traverse()调用的函数 { printf("(%d%d)",c.key,c.others); } intmain() { SSTablest; inti; KeyTypes; Creat_Ord(&st,N);//由全局数组产生非降序静态查找表st Traverse(st,print);//顺序输出非降序静态查找表st printf("\n请输入待查找值的关键字: "); scanf("%d",&s); i=Search_Bin(st,s);//折半查找有序表 if(i) print(st.elem[i]); else printf("没找到.\n"); Destroy(&st); system("pause"); return0; } /* 输出效果: (51)(132)(193)(214)(375)(566)(647)(758)(809)(8810)(9211) 请输入待查找值的关键字: 75 (758)请按任意键继续... */ 图书信息 #include #include #include #defineLENsizeof(structstudent) #defineFORMAT"%d%s%d%d%d%d%d%d\n" #defineDATAstu[i].num,stu[i].name,stu[i].math,stu[i].lisan,stu[i].xiandai,stu[i].english,stu[i].wuli,stu[i].sum voidinput(); voidshow(); voidinput(); voidshow(); voidsearch(); voiddel(); voidmodify(); voidmenu(); voidgaoshu(); voidlisan(); voidxiandai(); voidyingyu(); voiddaxuewuli(); voidtotal(); structstudent { charname[20]; intnum; intmath; intlisan; intxiandai; intenglish; intwuli; intsum; }; structstudentstu[100]; voidinput() { intm=0,i=0,b; charch; FILE*fp; if((fp=fopen("f: \data.txt","r"))==NULL) { printf("无法打开数据\n"); return; } while(! feof(fp)) { b=fread(&stu[m],LEN,1,fp); if(b==1) m++; } fclose(fp); if(m==0) { printf("无数据\n"); } else { printf("原有数据: \n"); show(); } if((fp=fopen("f: \data.txt","a+"))==NULL) { printf("无法打开数据\n"); return; } printf("是否输入新信息: y/n? "); scanf("%s",&ch); while(ch=='Y'||ch=='y') { printf("学号: "); scanf("%d",&stu[m].num); for(i=0;i { if(stu[i].num==stu[m].num) { printf("输入的学号以存在! \n"); printf("返回主菜单! \n"); return; } } printf("姓名"); scanf("%s",stu[m].name); printf("高等数学成绩: "); scanf("%d",&stu[m].math); printf("离散数学成绩: "); scanf("%d",&stu[m].lisan); printf("线性代数成绩: "); scanf("%d",&stu[m].xiandai); printf("英语成绩: "); scanf("%d",&stu[m].english); printf("大学物理成绩: "); scanf("%d",&stu[m].wuli); stu[m].sum=stu[m].math+stu[m].lisan+stu[m].xiandai+stu[m].english+stu[m].wuli; fwrite(&stu[m],LEN,1,fp); printf("学号%d保存成功\n",stu[m].num); m++; printf("是否继续输入新信息: y/n? : "); scanf("%s",&ch); } fclose(fp); } voidshow() { FILE*fp; inti,m=0,b; if((fp=fopen("f: \data.txt","r"))==NULL) { printf("无法打开数据\n"); return; } while(! feof(fp)) { b=fread(&stu[m],LEN,1,fp); if(b==1) m++; } printf("numnamemathlisanxiandaienglishwulisum\t\n"); for(i=0;i { printf(FORMAT,DATA); } fclose(fp); } voidsearch() { FILE*fp; intm=0,n,b,i,j=0; charch; if((fp=fopen("f: \data.txt","r"))==NULL) { printf("无法打开数据\n"); return; } while(! feof(fp)) { b=fread(&stu[m],LEN,1,fp); if(b==1) m++; } if(m==0) { printf("无任何学生信息记录\n"); printf("返回主菜单! \n"); return; } printf("输入要查询的学号: "); scanf("%d",&n); for(i=0;i { if(stu[i].num==n) { printf("numnamemathlisanxiandaienglishwulisum\t\n"); printf(FORMAT,DATA); j=1; } } if(j==0) { printf("未查询到该学生的信息\n"); printf("返回主菜单! \n"); return; } printf("是否继续查询学生信息: y/n? : "); scanf("%s",&ch); while(ch=='Y'||ch=='y') {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单链表 图书 信息 查询 交并 折半 查找 书名 通信