级数据结构课程设计报告.docx

上传人:b****5 文档编号:12193848 上传时间:2023-04-17 格式:DOCX 页数:25 大小:462.06KB
下载 相关 举报
级数据结构课程设计报告.docx_第1页
第1页 / 共25页
级数据结构课程设计报告.docx_第2页
第2页 / 共25页
级数据结构课程设计报告.docx_第3页
第3页 / 共25页
级数据结构课程设计报告.docx_第4页
第4页 / 共25页
级数据结构课程设计报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

级数据结构课程设计报告.docx

《级数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《级数据结构课程设计报告.docx(25页珍藏版)》请在冰豆网上搜索。

级数据结构课程设计报告.docx

级数据结构课程设计报告

计算机科学与技术学院课程设计成绩单

课程名称:

数据结构课程设计指导教师:

袁嵩

姓名

涂智明

性别

学号

1

班级

软件1101

综合成绩

成绩等级

程序运行情况

(占总成绩20%)

□能正确运行□基本能正确运行□能运行但结果不完善

(20分)(15分)(10分)

程序功能的完善程度

(占总成绩10%)

□完善□基本完善□不完善

(10分)(8分)(5分)

程序结构的合理性

(占总成绩10%)

□合理□基本合理□不太合理

(10分)(8分)(5分)

对问题的答辩情况

(占总成绩40%)

□概念正确有创新□能正确回答所有问题□基本能正确回答

(40分)(35分)(30分)

□部分问题回答概念不清晰

(20分)

学生的工作态度与独立工作能力

(占总成绩10%)

□工作态度认真能独立完成任务□工作态度认真但独立性较差

(10分)(8分)

□工作态度基本认真但缺乏独立性

(5分)

设计报告的规范性

(占总成绩10%)

□符合规范□基本符合规范□规范性较差

(10分)(8分)(5分)

优秀:

90分~100分良好:

80分~89分中等:

70~79分及格:

60~69分不及格0分~59分

武汉科技大学计算机科学与技术学院制表

 

计算机科学与技术学院

课程设计报告

课程名称:

数据结构

专业:

软件工程

班级:

11级1班

学号:

1

姓名:

涂智明

指导老师:

袁嵩

 

题目一通讯录

一、问题描述

1)通过键盘建立通讯录,每条记录至少包括2个数据项:

姓名、电话号码;

2)对通讯录进行插入、删除、修改和查找;

3)通过姓名查找,必须实现精确查找和模糊查找,例如输入“张”,则显示第一个姓张的朋友,然后可以选择“下一个”,鼓励思路创新,提供其他多种查找方式,例如拼音查找等;

4)也可以根据电话号码或部分电话号码进行精确查找和模糊查找;

5)自行定义数据结构,可以选择性的将顺序查找、折半查找、索引查找、树型查找、哈希表等灵活运用其中,完成多方式查找功能。

二、解题思路

将一个用户的信息定义为一个结构体,使用链表存储用户信息。

每一个用户为一个节点。

通讯录功能设置为新建通讯录,新增联系人,查找联系人,修改联系人,删除联系人,保存通讯录,打开已有通讯录。

保存通讯录将通讯录以文本文件存到本地硬盘,在启动程序后,可选择打开已保存的通讯录。

三、算法描述

四、程序设计

typedefstructnode

{

intn;

charname[20];

chartel[20];

charadd[20];

charqq[15];

structnode*next;

}list;用于存储联系人信息

voidenterdata(list*p0);用于数据输入

voidshow(list*head);显示已输入的信息

voidsave(list*head,FILE*fp);保存文件

voidload(list*&head);载入已存储的文件

voidsearch(list*head);搜索联系人

voidchange(list*head);改变已有联系人信息

voiddel(list*&head);删除已有联系人

voidcreate(list*&head);创建新通讯录

voidinsert(list*&head);插入一个联系人信息

程序源码:

#include"stdafx.h"

#include

#include

#include

#include

#include

#defineLENsizeof(list)

