数据结构大作业报告_C语言通讯录系统_链表

通讯录管理系统报告

——数据结构设计型试验

组长:秦奇辉(084632208)

组员:孙海亮(084632231)

宋浩(084632215)

通讯录管理系统

设计题目:通讯录管理系统

设计实现功能:

1.创建一个通讯录(单链表的创建)。

2.显示通讯录中所有联系人的信息和按组显示具体组的联系人信息(单链表的直接输出与查找输出)。

3.在通讯录中增加联系人(单链表的插入)。

4.按姓名查找具体联系人(单链表查找)。

5.修改具体联系人的信息(单链表的查找、修改)。

6.删除通讯录中的具体联系人及具体分组(单链表的查找、删除)。

7.通讯录中信息以文件保存,下次进入系统自动读取上次存储的信息(文件的存储与读取)。

小组成员分工:

秦奇辉负责内容:节点的构建、文件系统的设计、主函数及菜单的设计、单链表的创建子函数设计、查看功能函数的设计、小组各成员的函数的组织。

宋浩负责内容:查找功能子函数的设计,增加新信息功能子函数设计、修改功能子函数设计。

孙海亮负责内容:删除功能子函数设计(包括按具体联系人删除、删除具体某个组)。

程序总体结构图:

系统评价:本系统是以手机中的通讯录各功能为模板设计的。本系统功能全面,操作方便,适于使用。系统中用到的创新功能如下:1.在系统中加入了文件系统,使用户存储的信息能够有效的得到保

存。

2.增加了分组查看和分组删除功能,是系统实用性更强。

3.设置了多个输入错误及查询、删除失败的判断,便于用户清楚了

解自己的操作过程。

4.增加了清屏功能,操作起来更加有条理,互动行增强。

本系统通过我们小组成员的共同努力,不仅完成了基本要求,而且还有部分创新功能。但是限于水平及经验有限,所写代码风格及简洁程度有待提高。所以,我给本系统打94分。

遇到的问题及心得体会之秦奇辉

遇到的问题及解决方法

问题1:在创建通讯录时,考虑到手机中的通讯录是给定几个分组让用户选择,而不是用汉字输入所在分组。在实现这个功能时,开始时用的q->row=a[30](a中存放的分组信息),无法实现。

解决方法:在程序中用strcpy(q->row,a[30])(字符串复制语句),问题得到解决。

问题2:在写文件系统时,无法完成对应该读取文件还是新建文件的判断。

解决方法:先判断是否存在文件,不存在就建立一个新的文件,然后关闭文件。然后再以只读方式打开文件,读取文件中的信息。代码如下:if(fp=fopen("txl.txt","r")==NULL)

{fp=fopen("txl.txt","w");

fclose(fp);}

问题3:在读出文件时,用if(!feof(fp))来判断文件是否读取完毕,但每次读取时都多读出一个节点。

解决方法:在读完链表后,有加了一段代码,把链表最后一个节点去掉,问题得到解决。

心得体会:说实话,在本次系统设计的开始阶段,由于对系统设计存

在不自信、加上对以前C语言知识的遗忘和自身编程经验不足,我确实遇到了很多的问题。但是通过我的努力和向高手的请教,各种问题都得到了很好的解决。而且我从中总结了很多的经验、吸取了很多教训。我认为,大作业对于我们的学习和提高有着很大的帮助。因为大作业是对我们所学的知识的总的一次复习,对我们的掌握知识的情况的一次测验。学习语言就是用来编程的,通过这次大作业,使我清楚了自己的水平,脱离了“不知道自己知道不知道”的状态。我相信,这无论对于我以后的学习,还是以后的工作,都有着深远的影响。遇到的问题及心得体会之宋浩

通过此次作业我不仅加深了c语言中的链表的运用,同时和数据结构中链表的运算相结合,从产生问题到解决,真正意义上的掌握了单链表的查找、修改增加。有问题,自己实在解决不了,问别人,而自己也要搞懂它。我的程序虽不是最好的,但都是自己努力的结果,这让我对编程更加有自信了。

遇到的问题及解决方法

