📄 wangjianwangcheng.cpp
字号:
/*头文件包含******************************************/
#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 + -