利用线性表实现通讯录管理

来源:互联网 发布:软件国产化 概念 编辑:程序博客网 时间:2024/06/07 06:35

//实现通讯录的建立、增加、删除、修改、查询等功能

// 能够实现简单的菜单交互,即可以根据用户输入的命令,选择不同的操作。

#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 Contacts
{
DataType *first;            //定义头结点


public:
Contacts();                 //建立
void Insert();              //增加
void Delete();              //删除
void Revise();              //修改
void Search();              //查找
void Show();                //浏览
void Print(DataType *p);    //输出
void MENU();                //菜单 
~Contacts();
};




//构造函数,建立头结点
Contacts::Contacts()
{
first = new DataType;
first->next = first->prior = first;
first->ID = 0;
}




//析构函数
Contacts::~Contacts()
{


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 Contacts::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 Contacts::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 Contacts::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 Contacts::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 Contacts::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 Contacts::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 Contacts::MENU()
{
bool exitFlag = false;                //退出标识符


do
{


cout << endl << endl << endl;
cout << "***********************************************************************" << endl;
cout << "*                         通讯录(C++版)                             *" << 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;
}




//主函数(测试)
void main()
{
Contacts MyContacts;
MyContacts.MENU();

}


0 0
原创粉丝点击