usingnamespacestd;

typedefstructnode

{

intn;

charname[20];

chartel[20];

charadd[20];

charqq[15];

structnode*next;

}list;

voidenterdata(list*p0);

voidshow(list*head);

voidsave(list*head,FILE*fp);

voidload(list*&head);

voidsearch(list*head);

voidchange(list*head);

voiddel(list*&head);

voidcreate(list*&head);

voidinsert(list*&head);

intmain(intargc,char*argv[])

{

list*head=NULL;

FILE*fp=NULL;

intm;//功能代号吗

do{

cout<<"\t\t\t\t通讯录"<

cout<<"请选择您需要的功能:

"<

cout<<"################################################################################";

cout<<"#\t\t1.显示所有联系人信息\t\t"<<"2.新建通讯录\t\t#";

cout<<"#\t\t3.查找联系人\t\t\t"<<"4.修改联系人\t\t#";

cout<<"#\t\t5.删除联系人\t\t\t"<<"6.增加联系人\t\t#";

cout<<"#\t\t7.保存\t\t\t\t"<<"8.打开\t\t\t#";

cout<<"#\t\t9.清屏\t\t\t\t"<<"0.退出\t\t\t#";

cout<<"################################################################################"<

cout<<"输入要执行的功能代号:

";

cin>>m;

switch(m)

{

case1:

show(head);break;

case2:

create(head);break;

case3:

search(head);break;

case4:

change(head);break;

case5:

del(head);break;

case6:

insert(head);break;

case7:

save(head,fp);

printf("==保存成功==\n");break;

case8:

load(head);break;

case9:

system("cls");break;

}

}

while(m!

=0);

 

return0;

}

//数据输入

voidenterdata(list*p0)

