//可供参考的代码,一般做这个都是有偿的
#include
#include
#include
#include
#include
using namespace std;
namespace NameRecord{
struct friend_node{
char last_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"< cout<<"按Enter键继续"< cin.get(pause);
system("cls");//清屏
int choice;
head_ptr = NULL;
tail_ptr = NULL;
myrecord.LoadFile();
do{
cout<<"1_新增记录"< cout<<"2_显示所有记录"< cout<<"3_按姓氏搜索记录"< cout<<"4_删除记录"< cout<<"5_修改记录"< cout<<"6_帮助"< cout<<"7_退出程序"< 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<<"选择无效"< 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->last_name,15);
cout<<"电话号码:";
cin.getline(new_ptr->phone_num,15);
InsertNode(new_ptr);
}
else
cout<<"警告,申请存储空间失败,不能创建新结点。"< system("cls");
}
void record::InsertNode(friend_node * new_ptr){
system("cls");
//friend_node *temp_ptr;
//情况一:双向链表为空
if(head_ptr==NULL){
new_ptr->next = NULL;
new_ptr->prior = NULL;
head_ptr = new_ptr;
tail_ptr = new_ptr;
return;
}
//情况二:如果链表中只有一个结点
if(head_ptr->next==NULL){
if(strcmp(new_ptr->last_name,head_ptr->last_name)<0)
InsertNodeAtHead(new_ptr);
else
InsertNodeAtEnd(new_ptr);
return;
}
//情况三:链表中不为一个链表
if(head_ptr->next!=NULL){
current_ptr = head_ptr;
while((current_ptr!=NULL)//这两个判断条件不能颠倒,否则会出现严重错误 !!!
&&(strcmp(new_ptr->last_name,current_ptr->last_name)>0))
current_ptr = current_ptr->next;
if(current_ptr == head_ptr)
InsertNodeAtHead(new_ptr);
else if(current_ptr == NULL )
InsertNodeAtEnd(new_ptr);
else//如果没有查找完整个表,并且满足排序条件推出,
//欲插入结点应该插入current_ptr之前
{
new_ptr->next = current_ptr;
new_ptr->prior = current_ptr->prior;
current_ptr->prior->next = new_ptr;
current_ptr->prior = new_ptr;
}
return ;
}
}
void record::InsertNodeAtHead(friend_node*new_ptr){
new_ptr->next = head_ptr;
new_ptr->prior = NULL;
head_ptr->prior = new_ptr;
head_ptr = new_ptr;
}
void record::InsertNodeAtEnd(friend_node*new_ptr){
new_ptr->prior = tail_ptr;
new_ptr->next = NULL;
tail_ptr->next = new_ptr;
tail_ptr = new_ptr;
}
/*****************************************************/
void record::ShowList(){
system("cls");
int n;
cout<<"请输入每屏显示的数目(不得大于20):"< cin>>n;
system("cls");
int i;
current_ptr = head_ptr;
if(head_ptr ==NULL){
cout<<"记录为空,还未添加记录 !"< return;
}
do{
i=1;//分屏显示
cout< do{
cout<last_name<phone_num< current_ptr = current_ptr->next;
i++;
}while(current_ptr!=NULL&&i<=n);
cin.get(pause);
if(current_ptr!=NULL){
cout<<"请按Enter键继续";
cin.get(pause);
system("cls");
}
else cout<<"文件结束"< }while(current_ptr!=NULL);
cin.get(pause);
cin.ignore(1,pause);
system("cls");
}
/*****************************************************/
void record::SearchByLastName(){
system("cls");
int flag =0;
char search_string[20];
current_ptr = head_ptr;
if(current_ptr==NULL)
cout<<"电话记录为空 !"< else{
cin.ignore(20,'\n');
cout<<"输入您要搜索的名字:";
cin.getline(search_string,20);
while(current_ptr!=NULL){
if(strcmp(current_ptr->last_name,search_string)==0){
if(flag==0)cout<<"找到记录"< flag = 1;
cout<last_name<<"\t\t";
cout<phone_num< }
current_ptr=current_ptr->next;
}
if(flag == 0){
cout<<"无该记录"< cin.get(pause);
system("cls");
}
}
}