哈希表制作通讯录数据结构程序设计Word文件下载.docx
- 文档编号:17637662
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:19
- 大小:193.29KB
哈希表制作通讯录数据结构程序设计Word文件下载.docx
《哈希表制作通讯录数据结构程序设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《哈希表制作通讯录数据结构程序设计Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
/*NA为typedef定义的字符数组类型*/
}Record;
typedefstruct{/*哈希表*/
Record*elem[HASHSIZE];
//数据元素存储基址
intcount;
//当前存储的数据元素个数
intsize;
//当前容量,即表长
}HashTable;
4.22说明主程序的流程
4.23说明各程序模块之间的层次〔调用〕关系
各函数模块之间的调用关系主要是主函数调用主要功能函数,即:
输入与保存函数、哈希表建立函数、查找信息函数,主要功能函数也会调用一些根本功能函数完成相应功能,如:
CreateHash()会调用Hash()来求哈希地址,而Hash()会调用fold()对关键字先进行折叠处理,当地址冲突时,Hash()又会调用collision()解决冲突;
SearchHash()也会调用Hash()、fold()、collision()以及eq()。
并且主函数利用while循环使各个功能函数运行完毕后都会回到菜单,询问是否继续进行操作。
4.3详细设计
4.31实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法
voidmain()
{
start=last=NULL;
for(;
;
)/*无限循环*/
{
switch(menu_select())/*调用主界面的选择函数,带回返回值*/
case1:
enter();
continue;
case2:
ddelete(&
start,&
last);
case3:
list();
case4:
search();
case5:
save();
case6:
load();
case7:
exit(0);
}
}
intmenu_select(void)/*主目录*/
chars[80];
intc;
printf("
………………^欢送使用DOS通讯录系统^………………\n"
);
************请在做其它操作前先导入*************\n"
***********************************************\n"
printf("
*****************1.输入信息******************\n"
*****************2.删除信息******************\n"
*****************3.显示信息******************\n"
*****************4.查找******************\n"
*****************5.存盘******************\n"
*****************6.导入******************\n"
*****************7.退出******************\n"
do{
\nPleaseenteryourchoice:
\n"
gets(s);
c=atoi(s);
/*将获取的字符串转换成整型*/
}while(c<
0||c>
7);
returnc;
/*返回输入值*/
4.32对主程序和其它主要函数写出伪码算法
structaddress*info;
/*定义当前结点*/
for(;
)
info=(structaddress*)malloc(sizeof(structaddress));
/*为当前结点分配空间*/
if(!
info)
{
printf("
\nOutofmemory"
exit(0);
/*如果分配空间失败,退出程序*/
}
输入空结束:
inputs("
请输入:
"
info->
name,10);
info->
name[0])break;
/*如果输入为空,结束循环*/
请输入街道:
street,50);
请输入城市:
city,15);
请输入国家:
state,15);
tel,7);
insert(info,&
/*调用结点插入函数*/
4.4测试
图4-1程序运行图
图4-2输入信息图
图4-3显示信息
4.5附录
#include<
stdio.h>
stdlib.h>
string.h>
structaddress{/*定义结构*/
charname[10];
charstreet[50];
charcity[10];
charstate[15];
chartel[7];
structaddress*next;
/*后继指针*/
structaddress*prior;
/*前驱指针*/
};
structaddress*start;
/*首结点*/
structaddress*last;
/*尾结点*/
structaddress*find(char*);
/*声明查找函数*/
voidenter();
/*函数声明*/
voidsearch();
voidsave();
voidload();
voidlist();
voidddelete(structaddress**start,structaddress**last);
voidinsert(structaddress*i,structaddress**start,
structaddress**last);
voidinputs(char*,char*,int);
voiddisplay(structaddress*);
intmenu_select(void);
switch(menu_select())
voidenter()/*输入函数,本函数循环输入资料,当输入为空时退出*/
{
structaddress*info;
name[0])
break;
insert(info,&
voidinputs(char*prompt,char*s,intcount)/*输入函数,有越界检测功能*/
charp[255];
do
printf(prompt);
fgets(p,254,stdin);
if(strlen(p)>
count)
printf("
\nTooLong\n"
}while(strlen(p)>
count);
p[strlen(p)-1]=0;
strcpy(s,p);
voidinsert(/*数据插入函数*/
structaddress*i,
structaddress**start,
structaddress**last
)
if(*last==NULL)/*如果尾结点为空,意味着当前链表为空*/
i->
next=NULL;
i->
prior=NULL;
*last=i;
*start=i;
return;
else
{
(*last)->
next=i;
prior=*last;
*last=(*last)->
next;
voidddelete(structaddress**start,structaddress**last)/*删除函数*/
s,10);
/*输入欲删除结点的name域内容*/
info=find(s);
/*查找该内容*/
if(info)/*如果找到*/
Deleting......\n"
if(*start==info)/*如果该结点为首结点,把该结点的下驱作为新的首结点〔入口〕*/
*start=info->
if(*start)
(*start)->
else*last=NULL;
else/*如果欲删除的结点不是首结点*/
info->
prior->
next=info->
/*令该结点的前驱的next指针指向该结点的后驱,
*又令该结点的后驱的prior指点指向该结点的前驱*/
if(info!
=*last)/*如果该结点是尾结点,那么令该结点的前驱为尾结点*/
info->
next->
prior=info->
prior;
*last=info->
free(info);
/*释放该结点所占用的内存*/
-Ok,删除成功!
structaddress*find(char*name)/*查找函数,形参为欲查找结点的name域*/
info=start;
while(info)
if(!
strcmp(name,info->
name))returninfo;
info=info->
未找到相关信息.\n"
returnNULL;
/*输出整个链表*/
voidlist(void)
if(info==NULL)
当前记录为空!
elseprintf("
\t街道\t\t城市\t国家\t\t\n"
display(info);
if(info->
next==NULL){break;
}info=info->
};
\n\n"
voiddisplay(structaddress*info)/*输出传入结点函数*/
%s\t"
name);
street);
city);
state);
tel);
voidsearch(void)/*查找函数*/
charname[40];
请输入要查找的:
/*输入欲查找的*/
gets(name);
info=find(name);
不存在\n"
/*如果没找到,显示Notfound*/
else
/*如果找到,显示该结点资料*/
voidsave(void)/*保存函数*/
FILE*fp;
fp=fopen("
record.txt"
"
wb"
/*生成文件*/
fp)
Cannotopenfile.\n"
return;
\nSaveing……\n"
while(info)/*把链表写入文件*/
fwrite(info,sizeof(structaddress),1,fp);
-ok!
fclose(fp);
/*链表全部写入文件后,关闭文件*/
voidload()/*调用预存文件函数*/
registerintt,size;
structaddress*info,*temp=0;
char*p;
/*翻开文件*/
if((fp=fopen("
r"
))==NULL)
Cannotopenfile!
}
\n\nLoading...\n"
/*调用文件*/
size=sizeof(structaddress);
/*为结点分配内存*/
start=(structaddress*)malloc(size);
start)/*如果读取失败,返回*/
Outofmemory!
p=(char*)info;
while((*p++=getc(fp))!
=EOF)
for(t=0;
t<
size-1;
++t)
*p++=getc(fp);
next=(structaddress*)malloc(size);
next)
{
}
prior=temp;
temp=info;
temp->
next=0;
last=temp;
start->
prior=0;
-OK!
5总结与展望
通过一星期的数据结构与算法分析课程设计实习,我从中受益匪浅。
对数据结构程序设计这一门课程有了更深一步的认识,对一些细节语法有了更新、更深刻的理解,知其然,亦知其所以然。
尤其在程序调试过程中,程序的执行过程与语法相联系,尽量独立过失纠错,最后请教老师,对程序的优化设计和调试方法都有了很大的进步。
这次课程设计的进步是很大的,我了解到,我们需要将所学的理论知识和实践联系起来,在实践设计中不断进步,不断熟练,光是读透书本知识是不够的。
虽然我对一些C语言知识运用得还不是很熟练,但是我相信在接下来的学习过程中,我会有更大的进步,还有很大的空间可以发挥。
在这次课程设计中,我做的是课题10,建立27人的通讯录,设计散列表实现通讯录查找系统,并完成相应的建表和查表程序。
其中运用了很多方面的知识。
如,运用结构体建通讯录,保存信息。
构建哈希表,用除留余数法构造哈希函数,采用二次探测再散列法解决冲突,对关键字的折叠处理等等。
可以看出,一个简单设计的完成,需要很多方面的知识来共同完成,每方面的知识都要理解透彻,运用熟练,其实我们需要在平日里打好根底。
而且,要会用其他算法或其他数据结构来优化算法,这对知识运用的灵活性掌握有很高的要求。
所以,通过一次短短的课程设计就可以看出,我们需要学习的还很多,掌握的知识也不够透彻明白。
总之,这次课程设计,让我看到很多缺乏,为我今后的学习指出了新的学习方向,这是我最大的收获
参考文献
[1]严蔚敏,吴伟民。
?
数据结构?
清华大学计算机系列教材。
北京:
清华大学出版社,2007
[2]陈锐。
零根底学数据结构?
机械工业出版社,2021。
]谭浩强?
C程序设计〔第三版〕?
清华大学出版社,2005
成绩评定
成绩教师签字
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 制作 通讯录 数据结构 程序设计