资源描述
(完整word)数据结构实验报告之通讯录的实现
数据结构实验报告之通讯录的实现
一、实验题目
利用线性表实现一个通讯录管理,通信录的数据格式如下:
struct DataType
{
int ID; //编号
char name[10]; //姓名
char ch; //性别
char phone[13]; //电话
char addr[31]; //地址
};
要求:
· 实现通讯录的建立、增加、删除、修改、查询等功能
· 能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作。
· 能够保存每次更新的数据(选作)
· 能够进行通讯录分类,比如班级类、好友类、黑名单等等(选作)
· 编写测试main()函数测试线性表的正确性
二、实验目的
1、 熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法。
2、 掌握线性表的操作的实现方法 。
3、 运用线性表解决实际问题.
三、实验内容
通过编写一个C++程序完成一个简易的通讯录管理系统,能够实现建立,增加,删除,修改,查找,浏览,输出,菜单等基本功能.管理系统中每个元素含有成员的ID、姓名、性别、电话、地址等信息。程序是使用链表的功能,通过一些算法简单的实现。
四、算法思路与主要代码
1. 通信录管理结构:建立,增加,删除,修改,查找,浏览,菜单。
2.建立通讯录
构造函数,建立头节点
PHONEBOOK::PHONEBOOK()
{
first = new DataType;
first—>next = first—>prior = first;
first—〉ID = 0;
}
头插法,添加联系人
1:在堆中建立新结点
2:将 a[i]写入到新结点的数据域
3:修改新结点的指针域
4:修改头结点的指针域,将新结点加入链表中
即 1:Node 〈T〉 * s=new Node <T〉 2:s->data=a[i] 3:s—>next=front->next; 4:front—〉next=s
代码实现
void PHONEBOOK::Insert()
{
DataType *data = new DataType;
data—〉next = first—>next;
data—〉prior = first;
first-〉next = data;
data-〉next->prior = data;
m++;
data->ID = m;
3。查找联系人
按姓名查找 查找是指用户输入要查找的联系人的姓名,系统该函数内找到该联系人,返回该联系人数据域的指针,在主函数中输出该联系人的全部信息。
即1。 初始化工作指针p; 2。 循环以下操作直到p为空或找到用户 1. 如果p的数据等于i,则返回P的数据域指针; 2. P指针指向下一个节点; 3.若找不到返回空指针。
代码实现
void PHONEBOOK::Search()
{
cout << ”请输入要查找的联系人的姓名:”;
char aname[10];
cin >〉 aname;
DataType *p = first—〉next;
while (p)
{
//找到则输出信息
if (strcmp(p—〉name aname) == 0)
{
Print(p);
system(”pause");
system(”cls”);
break;
}
p = p->next;
//找不到就输出”该用户不存在"
if (p == first)
{
cout << ”该联系人不存在!” << endl;
system("pause”);
system("cls”);
break;
}
}
}
4。删除联系人
删除是指根据用户输入要删除联系人的姓名,找到该联系人结点,返回该联系人的数据域,删除此节点 .即要满足
1。 从第一个节点开始,查找到要删用户的的前一个用户节点,设P指向该节点;
2。 设q指向要删除的用户:q=p->next;
3. 摘链:p->next=q—>next;
4. 保存q节点的数据域:x=q—〉data;
5。 释放q节点:delete q; 要指出的是若在整个通讯录找不到该ID,直接跳过删除步骤,输出查无此人。
代码实现
void PHONEBOOK::Delete()
{
cout 〈< ”请输入要删除的联系人的姓名:”;
char aname[10];
cin >〉 aname;
DataType *p = first—〉next;
while (p != first)
{
//找到该联系人后确认删除
if (strcmp(p—>name aname) == 0)
{
Print(p);
cout 〈< "确定删除该联系人?(Y or N)" <〈 endl;
flag2:char s;
cin 〉〉 s;
//确认则删除
if (s == ’Y’ || s == ’y’)
{
DataType *q = p->prior;
//之后的联系人编号减一
while (q != first)
{
q—〉ID = q—>ID — 1;
q = q-〉prior;
}
//删除节点
p->next->prior = p—>prior;
p-〉prior—〉next = p->next;
delete p;
m-—;
cout << "删除完成!" << endl;
system("pause”);
system(”cls");
break;
}
5.修改联系人
用户需要修改联系人信息时,在主函数中输入用户姓名,先是调用查找模块,如果用户存在,系统就会获取该联系人的所有信息,然后重新调用输入信息模块,再次输入联系人的编号,姓名,性别,手机号,地址,输入信息后,原有信息被替换.
代码实现
void PHONEBOOK::Revise()
{
cout <〈 ”请输入要修改的联系人的姓名:”;
char aname[10];
cin 〉> aname;
DataType *p = first—>next;
while (p)
{
//找到后录入新信息
if (strcmp(p->name aname) == 0)
……………
Else
……
6.浏览通讯录
用户使用此功能时,即实现通讯录的遍历,系统会依次输出所有用户的信息。 输出的基本思想是:只要将表头的指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空值。
代码实现
oid PHONEBOOK::Show()
{
if (m == 0)
{
cout 〈〈 "通讯录空的呢,亲!" 〈< endl;
system(”pause”);
system(”cls”);
}
//循环输出联系人信息
else
{
DataType *p = first->prior;
while (p)
{
Print(p);
cout 〈〈 endl;
p = p->prior;
if (p == first)
{
system(”pause”);
system("cls”);
break;
}
}
}
}
7。菜单
利用switch case结构实现选择的功能,从而实现简易交互,启用通信录前面写好的多个功能.
代码实现
//菜单(主界面)
void PHONEBOOK::MENU()
{
bool exitFlag = false; //退出标识符
do
{
cout <〈 endl <〈 endl 〈〈 endl;
cout 〈< ”***********************************************************************" 〈< endl;
cout << " 我的通讯录 ” 〈〈 endl;
cout 〈〈 ” * * ” 〈〈 endl;
cout <〈 ” * 1。添加我的联系人 * " 〈< endl;
cout 〈< ” * 2。删除我的联系人 * " 〈〈 endl;
cout 〈< ” * 3。修改我的联系人 * " <〈 endl;
cout 〈〈 " * 4.查找我的联系人 * " 〈< endl;
cout 〈< " * 5。浏览我的通讯录 * ” 〈〈 endl;
cout << " 6。退出我的通讯录 ” 〈〈 endl;
cout 〈< " * * " << endl;
cout 〈〈 ”***********************************************************************” 〈〈 endl;
cout <〈 endl << ”请输入您要完成的操作序号:";
int k;
flag4:cin 〉> k;
switch (k)
{
case 1:system("cls”);Insert();break;
case 2:system("cls”);Delete();break;
case 3:system("cls”);Revise();break;
case 4:system(”cls");Search();break;
case 5:system(”cls”);Show();break;
case 6:exitFlag = true;break;
default:cout <〈 endl <〈 ”输入有误,请重新输入:”;goto flag4;
}
} while (!exitFlag);
cout 〈< "谢谢使用!” 〈〈 endl;
}
9.附原代码
#include<iostream〉
#include〈cstring>
using namespace std;
struct DataType
{
int ID; //编号
char name[10]; //姓名
char ch; //性别
char phone[13]; //电话
char addr[31]; //地址
DataType *prior;
DataType *next;
};
int m = 0; //全局变量,记录通讯录内数据个数
class PHONEBOOK
{
DataType *first; //定义头结点
public:
PHONEBOOK(); //建立
void Insert(); //增加
void Delete(); //删除
void Revise(); //修改
void Search(); //查找
void Show(); //浏览
void Print(DataType *p); //输出
void MENU(); //菜单
~PHONEBOOK();
};
//构造函数,建立头结点
PHONEBOOK::PHONEBOOK()
{
first = new DataType;
first->next = first-〉prior = first;
first->ID = 0;
}
//析构函数
PHONEBOOK::~PHONEBOOK()
{
DataType *p = first-〉prior;
DataType *q;
if (p == first)
delete p;
else
{
do
{
q = p;
p = p—〉prior;
delete q;
} while (p != first);
delete p;
}
}
//添加联系人(头插法)
void PHONEBOOK::Insert()
{
DataType *data = new DataType;
data-〉next = first—>next;
data—〉prior = first;
first—>next = data;
data—〉next-〉prior = data;
m++;
data—〉ID = m;
//录入信息
cout <〈 ”请输入联系人姓名:";
cin >> data-〉name; cin.sync();
flag1:cout << endl << ”请输入联系人性别( M(男) or W(女) ):”;
cin 〉〉 data—〉ch; cin。sync();
if (data-〉ch != 'M'&&data—>ch != ’W’&&data-〉ch != ’m’&&data->ch != 'w’)
{
cout 〈< "输入有误!” 〈〈 endl;
goto flag1;
}
cout 〈< endl 〈< ”请输入联系人电话号码:”;
cin >〉 data->phone; cin.sync();
cout << endl 〈< "请输入联系人地址:”;
cin 〉〉 data—>addr;
cout 〈〈 endl << ”添加完成!” << endl;
system(”pause");
system(”cls”);
}
//输出单个联系人信息
void PHONEBOOK::Print (DataType *p)
{
cout << "编号:" << p->ID <〈 endl;;
cout 〈< ”姓名:” << p—〉name 〈< endl;
cout <〈 "性别:”;
if (p-〉ch == 'm' || p—>ch == ’M')
cout 〈〈 "男" 〈< endl;
else
cout << "女” <〈 endl;
cout <〈 ”号码:" << p-〉phone 〈〈 endl;
cout <〈 ”住址:” 〈〈 p—>addr 〈< endl;
}
//查找联系人(按姓名)
void PHONEBOOK::Search()
{
cout <〈 ”请输入要查找的联系人的姓名:";
char aname[10];
cin >〉 aname;
DataType *p = first-〉next;
while (p)
{
//找到则输出信息
if (strcmp(p—〉name aname) == 0)
{
Print(p);
system(”pause");
system(”cls");
break;
}
p = p—>next;
//找不到就输出"该用户不存在”
if (p == first)
{
cout 〈< "该联系人不存在!" << endl;
system("pause”);
system(”cls");
break;
}
}
}
//删除联系人
void PHONEBOOK::Delete()
{
cout 〈< ”请输入要删除的联系人的姓名:”;
char aname[10];
cin >> aname;
DataType *p = first-〉next;
while (p != first)
{
//找到该联系人后确认删除
if (strcmp(p->name aname) == 0)
{
Print(p);
cout <〈 "确定删除该联系人?(Y or N)" << endl;
flag2:char s;
cin 〉〉 s;
//确认则删除
if (s == ’Y' || s == ’y’)
{
DataType *q = p->prior;
//之后的联系人编号减一
while (q != first)
{
q—〉ID = q-〉ID — 1;
q = q->prior;
}
//删除节点
p—〉next->prior = p—〉prior;
p-〉prior-〉next = p-〉next;
delete p;
m-—;
cout 〈< ”删除完成!” << endl;
system("pause”);
system("cls");
break;
}
//取消删除
else if (s == 'N’ || s == 'n’)
{
system("cls”);
}
else
{
cout 〈〈 ”输入有误,请重新输入:”;
goto flag2;
}
}
else
p = p—〉next;
//找不到该联系人
if (p == first)
{
cout 〈〈 "该联系人不存在!” 〈< endl;
system("pause”);
system("cls");
break;
}
}
}
//修改联系人
void PHONEBOOK::Revise()
{
cout 〈< "请输入要修改的联系人的姓名:";
char aname[10];
cin >〉 aname;
DataType *p = first—〉next;
while (p)
{
//找到后录入新信息
if (strcmp(p—>name aname) == 0)
{
cout << "请输入联系人姓名:”;
cin >〉 p->name; cin。sync();
flag3:cout 〈〈 endl 〈〈 "请输入联系人性别( M(男) or W(女)):”;
cin 〉> p—〉ch; cin。sync();
if (p->ch != 'M’&&p—>ch != 'W’&&p—〉ch != 'm'&&p->ch != 'w')
{
cout 〈〈 "输入有误!” <〈 endl;
goto flag3;
}
cout 〈< endl << "请输入联系人电话号码:";
cin >> p-〉phone; cin.sync();
cout 〈< endl 〈〈 ”请输入联系人地址:”;
cin >> p-〉addr;
cout <〈 "修改完成!" 〈〈 endl;
system("pause");
system(”cls");
break;
}
p = p->next;
//找不到联系人
if (p == first)
{
cout 〈< "该联系人不存在" << endl;
system("pause”);
system(”cls”);
break;
}
}
}
//浏览通讯录
void PHONEBOOK::Show()
{
if (m == 0)
{
cout <〈 "通讯录空的呢,亲!" 〈< endl;
system("pause”);
system("cls");
}
//循环输出联系人信息
else
{
DataType *p = first->prior;
while (p)
{
Print(p);
cout <〈 endl;
p = p->prior;
if (p == first)
{
system("pause”);
system("cls");
break;
}
}
}
}
//菜单(主界面)
void PHONEBOOK::MENU()
{
bool exitFlag = false; //退出标识符
do
{
cout <〈 endl 〈〈 endl 〈〈 endl;
cout 〈〈 ”***********************************************************************” << endl;
cout <〈 " 我的通讯录 " << endl;
cout <〈 " * * " 〈〈 endl;
cout << " * 1.添加我的联系人 * ” <〈 endl;
cout 〈〈 ” * 2。删除我的联系人 * " 〈〈 endl;
cout 〈< ” * 3。修改我的联系人 * ” 〈< endl;
cout 〈〈 " * 4.查找我的联系人 * " 〈〈 endl;
cout << " * 5.浏览我的通讯录 * " 〈〈 endl;
cout <〈 " 6.退出我的通讯录 " 〈< endl;
cout 〈< " * * " 〈< endl;
cout << ”***********************************************************************” << endl;
cout <〈 endl <〈 "请输入您要完成的操作序号:”;
int k;
flag4:cin >〉 k;
switch (k)
{
case 1:system(”cls”);Insert();break;
case 2:system(”cls");Delete();break;
case 3:system(”cls”);Revise();break;
case 4:system(”cls”);Search();break;
case 5:system(”cls");Show();break;
case 6:exitFlag = true;break;
default:cout 〈< endl << "输入有误,请重新输入:”;goto flag4;
}
} while (!exitFlag);
cout 〈〈 ”谢谢使用!" << endl;
}
//主函数(测试)
int main()
{
PHONEBOOK MyPHONEBOOK;
MyPHONEBOOK。MENU();
}
五、参考资料
数据结构与算法
展开阅读全文