一. 问题描述
李刚是一爱折腾的人,当然爱折腾的人均有梦想,他想当中国的盖次呢。可不,现在个人好友信息多了,复杂了,他想制作一个个人通讯录的制作管理软件。 刚好这个学期学了数据结构课,所以他准备使用数据结构知识来实现了。并考虑使用双向链表作数据结构。
1、每个好友信息包含姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日等。
2、作为一个完整的系统,应具有友好的界面和较强的容错能力。
二. 问题分析
对于通讯录,个人认为实现数据的输入、显示、插入、删除、查询的功能。程序的基本功能为:建立通讯者信息,包括姓名、编号、联系方式、生日添加新的通讯者信息;按姓名查询某个通讯者的信息;按姓名删除某个通讯者的信息;输出显示通讯录的所有信息。
在这里我选择运用双链表进行储存。双链表是在单链表的每个节点中再设置一个指向其前驱节点的指针域。双链表是一种对称结构,对于储存通讯录来说比较方便。
(1)内容:
1、通讯录内容包括:编号、姓名、联系方式、生日
(2)功能描述
1、遍历通信录。可以查看通信录中所有通信录成员的记录,该功能由函数voidPrintFromHead()实现
2、插入新联系人功能。用户可以输入以上所有内容,建立一个新的通信记录。
3、删除功能。把旧的联系人进行删除释放储存空间
4、查询功能。最重要的功能,具有姓名查询的具体功能
5、修改功能。用户可以根据需要,对任意的某个联系人的每一项信息
进行修改。
6、退出系统
三. 逻辑结构和存储结构设计
从题目的要求中,我们可以看到题目要求我使用双链表来完成这次的课程设计,因此,这次的逻辑结构为线性表。线性表是一种最基本最简单的数据结构,数据元素之间仅具有单一的前驱和后驱关系。
由于这次的题目是构造一个通信录,需要插入和删除,查询和修改等功能,因此顺序表是静态存储分配并不适合,因此在这里选取链表来克服顺序表的缺点。
链表是用一组任意的存储单元存放线性表的元素,其中,双链表是在单链表的每个结点中再设置一个指向其前驱结点的指针域。在链表中实现插入和删除操作,无需移动结点,在将工作指针指向合适的位置后,仅需修改节点之间的链接关系,所以在通信录这次的题目中使用双链表比较合理。
四. 概要算法设计
1、数据类型定义
typedef struct person//定义一个结构体类型
{
charname[15];
charsex[30];
char age[20];
charstreet[20];
char eip[20];
charphone[20];
charqq[20];
char weixin[20];
charbirth[20];
}person;
typedef struct Dulnode//双向链表结点结构类型定义
{
person *list; //值用指针形式存放
struct Dulnode *prior;
struct Dulnode *next;
}Dulnode,*Dullinklist
2、创建临时指针保留上一个节点及相应函数进行录入
Dullinklist head;
Dullinklist Enter()
{
Dullinklisth,p,s;
h=newDulnode; //头接点为空
h->prior=NULL;
h->next=NULL;
p=h;
stringstr;
cout<<"输入编号(n结束):";
cin>>str;
while(str!="n")
{
s=newDulnode;
p->next=s;
s->list=newperson;
cout<<"输入姓名:";cin>>s->list->name;
cout<<"输入性别:";cin>>s->list->sex;
cout<<"输入年龄:";cin>>s->list->age;
cout<<"输入住址:";cin>>s->list->street;
cout<<"输入邮编:";cin>>s->list->eip;
cout<<"输入电话:";cin>>s->list->phone;
cout<<"输入QQ号:";cin>>s->list->qq;
cout<<"输入微信:";cin>>s->list->weixin;
cout<<"输入生日:";cin>>s->list->birth;
cout<<endl;
s->prior=p;
s->next=NULL;
p=s;
cout<<"输入编号(n结束):";
cin>>str;
}
h->prior=s;
p->next=h;
return(h);
之后的相关操作,以此类推。
五. 时间复杂度和空间复杂度分析
和单链表类似,双链表一般也由头指针唯一确定,增加头结点也能使双链表的某些操作变得方便。这时,由书本上可知,按值查找:与输入实例有关,平均时间复杂度均为O(n),双链表上的插入和删除时间复杂度均为O (1)。空间复杂度为O(n)。
六. 源代码
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
typedef struct person//定义一个结构体类型
{
charname[15];
charsex[30];
charage[20];