1、4.编写main()函数测试操作的正确性2. 程序分析编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。每个记录包含姓名、电话号码、住址等个人基本信息。 用数据结构中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。本程序为使用方便,几乎不用特殊的命令,只需按提示输入即可,适合更多的用户使用。对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。2.1 存储结构节点结构:存储结构:带头结点和尾结点的单链表front 2.2 关键算法分析本实验从整体上分为七大模块:(1)输入联系人信息;(
2、2)添加联系人信息;(3)查找联系人信息;(4)查看联系人信息;(5)删除联系人信息;(6)修改联系人信息;(7)退出通讯录管理。通讯录系统图2.2.1通讯录的建立伪代码:1.在堆中申请新的结点;2.新节点的数据域为ai;3.将新节点加入到链表中;4.修改尾指针;5.全部结点插入后需要将终结结点的指针域设为空。C+实现:ContactBook:ContactBook(DataType a,int n)/尾插法 front=new Node; rear=new Node; rear=front; /构造空单链表 for(int i=0;idata=ai; /写入数据域 rear-next=s;
3、/将新节点加入到链表中 rear=s; /修改尾指针 rear-next=NULL; /终端节点的指针域设为空时间复杂度:o(n)2.2.2通讯录的插入插入为建立的一种特殊形式,即插入一个单独的结点,方法与上述类似void ContactBook:Add(DataType a)/尾插法 Node * s=new Node; s-data=a; rear=s;o(1)2.2.3按ID查找查找操作是指用户输入要查找的用户的ID,系统该函数内找到该用户,返回用户数据域的指针,在主函数中输出该用户的全部信息。1.初始化工作指针p;2.循环以下操作直到p为空或找到用户1.如果p的数据等于i,则返回P的数
4、据域指针;2.P指针指向下一个节点;3.若找不到返回空指针。/通讯簿按ID查找DataType * ContactBook:Get(int i) Node * p=front-next; while(p) if(p-data.ID=i)return &(p-data); /根据ID找到被查元素,返回位置 p=p- return NULL; /若找不到 ,返回空指针2.2.4通讯录的删除删除操作是指根据用户输入要删除用户的ID,找到该用户结点,返回该用户的数据域,删除此节点1.从第一个节点开始,查找到要删用户的的前一个用户节点,设P指向该节点;2.设q指向要删除的用户:q=p-next;3.摘链
5、:p-next=q-4.保存q节点的数据域:x=q-data;5. 释放q节点:deleteq;要指出的是若在整个通讯录找不到该ID,直接跳过删除步骤,输出查无此人DataType ContactBook:Delete(int i) Node * p=front; while(p-next)next-data.ID=i)break; /找到要删除的用户,跳出循环 Node * q=p- /找到该用户 if(q) p- DataType x=q- /记录用户信息 delete q; /删除用户 cout 删除成功!endl; return x; else cout 该用户不存在! 2.2.5通讯
6、录的修改当用户要进行修改用户操作时,会在主函数输入要修改用户的ID,调用查询模块,若用户存在,系统会显示找到的用户信息,然后要求依次输入该用户新的的编号,姓名,性别,手机号,地址,输入这些后,用户信息被修改/通讯簿修改Modify(DataType a,int i) DataType * p=Get(i); /按ID找到要修改的用户 * p=a; /修改用户的个人数据2.2.6通讯录的遍历显示用户选择输出通讯录,系统会依次输出所有用户的信息输出的基本思想是:只要将表头的指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空值。/通讯簿遍历PrintList()您的通讯簿信息如下:-data
7、.ID data.namedata.chdata.phonedata.addr;2.2.7通讯录的析构通讯录的析构即为单链表的析构,比较简单/析构函数ContactBook() Node *p=front; while(p) front=p; delete front;(n)2.3 其他3. 程序运行结果主函数流程图:测试截图:1.建立通讯簿2.添加新用户3.查找用户4.删除用户5.查看所有用户6.修改已有用户7.退出通讯簿管理系统4. 总结通过这次的数据结构上机试验,让我回顾了有关线性表这一章的知识,学会使用线性表解决实际问题,让我有了更深的认识和了解,能灵活的使用,同时也发现了自己的不足,
8、有些地方理解还不够深刻,出现了不少问题调试时问题主要出在内存错误上,有时指针悬挂,有时尾指针指向错误,这些都需要一步步耐心的调试才能发现,以后编程我会注意改正这些依照实验要求,在不同操作时加入了异常处理,比如要查找,删除,修改用户时,如果输入的ID不存在,系统会报错并终止操作,提高了系统的操作性这次设计的通讯簿管理系统还有些可以改进的地方,比如加入文件流后可以将每次输入的信息保存在后台的一个文件里,每次使用时读取这个文件内的信息,实现了保存每次更新的数据。我对于文件流的使用还不是很熟悉,所以没来及加入这项功能;还有在查询这一块,只实现了按编号查询,还未加入按姓名查找。附:所有源程序#inclu
9、deusing namespace std;/个人数据结构体struct DataType int ID; /用户ID; char name10; char ch; char phone13; /手机号码 char addr31;/用户结点struct Node DataType data; struct Node * next;/通讯簿类声明class ContactBookpublic: ContactBook()front=new Node;rear=new Node;front-rear=front; ContactBook(DataType a,int n); /建立 Contact
10、Book(); /析构 void Add(DataType a); /添加 DataType * Get(int i); /查找 DataType Delete(int i); /删除 void Modify(DataType a,int i); /修改 void PrintList(); /遍历private: Node * front; /头结点 Node * rear; /尾结点/通讯簿的建立/通讯簿的添加/通讯簿删除void main() DataType a5=1001,张一,m,188*1881北京, 1002,王二188*1882上海 1003,周三188*1883广州 1004
11、,陈四f188*1884天津 1005,赵五188*1885南京; ContactBook My(a,5); int choose; do 通讯簿管理系统 1.建立我的通讯簿 2.添加通讯簿的成员 3.查找通讯簿的成员 4.删除通讯簿的成员 5.查看我的通讯簿 6.修改通讯簿的成员 0.退出通讯簿管理系统 请 选 择:; cinchoose; switch(choose) case 1:endlx.IDx.namex.chx.phonex.addr; My.Add(x); 新用户添加成功! case 3: int search; 请输入要查找用户的ID:search; if(My.Get(se
12、arch) 查找到的信息如下:My.Get(search)-IDnamechphoneaddr; else coutMy.Get(del)- 确定删除该用户?(y/n): char IsDel;IsDel; if(IsDel=y) My.Delete(del); 取消删除! 用户不存在! case 5: My.PrintList(); case 6: int mod; 请输入要修改用户的ID:mod; if(My.Get(mod) DataType x;请输入修改后的ID、姓名、性别(m/f)、手机号、住址 My.Modify(x,mod); 修改成功! case 0: 退出成功! default: 输入有误! ;while(choose!=0);实验报告总字数要求不少于1000字。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1