通讯录制作数据结构课程设计.docx
- 文档编号:5686047
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:16
- 大小:319.52KB
通讯录制作数据结构课程设计.docx
《通讯录制作数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《通讯录制作数据结构课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
通讯录制作数据结构课程设计
课程设计报告
课程名称数据结构课程设计
课题名称通讯录的制作
学院信息工程学院
姓名
学号
专业层次班级
任课教师
一、课程设计题目及所涉及知识点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;i } 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 #include 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); 添加数据记录功能: 查询数据记录功能: 显示数据记录: 文件保存功能: 此处介绍: 文件功能设置为: 以读/写方式打开一个文本文件,允许读或在文本末追加数据.数据检查为第十次
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 制作 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)