数据结构实验一 通讯录Word格式.docx
- 文档编号:17936450
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:19
- 大小:200.30KB
数据结构实验一 通讯录Word格式.docx
《数据结构实验一 通讯录Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验一 通讯录Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
4.编写main()函数测试操作的正确性
2.程序分析
编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。
每个记录包含姓名、电话号码、住址等个人基本信息。
用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。
本程序为使用方便,几乎不用特殊的命令,只需按提示输入即可,适合更多的用户使用。
对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
2.1存储结构
节点结构:
存储结构:
带头结点和尾结点的单链表
front
2.2关键算法分析
本实验从整体上分为七大模块:
(1)输入联系人信息;
(2)添加联系人信息;
(3)查找联系人信息;
(4)查看联系人信息;
(5)删除联系人信息;
(6)修改联系人信息;
(7)退出通讯录管理。
通讯录系统图
2.2.1通讯录的建立
伪代码:
1.在堆中申请新的结点;
2.新节点的数据域为a[i];
3.将新节点加入到链表中;
4.修改尾指针;
5.全部结点插入后需要将终结结点的指针域设为空。
C++实现:
ContactBook:
:
ContactBook(DataTypea[],intn)//尾插法
front=newNode;
rear=newNode;
rear=front;
//构造空单链表
for(inti=0;
i<
n;
i++)
{
Node*s=newNode;
//建立新节点
s->
data=a[i];
//写入数据域
rear->
next=s;
//将新节点加入到链表中
rear=s;
//修改尾指针
}
rear->
next=NULL;
//终端节点的指针域设为空
}
时间复杂度:
o(n)
2.2.2通讯录的插入
插入为建立的一种特殊形式,即插入一个单独的结点,方法与上述类似
voidContactBook:
Add(DataTypea)//尾插法
Node*s=newNode;
s->
data=a;
rear=s;
o
(1)
2.2.3按ID查找
查找操作是指用户输入要查找的用户的ID,系统该函数内找到该用户,返回用户数据域的指针,在主函数中输出该用户的全部信息。
1.初始化工作指针p;
2.循环以下操作直到p为空或找到用户
1.如果p的数据等于i,则返回P的数据域指针;
2.P指针指向下一个节点;
3.若找不到返回空指针。
//通讯簿按ID查找
DataType*ContactBook:
Get(inti)
Node*p=front->
next;
while(p)
if(p->
data.ID==i)return&
(p->
data);
//根据ID找到被查元素,返回位置
p=p->
returnNULL;
//若找不到,返回空指针
2.2.4通讯录的删除
删除操作是指根据用户输入要删除用户的ID,找到该用户结点,返回该用户的数据域,删除此节点
1.从第一个节点开始,查找到要删用户的的前一个用户节点,设P指向该节点;
2.设q指向要删除的用户:
q=p->
next;
3.摘链:
p->
next=q->
4.保存q节点的数据域:
x=q->
data;
5.释放q节点:
deleteq;
要指出的是若在整个通讯录找不到该ID,直接跳过删除步骤,输出查无此人
DataTypeContactBook:
Delete(inti)
Node*p=front;
while(p->
next)
next->
data.ID==i)break;
//找到要删除的用户,跳出循环
Node*q=p->
//找到该用户
if(q)
p->
DataTypex=q->
//记录用户信息
deleteq;
//删除用户
cout<
<
"
删除成功!
endl;
returnx;
else{
cout<
该用户不存在!
}
2.2.5通讯录的修改
当用户要进行修改用户操作时,会在主函数输入要修改用户的ID,调用查询模块,若用户存在,系统会显示找到的用户信息,然后要求依次输入该用户新的的编号,姓名,性别,手机号,地址,输入这些后,用户信息被修改
//通讯簿修改
Modify(DataTypea,inti)
DataType*p=Get(i);
//按ID找到要修改的用户
*p=a;
//修改用户的个人数据
2.2.6通讯录的遍历显示
用户选择输出通讯录,系统会依次输出所有用户的信息
输出的基本思想是:
只要将表头的指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空值。
//通讯簿遍历
PrintList()
您的通讯簿信息如下:
-------------------------------"
data.ID<
"
data.name<
data.ch<
data.phone<
data.addr;
2.2.7通讯录的析构
通讯录的析构即为单链表的析构,比较简单
//析构函数
~ContactBook()
Node*p=front;
while(p){
front=p;
deletefront;
(n)
2.3其他
3.程序运行结果
主函数流程图:
测试截图:
1.建立通讯簿
2.添加新用户
3.查找用户
4.删除用户
5.查看所有用户
6.修改已有用户
7.退出通讯簿管理系统
4.总结
通过这次的数据结构上机试验,让我回顾了有关线性表这一章的知识,学会使用线性表解决实际问题,让我有了更深的认识和了解,能灵活的使用,同时也发现了自己的不足,有些地方理解还不够深刻,出现了不少问题
调试时问题主要出在内存错误上,有时指针悬挂,有时尾指针指向错误,这些都需要一步步耐心的调试才能发现,以后编程我会注意改正这些
依照实验要求,在不同操作时加入了异常处理,比如要查找,删除,修改用户时,如果输入的ID不存在,系统会报错并终止操作,提高了系统的操作性
这次设计的通讯簿管理系统还有些可以改进的地方,比如加入文件流后可以将每次输入的信息保存在后台的一个文件里,每次使用时读取这个文件内的信息,实现了保存每次更新的数据。
我对于文件流的使用还不是很熟悉,所以没来及加入这项功能;
还有在查询这一块,只实现了按编号查询,还未加入按姓名查找。
附:
所有源程序
#include<
iostream>
usingnamespacestd;
//个人数据结构体
structDataType{
intID;
//用户ID;
charname[10];
charch;
charphone[13];
//手机号码
charaddr[31];
//用户结点
structNode{
DataTypedata;
structNode*next;
//通讯簿类声明
classContactBook
public:
ContactBook(){front=newNode;
rear=newNode;
front->
rear=front;
}
ContactBook(DataTypea[],intn);
//建立
~ContactBook();
//析构
voidAdd(DataTypea);
//添加
DataType*Get(inti);
//查找
DataTypeDelete(inti);
//删除
voidModify(DataTypea,inti);
//修改
voidPrintList();
//遍历
private:
Node*front;
//头结点
Node*rear;
//尾结点
//通讯簿的建立
//通讯簿的添加
//通讯簿删除
voidmain()
DataTypea[5]={{1001,"
张一"
'
m'
"
188****1881"
北京"
},
{1002,"
王二"
188****1882"
上海"
{1003,"
周三"
188****1883"
广州"
{1004,"
陈四"
f'
188****1884"
天津"
{1005,"
赵五"
188****1885"
南京"
}};
ContactBookMy(a,5);
intchoose;
do{
通讯簿管理系统"
1.建立我的通讯簿"
2.添加通讯簿的成员"
3.查找通讯簿的成员"
4.删除通讯簿的成员"
5.查看我的通讯簿"
6.修改通讯簿的成员"
0.退出通讯簿管理系统"
请选择:
;
cin>
>
choose;
switch(choose)
case1:
endl<
通讯簿建立成功"
break;
case2:
DataTypex;
请输入新用户的ID、姓名、性别(m/f)、手机号、住址"
cin>
x.ID>
x.name>
x.ch>
x.phone>
x.addr;
My.Add(x);
新用户添加成功!
case3:
intsearch;
请输入要查找用户的ID:
search;
if(My.Get(search)){
查找到的信息如下:
My.Get(search)->
ID<
name<
ch<
phone<
addr;
else
cout<
case4:
intdel;
请输入要删除用户的ID:
del;
if(My.Get(del)){
My.Get(del)->
My.Get
(del)->
确定删除该用户?
(y/n):
charIsDel;
IsDel;
if(IsDel=='
y'
)
My.Delete(del);
取消删除!
用户不存在!
case5:
My.PrintList();
case6:
intmod;
请输入要修改用户的ID:
mod;
if(My.Get(mod)){
DataTypex;
请输入修改后的ID、姓名、性别(m/f)、手机号、住址"
My.Modify(x,mod);
修改成功!
case0:
退出成功!
default:
输入有误!
};
}while(choose!
=0);
实验报告总字数要求不少于1000字。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验一 通讯录 数据结构 实验