对于链表的查找,没有什么问题,链表的循环要用while,对比是否一样用(!strcmp(head->name,x))。我碰到的问题比较多的是在链表的修改,第一,对输入的数据查询时,此链表至少是两个节点,只有一个也不必找了。然后一个一个节点找,如果找不到就p=p->next,这句话当时是放在判断找到后的if(!strcmp(p->name,z))的,但是当找除第一个节点时出现了死循环,后来把它拿出来单独成一个if句子,问题又来了。第二,找到后输出,但是我要只找一次,于是我在那加了一

句break。之前写错的如下

else

{if(!strcmp(p->name,z))

{printf("找到了\n");

printf("%s\t%s\t%s\n",p->name,p->tel,p->row);break;

}

else(strcmp(p->name,z)&&p->next==NULL)

{printf("找不到\n");break;}

这样的话就判断不了是否找不到,所以我把判断找不到也单独写成if 句子独立出来。

修改函数对节点的数据进行修改的做法是新建一个节点,把用户输入的新信息存入到这个节点里,然后用strcpy(p->name,q->name)函数将新的节点里的信息复制到原来的节点中,用free()释放新建的节点,修改名字和电话大同小异,分组修改是直接将新的数据放入之前定义的分组数组a1中,strcpy(p->row,a1)。

增加函数问题不大,先将p指针移向表尾,从表尾添加

while(p->next!=NULL) //到链表的最后的节点

{p=p->next;}

最后将p->next指向新的节点,新节点的next为空。而对于分组而言,直接将信息复制到已经建好的数组中就好了,此数组存储着成员的分组信息。

遇到的问题及心得体会之孙海亮

我遇到的问题和处理方法:

我负责的删除模块要实现两个删除功能:1.姓名2.关系(1.家人2.朋友3.同学4.同事5.其他分组)看似复杂其实实现过程很简单。1.我所需要处理的就是查找所需要删除的结点所以会遇到重名现象在关系删除中必须把同一分组的信息全部查到并删除,但刚开始时我想的是判断是否满足p->next==NULL若不满足继续查找、删除直到p->next为空,但将条件放进程序无法跳出没有实现重名的删除,只是基本的逐个删除,是我的能力有限。最难的问题也没得到基本解决。

2.找到了我所需要的结点所考虑的是怎么样删除,不能够像以前用strcpy将空赋给原结点,显然是错误的。在链表中我的判断条件是if(!strcmp(p->name,z))当z与p->name相等时这就利用到了链表的删除方式用q->next=p->next绕过了所要删除的结点q结点信息被系统回收,继续利用q结点p=p->next后移直到p->next==NULL,break跳出了循环结束遍历。

3.在关系删除里删除方法与姓名相同唯一的问题是我们不可能让用户去输入关系而是去选择,所以我先声明了一个char x【30】,在全局中用a1[],a2[],a3[],a4[],a5[]存放了关系的字符,建立switch选择关系,按照选择将所存放的字符用strcpy函数复制到x【】中,同上遍历每个结点进行顺序查找完成关系删除

心得体会:

这次经过我和秦齐辉和宋浩三人的合作让我感觉到了团队的力量,往往一个人遇到了问题大家通过讨论和学习一个打的困难变成了

一个小的问题,很自然就解决了。这次的所完成的程序可以说是对所学知识的一次检验,是结合了本学期理论的一次实践。以前只是局限于几个简单的功能实现而不能结合到实际的软件的编写,当然我们这次的作品可以说是只能算是雏形。毕竟是大家一起做出来的还是很欣慰的。我负责的删除模块可以说是最轻松的也是照顾到了我的水平,在做的过程中我查阅了学习资料和在爱问问题人里请教了一些高手一些我很模糊的问题,让我从中受益匪浅。让我明白了学习要多谢多问,当经历了这样一个又一个阶段方才修成正果。

对小组成员的打分

组长秦奇辉:我在本系统设计中,对系统框架的设计、前期准备工作及对小组成员的分工及各自模块之间的串联,都做到了应做的工作。在创新方面也尽了最大努力,我给自己打95分。

组员宋浩:在程序设计中,积极主动参与程序设计及讨论,在分工中也占了很大比重。态度认真,对自己工作负责,我给他打90分。

组员孙海亮:在系统设计中,很好的完成了自己的工作。在程序早期设计中,积极思考创新。我给他打90分。

相关文档
最新文档