?? 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 + -