{

printf("名字:

");

gets(p0->name);

printf("城市:

");

gets(p0->add);

printf("电话:

");

gets(p0->tel);

printf("QQ:

");

gets(p0->qq);

printf("\n");

}

//显示列表

voidshow(list*head)

{

list*p;//定义移动指针

inti;

char*menu[]={"姓名","地址","电话","QQ"};//,"生日","备注"

p=head;

printf("--------------------------------------------------------------------\n");

for(i=0;i<4;i++)

printf("%-12s",menu[i]);

cout<

if(head!

=NULL)

while(p!

=NULL)

{

printf("%-12s",p->name);

printf("%-12s",p->add);

printf("%-12s",p->tel);

printf("%-12s",p->qq);

printf("\n");

p=p->next;

}

else

cout<<"不好意思,列表为空\n";

cout<<"--------------------------------------------------------------------\n";

}

//保存

voidsave(list*head,FILE*fp)

{

list*p0;//定义移动指针

p0=head;

fp=fopen("通讯录.txt","wb+");

while(p0!

=NULL)

{

fprintf(fp,"%s%s%s%s",p0->name,p0->add,p0->tel,p0->qq);

p0=p0->next;

}

fclose(fp);

}

//载入

voidload(list*&head)

{

FILE*fp;

charch;//存储从文件中读取的字符

charlujing[100];

list*p1,*p2;//,*p3;

printf("输入打开通讯录得路径:

\n");

printf("例如:

c:

\\新建文件夹\\通讯录.txt\n请输入:

");

scanf("%s",lujing);

fp=fopen(lujing,"r");

if(fp==NULL)

{

printf("错误:

打不开文件或文件不在\n");

exit(0);

}

ch=fgetc(fp);//判定通讯录是否为空

if(ch==EOF)

printf("===通讯录空===\n");

p2=p1=head;

while(p1!

=NULL)

{

p2=p1;

p1=p1->next;

free(p2);

}

head=NULL;

while(!

feof(fp))

p1=(list*)malloc(LEN);

p1->next=NULL;

fscanf(fp,"%s%s%s%s",p1->name,p1->add,p1->tel,p1->qq);

if(head==NULL)

{

head=p1;

p2=head;

}

else

{

p2->next=p1;

p2=p1;

}

}

fclose(fp);

show(head);

printf("\n通讯录打开成功\n");

}

//查找

voidsearch(list*head)

{

list*p1,*p2;

charcheck_name[20];

intj=0,m;

printf("请输入要查找的姓名\n");

scanf("%s",check_name);

if(head==NULL)

{

printf("\n不好意思,列表为空\n");

}

p1=head;

while(p1!

=NULL)

{

if(strstr(p1->name,check_name))//模糊查找用的strstr()函数

{

printf("姓名:

%s",p1->name);

printf("城市:

%s",p1->add);

printf("电话:

%s",p1->tel);

printf("QQ:

%s",p1->qq);

printf("\n");

printf("是否是本条记录?

按1确定本条记录\t按其他数字键继续\n");

scanf("%d",&m);

if(m==1)

break;

}

p2=p1;

p1=p1->next;

if(p1==NULL&&j==0)

printf("\n没有%s的通讯信息\n",check_name);

}

}

//修改

voidchange(list*head)

{

list*p1,*p2;

charchange_name[20];

FILE*fp=NULL;

printf("请输入要修改的姓名\n");

scanf("%s",&change_name);

getchar();

if(head==NULL)

{

printf("\n不好意思,列表为空\n");

}

p1=head;

while(p1!

=NULL&&strcmp(change_name,p1->name)!

=0)

{

p2=p1;

p1=p1->next;

}

if(p1!

=NULL&&strcmp(change_name,p1->name)==0)

{

enterdata(p1);

save(head,fp);

}

else

printf("\n%s没有被找到\n",change_name);

}

//删除

voiddel(list*&head)

{

list*p1,*p2;//定义临时指针

chardelname[20];//保存要删除人的姓名

FILE*fp=NULL;//文件指针

inti;

printf("请输入要删除人的姓名:

");

scanf("%s",delname);

if(head==NULL)

{

printf("\n====通讯录为空====\n");

}

p1=head;//通讯录不为空时,把头指针赋值给p1

while(p1&&(i=strcmp(delname,p1->name)))/*p1指向的不是所要找的结点,且p1不是最后一个结点*/

{

p2=p1;//保存前驱结点地址

p1=p1->next;

}

if(i==0)

{

printf("删除人为:

%s\n",p1->name);

if(p1==head)

{

head=p1->next;//若p1指向的是首结点,指第二个结点的地址给P1

}

else

{

p2->next=p1->next;//修改指针域

}

head->n=head->n-1;

printf("刚刚删除的是:

%s\n",delname);

free(p1);

save(head,fp);

}

elseif(p1==NULL)

printf("\n姓名为%s的通讯信息没有被找到!

\n",delname);

}

//创建

voidcreate(list*&head)

{

list*p0,*p1,*p2;

intm;//作为判断是否继续新建的条件

FILE*fp=NULL;

p0=(list*)malloc(LEN);

p0->next=NULL;

head=p0;

printf("请输入信息建立通讯录:

\n");

getchar();

enterdata(p0);

p2=p0;

printf("是否继续按1输入,按0结束");

scanf("%d",&m);

while(m)

{

getchar();

p1=(list*)malloc(LEN);

p1->next=NULL;

p2->next=p1;

enterdata(p1);

p2=p1;

head->n=head->n+1;//表长***********************************

printf("是否继续按1输入,按0结束");

scanf("%d",&m);

}

if(m==0)

{

save(head,fp);

}

}

//插入

voidinsert(list*&head)

{

list*p,*q;

p=head;

while(p->next)

p=p->next;//遍历到最后一个结点

printf("新建:

\n");

q=(list*)malloc(LEN);

q->next=NULL;

getchar();

enterdata(q);

p->next=q;

head->n=head->n+1;

printf("==建立完成-注意保存==\n");

}

五、测试结果

 

题目二便利店选址

一、问题描述

某小区决定在小区内部建一家便利店,现小区内部共有八栋楼,它们的地理坐标分别为:

(10,20)(30,34)(19,25)(38,49.1)(9,38.1)(2,34)(5,8)

(29,48)。

同时,其中的住户人数分别为:

30,45,28,8,36,16,78,56。

为了方便更多的住户购物,要求实现总体最优,请问便利店应该建立在哪里?

【提示】

1)便利店无论选址何处,八栋楼的居民均可直接到达,即八栋楼与便利店均相邻,且距离为直线距离;

2)八栋楼的居民人数为权重,应该方便大多数人,实现总体最优。

二、解题思路

运用精确重心算法,求出小区的重心,将便利店建在重心处即可。

三、算法描述

1.确定便利店地址初始位置(xd(0),yd(0))。

2.计算出与(xd(0),yd(0))相应的距离权重CT(0)。

3.将(xd(0),yd(0))代入公式中,计算出便利店地址的改进位置(xd

(1),yd

(1))。

4.计算出与(xd

(1),yd

(1))相应的距离权重CT

(1)。

5.将CT

(1)与CT(0)进行比较,若CT

(1)<CT(0),则返回步骤3,将(xd

(1),yd

(1))代入公式中,计算出便利店地址第二次改进位置(xd

(2),yd

(2))。

若CT

(1)≥CT(0),说明初始位置(xd(0),yd(0))便是最优解。

6.如此反复迭代计算,直至CT(k+1)≥CT(k),求出(xd(k),yd(k))这一最优解为止。

四、程序设计

本程序中定义了四个函数分别是choosePostion(),sum1(),sum2(),comp();

sum1(),sum2()分别计算

,choosePostion()计算

,comp()返回两数字差值的绝对值;

#include

#include

#defineM10000

doublex[M]={10,30,19,38,9,2,5,29},y[M]={20,34,25,49.1,38.1,34,8,48},r[M]={30,48,28,8,36,16,78,56},d[M];

voidchoosePostion(intn,doublem);

voidmain(){

inti,n;

doublemin;

printf("输入楼的数量:

");

scanf("%d",&n);

while(n==0){

printf("没有楼不能建超市!

\n");

printf("请重新输入需要满足楼数:

");

scanf("%d",&n);

}

printf("输入各楼的坐标(x,y),住户\n");

for(i=0;i

printf("第%d个:

坐标:

",i+1);

scanf("%lf,%lf",&x[i],&y[i]);

printf("住户人数:

");

scanf("%lf",&r[i]);

}

printf("求最佳地址");i=8;

printf("请给出收敛的差值min:

");

scanf("%lf",&min);

choosePostion(i,min);

}

doublesum1(intn,doublea[M],doubleb[M]){

inti;

doubles=0,p=0;

for(i=0;i

s+=a[i]*b[i];

for(i=0;i

p+=b[i];

returns/p;

}

doublesum2(intn,doublea[M],doubleb[M]){

inti;

doubles=0,p=0;

for(i=0;i

s+=a[i]*b[i]/d[i];

for(i=0;i

p+=b[i]/d[i];

returns/p;

}

doublecomp(doublea,doubleb){

if(a<0)

return(-a-b);

return(a-b);

}

voidchoosePostion(intn,doublem){

inti=1,j;

boolfind=false;

doublesum,a1,b1,a2,b2;

if(n==1){

printf("对于一个楼,便利店最佳选址即楼所在地址:

x=%lf,y=%lf\n",x[0],y[0]);

}

else{

a1=sum1(n,x,r);

b1=sum1(n,y,r);

while(find==false){

printf("a[%d]=%lf,b[%d]=%lf\n",i,a1,i,b1);

printf("***********************:

\n");

for(j=0;j

d[j]=(sqrt)((x[j]-a1)*(x[j]-a1)+(y[j]-b1)*(y[j]-b1));

printf("d[%d]:

%lf\t",j+1,d[j]);

}

sum=0;

for(j=0;j

sum+=d[j]*r[j];

}

printf("当前距离权重%lf.\n",sum);

a2=sum2(n,x,r);

b2=sum2(n,y,r);

if((

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1