《数据结构》课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
报告
学院(系):
班 级:
学生姓名: 学号
指导教师:
2012年12月17日 到2013年1月 2日
一、课程设计概述:
本次数据结构课程设计共完成两个
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
:电话号码查询系统、通讯录。
使用语言:C
编译环境:VC6.0
二、课程设计题目一
[实验内容]
电话号码查询系统
[问题描述]
设计散列表实现电话号码查找系统。
[需求分析]
(1)设每个
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
有下列数据项: 电话号码、用户名、地址;
(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表;
(3)采用一定的方法解决冲突;
(4)查找并显示给定电话号码的记录;
(5)查找并显示给定用户名的记录。
整个系统必须满足系统功能要求;设计不同的散列函数,比较冲突率;在散列函数确定的前提下,尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。
[概要设计]
void getin(Record* a) // 键盘输入联系人的信息
void ShowInformation(Record* a) //显示输入的用户信息
Status collision(int p,int &c) // 冲突处理函数,采用二次探测再散列法解决冲突
void CreateHash(HashTable* H ,Record* a) // 建表,若哈希地址冲突,进行冲突处理
void SearchHash ( HashTable* H,int &c) //在通讯录里查找 关键字
void Save() //保存
void main_menu()
[存储结构]
typedef struct{//记录
NA name;
NA tel;
NA add;
}Record;
typedef struct{//哈希表
Record *elem[HASHSIZE]; //数据元素存储基址
int count; //当前数据元素个数
int size; //当前容量
}HashTable;
[
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图]
void main_menu()
void getin
void ShowInformation
void CreateHash
void SearchHash
Status collision
[详细设计]
#include
//cout,cin语句的头文件
#include //清屏函数头文件:使用csl时调用system
#include //字符串头文件
#include
#include
#define MAXSIZE 100 //电话薄记录的数量
#define MAX_SIZE 50 //用户名、电话号码、地址的最大长度
#define HASHSIZE 400 //定义表长
#define SUCCESS 1 //查找
#define UNSUCCESS -1
#define LEN sizeof(HashTable) // 哈希表的长度
using namespace std;
typedef int Status;//typedef用来定义类型的别名。此处用status作为int别名,目的表达int变量是一个状态变量。
typedef char NA[MAX_SIZE]; //NA作为char的别名
typedef struct{ // 自定义一个记录用户名、电话号码、联系地址的结构体的别名record
NA name,tel,add,way;
}Record;
Record a[HASHSIZE];
typedef struct{ //散列表
Record *elem[HASHSIZE]; //数据元素存储地址
int count; //数据元素个数
int size; //容量
}HashTable;
Status eq(NA x,NA y)
{ //关键字比较,相等返回SUCCESS;否则返回UNSUCCESS
if(strcmp(x,y)==0)//2个字符串的大小比较s1=s2,strcmp(s1,s2) == 0; s1>s2, strcmp(s1,s2) == 1; s1>NUM_BER;
int i;
for(i=0;i>a[i].name;
cout<<"请输入第"<>a[i].tel;
cout<<"请输入第"<>a[i].add;
}}
void ShowInformation(Record* a)//显示输入的用户信息
{
int i;
for( i=0;i=0) return q;
else i=c/2+1;
}
else{
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0) return q;
else i=c/2+1;
}
}
return UNSUCCESS;
}
int searchHash( HashTable * &H, NA key, int &p, int &c ,int way )
{
if( way == 1 ){
p=Hash1( key );
while(H->elem[p]!=NULL && !eq( key, H->elem[p]->name ) )//若哈希地址冲突,进行冲突处理
collision( p ,++c );
if( eq( key, H->elem[p]->name ) )
return 1;
else
return 0;
}
else
{
p=Hash2( key );
while(H->elem[p]!=NULL && !eq( key, H->elem[p]->tel ) )//若哈希地址冲突,进行冲突处理
collision( p ,++c );
if( eq( key, H->elem[p]->tel ) )
return 1;
else
return 0;
}
}
// 建表,若哈希地址冲突,进行冲突处理
void CreateHash(HashTable* H ,Record* a)
{
cout<<"\n 〓〓〓〓〓〓建立散列表〓〓〓〓〓〓〓 ";
cout<<"\n ⑴. 以姓名建立散列表(再散列法解决冲突) ";
cout<<"\n ⑵. 以电话号码建立散列表(再散列法解决冲突) ";
cout<<"\n ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ ";
cout<<"请输入选择:";
int num,i,p=-1,c;
cin>>num;
for(i=0;ielem[p]!=NULL && !eq( a[i].name, H->elem[p]->name ) )//若哈希地址冲突,进行冲突处理
collision( p ,++c );
}
else{
p=Hash2( a[i].tel );
while(H->elem[p]!=NULL && !eq( a[i].tel, H->elem[p]->tel ) )//若哈希地址冲突,进行冲突处理
collision( p ,++c );
}
H->elem[p]=a+i; //求得哈希地址,将信息存入
H->count++;
cout<<"第"<count<<".\n";
}
// 查找用户名和电话号码的记录;
void SearchHash ( HashTable* H,int &c){//在通讯录里查找 关键字,若查找成功,显示信息
//c用来记录冲突次数,查找成功时显示冲突次数
NA type;
int p;
cout<<"\n 〓〓〓〓〓〓查找并显示用户信息记录〓〓〓〓〓〓〓 ";
cout<<"\n ⑴. 查找并显示给定用户名的记录 ";
cout<<"\n ⑵. 查找并显示给定电话号码的记录 ";
cout<<"\n ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ ";
cout<<"请输入选择:";
int num;
cin>>num;
switch(num){
case 1:
cout<<"\n请输入要查找的用户名:\n";
cin>>type;
searchHash( H, type, p, c, 1);
if( eq( type, H->elem[p]->name )==1){
cout<<"\n查找成功! 以下是您需要要查找的信息:\n\n";
cout<<"姓 名:"<elem[p]->name<<"\n电话号码:"<elem[p]->tel<<"\n联系地址:"<elem[p]->add<<"\n";
}
else
cout<<"\n对不起,该用户不存在 \n";
break;
case 2:
cout<<"\n请输入要查找电话号码:\n";
cin>>type;
searchHash( H, type, p, c, 2);
if( eq( type, H->elem[p]->tel )==1){
cout<<"\n查找成功! 以下是您需要要查找的信息:\n\n";
cout<<"姓 名:"<elem[p]->name<<"\n电话号码:"<elem[p]->tel<<"\n联系地址:"<elem[p]->add<<"\n";
}
else
cout<<"\n对不起,该用户不存在 \n";
break;
default:
cout<<"输入错误,请重新输入!";
}
}
void Save(){ //保存
ifstream in;
ofstream out;
out.open("123.txt");
printf("\n保存成功!");
for(int i=0; ielem[i]=NULL;
H->size=HASHSIZE;
H->count=0;
while (1){ // while使电话查询系统执行后返回主菜单的界面
system("cls");
cout<<"\n 〓〓〓〓〓〓↖(^ω^)↗欢迎使用电话号码查找系统〓〓〓〓〓〓〓 ";
cout<<"\n ⑴. 添加用户信息 ";
cout<<"\n ⑵. 读取所有用户信息 ";
cout<<"\n ⑶. 建立散列表(再散列法解决冲突) ";
cout<<"\n ⑷. 查找并显示给定用户的记录 ";
cout<<"\n ⑸. 保存 ";
cout<<"\n ⑹. 退出 ";
cout<<"\n 提示:进行4操作前请先进行3操作 .否则无法查找成功!";
cout<<"\n ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆";
cout<<"\n\n请选择: ";
int num;
cin>>num;
switch(num){
case 1:
getin(a);
system("pause");
break;
case 2:
ShowInformation(a);
system("pause");
break;
case 3:
CreateHash (H,a); /* 建立散列表 */
system("pause");
break;
case 4:
c=0;
SearchHash (H,c);
system("pause");
break;
case 5:
Save();
system("pause");
break;
case 6:
return ;
break;
default:
cout<<"输入错误,请重新输入!";
cout<<"\n";
}
}
}
int main(int argc, char* argv[])
{
main_menu();
//执行结束后清屏,显示主菜单
return 0;
} [调试分析]
问题一:
现象:每次执行后,系统界面不自动清屏?
原因:执行每个选项后,没有清屏操作的代码。解决办法:将CLS放到switch函数体后面,执行选项后,执行清屏操作
问题二:
现象:进行查找的时候,总是查找失败! ! !
原因:查找前没有建立散列表。解决办法:先建立散列表,再查找。
[运行结果及分析]
课程设计题目二
[实验内容]
通讯录
[问题描述]
管理通讯信息,包含姓名(name )、出生日期(birthday)、城市(city)、职业(profession)、电话(tel)、QQ号(qq)等。
[需求分析]
1、 输入信息。
2、 显示信息。
3、 分别以姓名、城市、出生日期、电话或QQ作为关键字查找。
4、 删除信息。
5、 存盘,将数据保存在文件phonefile中,以便下次可以继续上述工作。
测试数据:自己设计,不少于30人。
[概要设计]
void TeleNumber::ReadFile(istream & in) //从文件依次将
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
输入流中的数据读入到变量name,.... 中
void TeleNumber::input() //信息数据输入
void TeleNumber::display() //调用telenumber中的display函数输出信息
void TeleMessage::Remove() //删除
void TeleMessage::Show()
int main()
[存储结构]
此程序的存储结构是单链表
void TeleMessage::Insert() //插入
{ End->input(); //尾指针指向input,从单链表尾部插入信息
End->Next=new TeleNumber; //尾节点指向下一个数据节点,开辟一个新的节点
End=End->Next; //尾节点指向下一个节点
cout< //对标准输入输出文件的操作,后面有命名空间,不能用,否则出错
#include //是对文件操作
#include
#include
using namespace std;
int num ;
struct TeleNumber //用struct结构体来存放不同类型的数据,函数
{
char name[20]; //姓名,字符必须注明长度
int phoneNumber; //电话号码
int birthday; //出生日期
char city[30]; //城市
TeleNumber * Next;
void ReadFile(istream & in);//
void input(); //信息输入的函数
void display();//信息输出的函数
} ;
void TeleNumber::ReadFile(istream & in) //从文件依次将标准输入流中的数据读入到变量name,.... 中
{ in>>name>>phoneNumber>>birthday>>city;
}
void TeleNumber::input() //信息数据输入
{ cout<<"请输入姓名"<>name;
cout<<"请输入电话号码"<>phoneNumber;
cout<<"请输入出生日期"<>birthday;
cout<<"请输入城市"<>city;
}
void TeleNumber::display() //调用telenumber中的display函数输出信息
{ cout<<"姓名:"<Next=new TeleNumber; //head指向一个新分配的节点
End=Head->Next; //对结构体遍历,头节点指针依次指向下一个节点,直到指向尾节点
in.open("TeleNumber.text"); //打开外存文件,读入数据
} //使屏幕暂停,而不是直接闪过
TeleMessage::~TeleMessage() //释放单链表
{ TeleNumber * temp; //定义一个数据指针temp
while(Head->Next!=End) //当头节点指向的下一个指针不是尾节点
{ temp=Head->Next; //数据指针指向头节点指向的下一个节点
Head=Head->Next; //头结点依次指向头结点的下一个节点
delete temp; //删除数据指针指向的节点数据
}
delete Head,End; //删除头尾指针
}
void TeleMessage::Save() //保存文件
{ out.open("TeleNumber.txt"); //建立外存文件TeleNumber.txt,把数据写入外存文件中
for(TeleNumber *p=Head->Next;p!=End;p=p->Next) out<name<<"\t"<phoneNumber<<"\t"<birthday<<"\t"<city<input(); //尾指针指向input,从单链表尾部插入信息
End->Next=new TeleNumber; //尾节点指向下一个数据节点,开辟一个新的节点
End=End->Next; //尾节点指向下一个节点
cout<>name;
if( (p=Search(name))) //如果找到了要删除的节点
{ if( Head->Next==p){
Head->Next=p->Next;//利用头指针,将要删除的数据拉出来,这个是经过找很多人写出来的。首先非常感谢百度知友和 校友
}
temp=p; //使指针temp指向p指向的要删除的节点
p=p->Next; //摘链:使p指向p指向的下一个节点的下一个节点
delete temp; //删除temp指向的节点
cout<<"删除成功!"<Next;p!=End;p=p->Next) //定义一个数据指针p指向头节点指向的下一个节点,头节点没有数据,数据从头节点的下一个节点开始存储 ,P进行遍历操作,直到指向尾节点
if(!strcmp(p->name,name)) //strcmp作用是俩个变量相减,如果p所指向的name和要查找的name相同,则strcmp值为0,非1
{ p->display();
return p;
}
else
cout<<"查无此人"<Next;p!=End;p=p->Next)
p->display();
}
int main()
{ bool flag=true;//定义一个布尔型变量flag并初始化为真(true),只认识真(true)和假(false),1和0,也就是成立和不成立的简单判断。
TeleMessage tele;
char name[20];
while(flag) //如果flag为真
{
system("cls");
cout<<"〓〓〓〓〓〓〓通讯录〓〓〓〓〓〓〓 "<>num;
switch(num)
{ case 1:tele.Insert();break;
case 2:tele.Show();break;
case 3: cout<<"请输入姓名"<>name;
tele.Search(name);break;
case 4:tele.Remove();break;
case 5:tele.Save();break;
case 6: cout<<"谢谢使用! "<
本文档为【数据结构课程设计通讯录、电话号码查询系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。