⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phone.cpp

📁 用双向链表实现电话薄的所有功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -