📄 phone.cpp
字号:
#include<fstream>
#include<iostream>
#include<iomanip>
#include<string>
#include<cstdlib>
using namespace std;
namespace NameRecord{ //定义命名空间
struct friend_node //定义结点
{
char last_name[20]; //存放名字
char first_name[20]; //存放姓
char phone_num[12]; //存放电话号码
friend_node *next;
friend_node *prior; //指向前一个结点的指针
};
friend_node *head_ptr; //头指针
friend_node *tail_ptr; //尾指针
friend_node *current_ptr; //当前正在处理结点的指针
char pause; //全局变量
class record{
public:
void UserChoice(int choice); //根据用户的选择调用不同的函数
void InsertRecord(); //插入记录
void InsertNode(friend_node *new_ptr); //插入结点
void InsertNodeAtHead(friend_node *new_ptr); //插入新的头结点
void InsertNodeAtEnd(friend_node *new_ptr); //插入新的尾结点
void ShowList(); //显示记录
void DeleteRecord(); //删除记录
void DeleteNodeAtHead(); // 删除头结点
void DeleteNodeAtEnd(); //删除尾结点
void DeleteNodeAtMiddle(); //删除中间结点
int VerifyDelete(); //确认删除
void DeleteNode(); //删除结点
void DeleteList(); //删除链表
void SearchByLastName(); //根据姓氏搜索电话号码
void SaveFile(); //将链表写回文件
void LoadFile(); //将文件中的内容存入链表
void Help();
void ModifyRecord(); //新增修改功能
void UserInput(); //接收用户选择
};
}
using namespace NameRecord; //使用标准命名空间
int main()
{
record myrecord; //类的对象
cout<<"欢迎使用PhoneBook 1.0 \n";
cout<<"按Enter键继续 \n";
cin.get(pause);
system("cls"); //清屏
int choice;
head_ptr = NULL;
tail_ptr = NULL;
myrecord.LoadFile(); //从文件中读取数据
do
{
cout<<"1_新增记录 \n";
cout<<"2_显示所有记录 \n";
cout<<"3_按姓氏搜索记录 \n";
cout<<"4_删除记录 \n";
cout<<"5_修改记录 \n";
cout<<"6_帮助 \n";
cout<<"7_退出程序 \n";
cout<<"输入你的选择:";
cin>>choice;
myrecord.UserChoice(choice); //处理用户选择
}while(choice != 7);
return 0;
}
void record::UserChoice(int choice)
{
switch(choice)
{
case 1:
InsertRecord(); //增加记录
break;
case 2:
ShowList(); //显示记录
break;
case 3:
SearchByLastName(); //搜索记录
break;
case 4:
DeleteRecord();
break;
case 5:
ModifyRecord(); //修改记录
break;
case 6:
Help();
break;
case 7:
SaveFile(); //选择退出,将电话薄资料存入文件
if(head_ptr != NULL)
DeleteList();
break;
default:
cout<<"选择无效 \n";
break;
}
}
void record::InsertRecord()
{
friend_node *new_ptr; //定义结点指针
new_ptr = new friend_node;
if(new_ptr != NULL)
{
system("cls");
cin.ignore(20,'\n');
cout<<"名字:";
cin.getline(new_ptr->first_name,15); //从键盘接受的名字赋给结点对应的成员
cout<<"姓氏:";
cin.getline(new_ptr->last_name,20);
cout<<"电话号码:";
cin.getline(new_ptr->phone_num,15);
InsertNode(new_ptr); //将结点插入双向链表
}
else
cout<<"警告:申请存储空间失败,不能创建新接结点. \n";
system("cls");
}
void record::InsertNode(friend_node *new_ptr) //将结点插入双向链表
{
system("cls");
friend_node *temp_ptr;
//情况1:双向链表为空
if(head_ptr == NULL)
{
new_ptr->next = new_ptr;
new_ptr->prior = new_ptr;
head_ptr = new_ptr;
tail_ptr = new_ptr;
return;
}
//情况2:链表中只有1个结点
if(head_ptr->next == head_ptr)
{
if( strcmp(new_ptr->last_name,head_ptr->last_name) < 0 )
//
InsertNodeAtHead(new_ptr);
else
InsertNodeAtEnd(new_ptr);
return;
}
//情况3:链表中有多个结点
if(head_ptr->next != head_ptr)
{
current_ptr = head_ptr->next;
while( (strcmp(new_ptr->last_name,current_ptr->last_name) > 0) && (current_ptr != head_ptr) )
current_ptr = current_ptr->next;
if(current_ptr == head_ptr)
InsertNodeAtEnd(new_ptr);
else
//
{
temp_ptr = current_ptr->prior;
temp_ptr->next = new_ptr;
new_ptr->prior = temp_ptr;
current_ptr->next = current_ptr;
}
return;
}//end if
}
void record::InsertNodeAtHead(friend_node *new_ptr)
{
new_ptr->next = head_ptr;
new_ptr->prior = tail_ptr;
head_ptr->prior = new_ptr;
tail_ptr->next =new_ptr;
head_ptr = new_ptr;
}
void record::InsertNodeAtEnd(friend_node *new_ptr)
{
new_ptr->next = head_ptr;
tail_ptr->next = new_ptr;
new_ptr->prior = tail_ptr;
head_ptr->prior = new_ptr;
tail_ptr = new_ptr;
}
void record::ShowList()
{
system("cls");
int n;
cout<<"请输入每屏显示的数目(不得大于20): \n";
cin>>n;
system("cls");
int i;
char fullname[36];
current_ptr = head_ptr;
do{
i =1;
cout<<setw(20)<<"Name"<<setw(20)<<"Phone Number \n";
do{
strcpy(fullname,current_ptr->last_name);
strcat(fullname,",");
strcat(fullname,current_ptr->first_name);
cout<<setw(20)<<fullname<<setw(20)<<current_ptr->phone_num<<endl;
current_ptr = current_ptr->next;
i++;
}while(current_ptr != head_ptr && i <= n);
cin.get(pause);
if(current_ptr != head_ptr) //如果一屏未显示完整
{
cout<<"请按Enter键继续";
cin.get(pause);
system("cls");
}
else
cout<<"文件结束!";
}while(current_ptr != head_ptr);
cin.get(pause);
cin.ignore(1,pause);
system("cls");
}
void record::SearchByLastName()
{
system("cls");
int nFlag = 0; //找到符合条件结点时,赋值为1
char search_string[20];
current_ptr = head_ptr;
if(current_ptr == NULL)
cout<<"电话记录为空!";
else
{
cin.ignore(20,'\n');
cout<<"\n输入你要搜索记录的形姓氏:";
cin.getline(search_string,20);
if(strcmp(current_ptr->last_name,search_string) == 0)
{
if(nFlag == 0)
cout<<"找到结点 \n";
nFlag = 1;
cout<<current_ptr->first_name<<' '<<current_ptr->last_name<<"\t\t";
cout<<current_ptr->phone_num<<endl;
}
current_ptr = current_ptr->next;
while(current_ptr != head_ptr)
{
if( strcmp(current_ptr->last_name,search_string) == 0 )
{
if(nFlag == 0)
cout<<"找到记录 \n";
nFlag = 1;
cout<<current_ptr->first_name<<' '<<current_ptr->last_name<<"\t\t";
cout<<current_ptr->phone_num<<endl;
}
current_ptr = current_ptr->next;
}
if(nFlag == 0)
{
cout<<"无记录!";
cin.get(pause);
system("cls");
}
}
}
void record::DeleteRecord()
{
system("cls");
char search_string[20];
friend_node *previous_ptr;
previous_ptr = NULL;
current_ptr = head_ptr;
if(current_ptr == NULL)
{
cout<<"没有要删除的记录!";
return;
}
cin.ignore(20,'\n');
int nFlag = 0;
cout<<"\n输入你要删除结点的姓氏:";
cin.getline(search_string,20);
while( (strcmp(current_ptr->last_name,search_string) == 0) && head_ptr != NULL)
//
{
nFlag = 1;
cout<<"\n找到记录\n";
cout<<current_ptr->first_name<<' '<<current_ptr->last_name<<"\t\t";
cout<<current_ptr->phone_num<<endl;
if(VerifyDelete())
{
DeleteNode();
cout<<"\n记录已删除\n";
}
else
{
cout<<current_ptr->first_name<<","<<current_ptr->last_name<<"\t"<<current_ptr->phone_num<<"的记录已删除\n";
current_ptr = current_ptr->next;
}
}
do{
if(strcmp(current_ptr->last_name,search_string) == 0)
{
nFlag = 1;
cout<<"\n找到记录\n";
cout<<current_ptr->first_name<<' '<<current_ptr->last_name<<"\t\t";
cout<<current_ptr->phone_num<<endl;
if(VerifyDelete())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -