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

📄 wangjianwangcheng.cpp

📁 由两个文件组成的带密码的电话簿管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*头文件包含******************************************/

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<assert.h>	
#include<fstream.h>
#include<iomanip.h>

//调用密码程序
int mima()
{
	 int p;
      ifstream infile("mima.dat",ios::in);
      infile>>p;
	 return p;
}


/*类定义***********************************************/

struct Entry	//数据体
{
	char Name[20],Tel[20],Time[30];   
};


class Node	//节点类
{
	friend class DoubleLinkList;

    private : Entry Data;
			  Node *Next, *Prev;

	public : Node();
			 Node(Entry & Value );
			 void show();
};


class DoubleLinkList	//链表类
{
	private : Node *FirstNode, *RearNode;
			  char LowedIn[20], LowedName[20];

	public : DoubleLinkList();
			 ~DoubleLinkList();
			 bool IsEmpty();
			 bool IsValid(char *InName);
			 bool Remove(int index);
			 bool CompName(char *InName,char *Name);
			 bool FileInDic();
			 void LoadFromFile();
			 void SaveToFile();
			 void ZNSearch(char *FirstLetter);
			 void Insert(Entry &Value);
			 void SearchByName(char *InName);
			 void SearchByIndex(int index);
			 void Edit(int index);
			 void Helpme();
			 void EditName(int index);
			 void EditTel(int index);
			 char *gettime();
			 void ShowAll();
			 int LengthOfList();
			 Node *Create(Entry &Value);
};

/*函数******************************************/

Node::Node()	//结点缺省构造
: Next(NULL), Prev(NULL){}


Node::Node(Entry &Value)	//结点数据构造
: Data(Value), Next(NULL), Prev(NULL){}


void Node::show()	//显示结点
{
	cout<<"姓名:"<<Data.Name<<'\n'
		<<"电话:"<<Data.Tel<<'\n'
		<<"创建时间:"<<Data.Time<<"\n\n";
}


DoubleLinkList::DoubleLinkList()	//链表构造
: FirstNode(NULL),RearNode(NULL){}


DoubleLinkList::~DoubleLinkList()	//链表析构
{
	Node *CNode=FirstNode, *Temp;
	while (CNode!=NULL)
	{
		Temp=CNode;
		CNode=CNode->Next;
		delete Temp;
	}
}

bool DoubleLinkList::IsEmpty()
{
	if (FirstNode==NULL)	return true;
	else	return false;
}


void DoubleLinkList::ShowAll()	//显示全部数据
{
	system("cls");
	if (IsEmpty())	cerr<<"---通讯录中无内容!---\n\n";
	else
	{
		Node *CNode=FirstNode;
		cout<<"---按字母顺序显示通讯录---\n\n";
		for (int index=1; CNode; index++)
		{
			cout<<"序号 -"<<index<<"-"<<'\n';
			CNode->show();
			if (index%4==0)
			{
				cerr<<"---按Enter键翻页---\n\n";
				getch();
			}
			CNode=CNode->Next;
		}
		cerr<<"\n---通讯录中共有"<<LengthOfList()<<"个条目---\n\n";	
	}
	cerr<<"---按Enter键继续---";	
	getch();
}


bool DoubleLinkList::Remove(int index)	//删除结点
{	
	if (IsEmpty())
	{
		return false;
	}

	if (index>LengthOfList())
	{	
		return false;
	}
	
	if (index==1)
	{
		Node *CNode=FirstNode;
		if (FirstNode==RearNode)
		{
			FirstNode=NULL;
			RearNode=NULL;
		}
		else
		{
			FirstNode=FirstNode->Next;
			FirstNode->Prev=NULL;
		}
		delete CNode;
		return true;
	}

	if (index==LengthOfList())
	{
		Node *CNode=RearNode;
		if (FirstNode==RearNode)
		{
			FirstNode=NULL;
			RearNode=NULL;
		}
		else
		{
			RearNode=RearNode->Prev;
			RearNode->Next=NULL;
		}
		delete CNode;
		return true;
	}
	else
	{

		Node *CNode=FirstNode, *TempNode, *TEmpNode;
		int position=1;
		while (position!=index)
		{
			CNode=CNode->Next;
			position++;
		}
		TempNode=CNode;
		CNode=CNode->Next;
		CNode->Prev=TempNode->Prev;
		TEmpNode=TempNode->Prev;
		TEmpNode->Next=CNode;
		delete TempNode;
		return true;
	}
}


int DoubleLinkList::LengthOfList()		//返回链表条目数
{
	int Count=0;
	Node *CNode=FirstNode;
	while (CNode)
	{
		Count++;
		CNode=CNode->Next;
	}
	return Count;
}


Node * DoubleLinkList::Create(Entry &Value)		//创建一个条目
{
	Node *NewNode=new Node(Value);
	assert (NewNode!=NULL);
	return NewNode;
}


bool DoubleLinkList::IsValid(char *InName)		//输入名字合法性判断
{
	while (*InName)
	{
		if ((*InName>='A'&&*InName<='Z')||(*InName>='a'&&*InName<='z')||(*InName=='*')||(*InName=='?'))
		{
			InName++;			
		}
		else
		{
			cout<<"----姓名只能包含英文字母,请重新输入!---\n";
			return false;
		}
	}
	return true;
}


bool DoubleLinkList::CompName(char * InName,char * Name)	//姓名带通配符匹配(Known bug:'*'与'?'连用时可能匹配不正确)
{
	char *a=InName, *b=Name, *bEnd=(Name+19);
	while(*a&&*b)
	{
		if (*a=='*')
		{
			while(*b)
			{
				if (*(a+1)!=NULL)
				{
					for(;bEnd>=b;bEnd--)	//从后向前匹配'*'后第一个字符,防止出现多字符重复导致不匹配
					{
					
						if (*bEnd==*(a+1) )
						{
							b=bEnd;
							break;
						}
						else;
					}
					bEnd=(Name+19);
					a++;
				}
				else return true;
			}
		}
		else
		{
			if ((*a=='?')||(*a==*b))
			{
				a++;
				b++;
			}
			else return false;
		}
	}

	if (*a==NULL&&*b==NULL) return true;
	else return false;
}


void DoubleLinkList::Insert(Entry &Value)	//排序插入
{
	Node *NewNode=Create(Value);
	if (IsEmpty())
	{
		FirstNode=NewNode;
		RearNode=NewNode;
	}

	else
	{
		Node *CNode=FirstNode;
		for (int index=1;index<=LengthOfList();)
		{
			strcpy(LowedIn,Value.Name);
			strcpy(LowedName,CNode->Data.Name);
			strlwr(LowedIn);
			strlwr(LowedName);
			if (strcmp(LowedIn,LowedName)<0)	break;
			else 
			{
				index++;
				CNode=CNode->Next;
			}
		}

		if (index==1)
		{
			FirstNode->Prev=NewNode;
			NewNode->Next=FirstNode;
			FirstNode=NewNode;
			FirstNode->Prev=NULL;
		}

		else
		{
			if (index>LengthOfList())
			{
				NewNode->Prev=RearNode;
				RearNode->Next=NewNode;
				RearNode=NewNode;
				RearNode->Next=NULL;
			}

			else
			{
				Node *CNode=FirstNode, *TempNode;
				int position=1;
				while (position!=index)
				{
					CNode=CNode->Next;
					position++;
				}
				TempNode=CNode;
				NewNode->Prev=CNode->Prev;
				NewNode->Next=CNode;
				CNode=CNode->Prev;
				CNode->Next=NewNode;
				TempNode->Prev=NewNode;
			}
		}
	}
}


void DoubleLinkList::Edit(int index)	//编辑结点
{
	int optionB=0, position=1;
	Entry NewEntry;
	Node *CNode=FirstNode;
	do
	{
		cout<<"输入姓名:";
		cin>>NewEntry.Name;
	}
	while (!IsValid(NewEntry.Name));
	cout<<"电话:";
	cin>>NewEntry.Tel;
	strcpy(NewEntry.Time,gettime());
	system("cls");
	cout<<"\n确定要将\n";
	while (position!=index)
	{
		CNode=CNode->Next;
		position++;
	}
	CNode->show();
	cout<<"替换为:\n";
	cout<<"姓名:"<<NewEntry.Name<<'\n'
		<<"电话:"<<NewEntry.Tel<<'\n'
		<<"时间:"<<NewEntry.Time<<"\n?\n\n";
	cout<<"--1.确定    2.取消--\n";
	cin>>optionB;
	if (optionB==1)
	{
		Remove(index);
		Insert(NewEntry);
		cout<<"---内容已修改---\n";
	}
}



void DoubleLinkList::SearchByIndex(int index)	//根据序号搜索并改动
{
	int position=1,option=3,optionB=2,optionC;
	Node *CNode=FirstNode;
	if (index>LengthOfList())	cout<<"---WARNING:序号有误!---\n";
	else
	{
		while (position!=index)
		{
			CNode=CNode->Next;
			position++;
		}
		CNode->show();
		cout<<"--1.修改    2.删除    3.取消--\n";
		cin>>option;
		switch(option)
		{
			case 1: cout<<"--1.全部修改    2.只修改姓名   3.只修改电话号码--\n";
					cin>>optionC;
					switch(optionC)
					{    case 1:Edit(index);
					        break;
					     case 2:EditName(index);
							    break;
						 case 3:EditTel(index);
							    break;
						 default :break;
						}
			      break;

			case 2: cout<<"---确定删除该条目?---\n"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -