通讯录制作数据结构课程设计.docx

上传人:b****5 文档编号:5686047 上传时间:2022-12-31 格式:DOCX 页数:16 大小:319.52KB
下载 相关 举报
通讯录制作数据结构课程设计.docx_第1页
第1页 / 共16页
通讯录制作数据结构课程设计.docx_第2页
第2页 / 共16页
通讯录制作数据结构课程设计.docx_第3页
第3页 / 共16页
通讯录制作数据结构课程设计.docx_第4页
第4页 / 共16页
通讯录制作数据结构课程设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

通讯录制作数据结构课程设计.docx

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

通讯录制作数据结构课程设计.docx

通讯录制作数据结构课程设计

课程设计报告

课程名称数据结构课程设计

课题名称通讯录的制作

学院信息工程学院

姓名

学号

专业层次班级

任课教师

一、课程设计题目及所涉及知识点2

二、课程设计思路及算法描述2

设计思路2

算法描述3

三、课程设计中遇到的难点及解决办法4

四、总结4

五、结论4

六、附录—主要源程序代码及运行结果4

一、课程设计题目及所涉及知识点

设计题目:

通讯录的制作

知识点:

链表的增,删,改,查、基本的文件操作、字符数组的处理函数、分支结构和

循环结构的熟练使用、结构体的定义与调用、函数的调用、结构体指针在各函数之间的调用。

二、课程设计思路及算法描述

设计思路:

1、确定程序要实现的功能即

(1)实现对数据文件的保存,对数据记录进行添加,可以对数据记录进行查询,可以对数据记录进行删除,可以对数据记录进行显示,可以对数据记录进行修改。

(2)在实现上述函数之后,设置分支结构,对操作进行选择。

上述函数中有几种不同的操作需要用户按照自己的意愿选择。

如,查询方式的选择,删除方式的选择等。

2、确定程序所需要的功能块,存储结构-结构体,malloc申请存储空间,各功能函数—对链表进行初始化line*initLine(line*p),对链表进行插入操作line*insertLine(line*p),将整理好的数据保存到文件内:

saveFile(line*p),姓名查询selectLine_name(),手机号查询selectLine_Id(),使用姓名进行修改line*amendLine(),使用用手机号进行修改line*amendLine_num(),删除刚插入的数据line*delLine(),指定名字删除intselect_name(),指定手机号删除

select_ID(),具体执行删除的链表操作line*delLine(),显示链表数据display(),控制台程序主界面zcd(),返回函数fh(),主函数部分main();。

3、编写代码具体实现各项功能,并进行调试。

算法描述:

链表插入(LinkListInsertion)的基本思想:

同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下3种情况:

插入到链表的头部(头节点之后),作为首元节点;插入到链表中间的某个位置;插入到链表的最末端,作为链表中最后一个数据元素;虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操作,即可将新元素插入到指定的位置:

1.将新结点的next指针指向插入位置后的结点;

2.将插入位置前结点的next指针指向插入结点;

算法实现:

//p为原链表,elem表示新数据元素,add表示新元素要插入的位置

link*insertElem(link*p,intelem,intadd){

link*temp=p;//创建临时结点temp

//首先找到要插入位置的上一个结点

for(inti=1;i

if(temp==NULL){

printf("插入位置无效\n");

returnp;

}

temp=temp->next;

}

//创建插入结点c

link*c=(link*)malloc(sizeof(link));

c->elem=elem;

//向链表中插入结点c->next=temp->next;temp->next=c;

returnp;

}

链表删除(Linkedlistdeletion从链表中删除指定数据元素时,中摘除,但作为一名合格的程序员,间要及时释放。

因此,从链表中删除数据元素需要进行以下2步操作:

1.将结点从链表中摘下来;

2.手动释放掉结点,回收被结点占用的存储空间;其中,从链表上摘除某节点的实现非常简单,只需找到该节点的直接前驱节点temp,执行一行程序:

temp->next=temp->next->next;

算法实现:

//p为原链表,add为要删除元素的值

link*delElem(link*p,intadd){

link*temp=p;

//temp指向被删除结点的上一个结点

for(inti=1;inext;

}

link*del=temp->next;//单独设置一个指针指向被删除结点,以防丢失temp->next=temp->next->next;//删除某个结点的方法就是更改前一个结点的指针域

free(del);//手动释放该结点,防止内存泄漏

returnp;

}

链表查找(Linklistlookup)的基本思想:

在链表中查找指定数据元素,最常用的方法是:

从表头依次遍历表中节点,用被查找元素与各节点数据域中存储的数据元素进行比对,直至比对成功或遍历至链表最末端的NULL(比对失败的标志)。

算法实现:

//p为原链表,elem表示被查找元素、

intselectElem(link*p,intelem){

//新建一个指针t,初始化为头指针p

link*t=p;

inti=1;

//由于头节点的存在,因此while中的判断为t->next

while(t->next){

t=t->next;

if(t->elem==elem){

returni;

}

i++;

}

//程序执行至此处,表示查找失败

return-1;

}

三、课程设计中遇到的难点及解决办法问题:

对数据进行增删改查后,如何将改变的数据同步到文件?

解决方法:

在退出函数前面设置一个保存文件的函数,这样无论数据发生怎样的变化,都会在结尾时,随着退出函数的实现而实现。

问题:

如何查找对应的数据?

解决方法:

因为所设置的结构体内的数据是字符型的,所以需要添加一个头文件,然后使用字符处理函数来对数据进行处理,之后就能够找到相关的数据.

四、总结

通过此次课程设计,加深了我对链表使用的熟练度,巩固了c语言。

让我回忆起了字符数组,文件操作,指针等课程知识。

我对此次课程设计获益匪浅。

课程设计是巩固所学知识理论,提高程序设计的重要环节,通过课程设计的训练,使我们能够综合应用数据结构的基础知识,加深了对于所学知识的理解,也更加懂得了实践的重要性,也明白了各种算法重要的是理解其原理,而不是死记硬背!

同时让我们更加了解自身不足和知识学习缺陷,从而不断完善自我,提高自己的学习水平。

在设计过程中我们真正实现了把所学知识运用于实践,逐渐培养自己的思维和逻辑能力以及实践能力,做到学以致用。

五、结论

通讯录的制作可以使用多种方式,函数调用,数据结构,类等等每一种制作方式都可以实现。

使用数据结构中链表的好处就是,什么时候存储数据,什么时候就能申请存储空间。

而且数据之间的逻辑关系依靠每个数据元素携带的指针维持,关系明确。

另一点,通讯录制作的问题主要涉及元素的插入,删除。

它进行这些操作时无需大量移动元素,时间复杂度相对较低。

不同的场景,选择合适的存储结构会使解决问题效率成倍数地提高。

六、附录—主要源程序代码及运行结果

#include

#include

#include

#includetypedefstructLine{

charname[51];

charcell_number[51];structLine*next;

}line;

//初始化

line*initLine()

{

line*p=(line*)malloc(sizeof(line));

line*temp=p;

temp->next=NULL;

returnp;

}

//插入尝试无脑插(尾插)

line*insertLine(line*p)

{

line*temp=p;

line*newelem=(line*)malloc(sizeof(line));

printf("\t\t请输入要插入的数据姓名手机号\n");scanf("%s",&newelem->name);

scanf("%s",&newelem->cell_number);newelem->next=NULL;

newelem->next=temp->next;temp->next=newelem;

printf("插入成功!

\n");

returnp;

}

//数据保存到文件

voidsaveFile(line*p)

{

line*temp=p->next;

通讯录存储处.txt","at+");

while(temp)

{

fprintf(fp,"%s%s\n",temp->name,temp->cell_number);temp=temp->next;

}

fclose(fp);

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

}

//姓名查询

voidselectLine_name(line*p,char*elem)

{

Line*temp=p;

inti=1;

temp=temp->next;while(temp->next)

{if(strcmp(temp->name,elem)==0)//姓名查找位置{

printf("姓名:

%s,手机号:

%s\n",temp->name,temp->cell_number);}temp=temp->next;

}

}

//手机号查询

voidselectLine_Id(line*p,char*elem_num)

{

line*temp=p;

inti=1;temp=temp->next;

while(temp->next)

{

if(strcmp(temp->cell_number,elem_num)==0)

{

printf("姓名:

%s,手机号:

%s\n",temp->name,temp->cell_number);}temp=temp->next;

}

}

//使用姓名进行修改

line*amendLine_name(line*p,char*name){

line*temp=p;

temp=temp->next;

while(temp->next)

{if(strcmp(temp->name,name)==0)

{

printf("请对该账号进行重新修改\n");

scanf("%s%s",&temp->name,&temp->cell_number);

printf("修改成功!

\n");

}

temp=temp->next;

}

returnp;

//

使用手机号进行修改

line*amendLine_num(line*p,char*name_num){

line*temp=p;temp=temp->next;while(temp->next){

if(strcmp(temp->cell_number,name_num)==0)

{

printf("请对该账号进行重新修改\n");

scanf("%s%s",&temp->name,&temp->cell_number);

printf("修改成功!

\n");

}

temp=temp->next;

}

returnp;

}

//line*delLine(line*p)

{

无脑删

删除刚刚插入的数据)

类似于(栈)那种情况

 

line*temp=p;

line*del=temp->next;

temp->next=temp->next->next;

free(del);

printf("删除成功\n");returnp;

}

//指定名字删除

intselect_name(line*p,char*name)

{

line*temp=p;

inti=1;

//temp=temp->next;

while(temp->next)

{

temp=temp->next;

if(strcmp(temp->name,name)==0)

{

returni;

}

i++;

}

return-1;

}

//指定手机号删除

intselect_ID(line*p,char*name)

{

line*temp=p;

inti=1;

//temp=temp->next;

while(temp->next)

{

temp=temp->next;

if(strcmp(temp->cell_number,name)==0)

{

returni;

}

i++;

}

return-1;

}

//删除(执行两种删除的最终操作)

line*delLine_1(line*p,intadd)

{

line*del;

line*temp=p;

//intadd=select(p,name);

for(inti=1;i

{

temp=temp->next;

}

del=temp->next;

temp->next=temp->next->next;free(del);

printf("删除完成\n");

returnp;

}

//显示

voiddisplay(line*p)

{

line*temp=p;

printf("\t\t显示全部数据\n");

while(temp->next)

{

temp=temp->next;

printf("\t\t%s%s\n",temp->name,temp->cell_number);}

}

voidzcd()//主菜单

{

printf("\t\t\t==========

电话本号码查询系统==========

printf("\t\t\t

1.

添加新联系人\n");

printf("\t\t\t

2.

修改联系人信息

\n");

printf("\t\t\t

3.

删除联系人信息

\n");

printf("\t\t\t

4.

联系人信息查询

\n");

printf("\t\t\t

5.

联系人信息显示

\n");

printf("\t\t\tprintf("\t\t\t===

0.

退出\n");

==\n");

}

voidfh()

{

printf("\t=====>按Enter返回主菜单\n");}

intmain()

{

line*p=initLine();

intchoose;

intadd=0;

//文件操作

FILE*fp;

通讯录存储处.txt","at+");printf("文件创建成功\n");

//文件操作

while

(1)

{

zcd();printf("\t\t\t请选择(0-5):

");

scanf("%d",&choose);system("cls");switch(choose)

{

case1:

//添加新联系人

p=insertLine(p);

//infile(p);//写入文件

fh();

break;

case2:

//修改联系人信息

printf("请输入你要修改帐号的方式0:

使用姓名进行修改1:

手机号进行修改\n");

charname[51];

charname_num[51];

scanf("%d",&choose);

switch(choose)

{

//

case0:

//添加新联系人

printf("请输入您要修改账号的姓名:

\n");

scanf("%s",&name);p=amendLine_name(p,name);

break;

//

case1:

//修改联系人信息

printf("请输入您要修改帐号的手机号\n");

scanf("%s",&name_num);

p=amendLine_num(p,name_num);

break;

default:

break;

}

fh();

break;

//

case3:

//删除联系人信息

printf("请您输入进行删除操作的方式:

0:

删除刚插入的数据指定名字删除2:

指定手机号删除\n");

scanf("%d",&choose);

chardelname[51];

chardelId[51];

switch(choose)

{

case0:

p=delLine(p);//无脑删

break;

case1:

printf("请输入您要进行删除操作的名字\n");scanf("%s",&delname);add=select_name(p,delname);

p=delLine_1(p,add);

使用

1:

break;case2:

printf("请您输入要进行删除操作的手机号\n");scanf("%s",&delId);

add=select_ID(p,delId);p=delLine_1(p,add);

break;

}

fh();

break;

//

case4:

//联系人信息查询

printf("请输入你要选择查询的方式0:

姓名查询,1:

手机号查询\n");

scanf("%d",&choose);

charelem[51];

charelem_num[51];

switch(choose)

{

case0:

printf("请输入您要查询账号的姓名:

\n");

scanf("%s",&elem);

selectLine_name(p,elem);

break;

case1:

printf("请输入您要查询帐号的手机号\n");

scanf("%s",&elem_num);

selectLine_Id(p,elem_num);

break;

default:

break;

}

fh();

break;

//

case5:

//显示

display(p);

fh();

break;

case0:

//退出

saveFile(p);

exit(0);

break;default:

break;

}

fflush(stdin);getchar();

system("cls");

}fclose(fp);

添加数据记录功能:

查询数据记录功能:

显示数据记录:

文件保存功能:

此处介绍:

文件功能设置为:

以读/写方式打开一个文本文件,允许读或在文本末追加数据.数据检查为第十次

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

当前位置:首页 > 工程科技 > 纺织轻工业

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

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