单链表图书信息查询交并差折半查找书名通信录Word文档下载推荐.docx
- 文档编号:17393607
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:55
- 大小:25.44KB
单链表图书信息查询交并差折半查找书名通信录Word文档下载推荐.docx
《单链表图书信息查询交并差折半查找书名通信录Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单链表图书信息查询交并差折半查找书名通信录Word文档下载推荐.docx(55页珍藏版)》请在冰豆网上搜索。
%d.\t%s\n"
i+1,info[i]);
}
//主菜单
voidmenu()
system("
cls"
*1.图书信息查询*\n"
*2.图书信息增加*\n"
*3.退出*\n"
请输入要操作的序号:
"
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];
while
(1)
{
system("
**************************************************\n"
*输入图书的信息,以输入学号为#结束输入*\n"
输入图书学号:
fflush(stdin);
scanf("
%s"
name[0]);
if(isExist(name[0]))
{
printf("
!
该学号已经存在,请重新输入。
\n按任意键重新输入...\n"
getch();
}
else
if(strcmp(name[0],"
#"
)==0)
{
printf("
输入结束。
按任意键返回主菜单...\n"
getch();
return;
}
for(i=1;
输入图书%s:
info[i]);
fflush(stdin);
scanf("
name[i]);
p=(structstudent*)malloc(sizeof(structstudent));
for(i=0;
i++)
strcpy(p->
optname[i],name[i]);
p->
foundflag=0;
if(head==NULL)
head=p;
tail=p;
else
tail->
next=p;
tail->
next=NULL;
}
//**********************************************************************
//搜索图书信息模块
intsearch_By(charname[],intindex)
inti,n=1;
structstudent*q;
foundone=0;
q=head;
if(head==NULL)return0;
while(q!
=NULL)
q->
q=q->
}
totalfound=0;
//标志
*查询信息如下*\n"
序号"
i++)printf("
\t%s"
\n"
if(strcmp(q->
optname[index],name)==0)
q->
foundflag=1;
//标志已查询过的书籍信息
totalfound++;
foundone=1;
%d."
n);
//序号
q->
optname[i]);
//显示书籍信息
n++;
if(foundone==0)return1;
return2;
voidsearchFunc(intmission)
intflag,index;
charname[MAX_NAME];
menu_search();
输入要查询的项目序号:
scanf("
%d"
&
index);
index--;
if(index<
0||index>
4)//判断是否在1~5之间
输入的序号有误!
getch();
return;
输入【%s】内容:
info[index]);
name);
flag=search_By(name,index);
switch(flag)
case0:
printf("
当前没有可用的图书信息"
break;
case1:
没有找到相关的图书信息"
case2:
【%d】条信息已找到"
totalfound);
if(mission==1)
,按任意键返回主菜单...\n"
//****************************************************************************
//主函数
voidmain()
intorder;
{
menu();
order);
switch(order)
{
case1:
searchFunc
(1);
case2:
addIn();
case3:
exit(0);
default:
输入的序号有误,请检查后重新输入...\n"
break;
数据结构C语言版折半查找
/*
数据结构C语言版折半查找
P219
编译环境:
Dev-C++4.9.9.2
日期:
2011年2月15日
*/
#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)
{
(*ST).elem=(ElemType*)calloc(n+1,sizeof(ElemType));
//动态生成n+1个数据元素空间(0号单元不用)
if(!
(*ST).elem)
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;
(*ST).length;
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;
//算法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<
ST.elem[mid].key)
high=mid-1;
//继续在前半区间进行查找
low=mid+1;
//继续在后半区间进行查找
return0;
//顺序表中不存在待查元素
//按顺序对ST的每个元素调用函数Visit()一次且仅一次。
intTraverse(SSTableST,void(*Visit)(ElemType))
ElemType*p;
p=++ST.elem;
//p指向第一个元素,第0个元素没有用
=ST.length;
Visit(*p++);
voidprint(ElemTypec)//Traverse()调用的函数
(%d%d)"
c.key,c.others);
intmain()
SSTablest;
KeyTypes;
Creat_Ord(&
st,N);
//由全局数组产生非降序静态查找表st
Traverse(st,print);
//顺序输出非降序静态查找表st
\n请输入待查找值的关键字:
"
&
s);
i=Search_Bin(st,s);
//折半查找有序表
if(i)
print(st.elem[i]);
没找到.\n"
Destroy(&
st);
pause"
输出效果:
(51)(132)(193)(214)(375)(566)(647)(758)(809)(8810)(9211)
请输入待查找值的关键字:
75
(758)请按任意键继续...
图书信息
#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();
voidsearch();
voiddel();
voidmodify();
voidmenu();
voidgaoshu();
voidlisan();
voidxiandai();
voidyingyu();
voiddaxuewuli();
voidtotal();
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)
无法打开数据\n"
while(!
feof(fp))
b=fread(&
stu[m],LEN,1,fp);
if(b==1)
m++;
fclose(fp);
if(m==0)
无数据\n"
原有数据:
show();
a+"
是否输入新信息:
y/n?
ch);
while(ch=='
Y'
||ch=='
y'
)
学号:
stu[m].num);
for(i=0;
m;
if(stu[i].num==stu[m].num)
输入的学号以存在!
返回主菜单!
姓名"
scanf("
stu[m].name);
高等数学成绩:
stu[m].math);
离散数学成绩:
stu[m].lisan);
线性代数成绩:
stu[m].xiandai);
英语成绩:
stu[m].english);
大学物理成绩:
stu[m].wuli);
stu[m].sum=stu[m].math+stu[m].lisan+stu[m].xiandai+stu[m].english+stu[m].wuli;
fwrite(&
学号%d保存成功\n"
stu[m].num);
m++;
是否继续输入新信息:
y/n?
:
voidshow()
inti,m=0,b;
numnamemathlisanxiandaienglishwulisum\t\n"
printf(FORMAT,DATA);
voidsearch()
intm=0,n,b,i,j=0;
无任何学生信息记录\n"
输入要查询的学号:
n);
if(stu[i].num==n)
printf(FORMAT,DATA);
j=1;
if(j==0)
未查询到该学生的信息\n"
return;
是否继续查询学生信息:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单链表 图书 信息 查询 交并 折半 查找 书名 通信