目录一.程序功能分析******************
二.主要数据结构*******************
三.主要特色**********************
四.源代码*************************
五.测试数据组******************
六.心得和感想********************
1
一、程序功能分析
实现以下功能:
1) 通讯录编辑(输入、储存、添加、删除、显示);
2) 按不同的项进行查找;
3) 对已存在的通讯录按不同的项排序;
4) 将通讯录写入文件;
5) 从文件读入通讯录。
二、主要数据结构
class Node
{
char Name[10];//姓名
int OfficePhone;//办公室电话
int HomePhone;//住宅电话
char MobilePhone[15];//手机号码
char EMail[20];//email地址
Node *Next;//下一结点指针
public:
Node(char *pname=NULL, int ophone=0, int hphone=0,char *pmphone=NULL, char *pemail=NULL);
void Show();//显示结点数据 void SetName(char *name);//修改姓名
void SetOfficePhone(int o);//修改办公室电话
void SetHomePhone(int h);//修改住宅电话
void SetMobilePhone(char *m);//修改手机号码
void SetEMail(char *e);//修改email地址
friend class AddrList;//将AddrList类说明为友元类
friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数
friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数
};
class AddrList
{
Node *HeadPtr;//链表首指针
Node *TailPtr;//链表尾指针
int Tag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序
public: //成员函数
AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)//构造函数,产生空链表,将tag的值置为1
void AddTail(Node *p)//将p指向的结点加入到链表尾部
void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中
Node *LookUp(char *name)//按姓名查找结点,返回该结点指针
void del(char *name)//删除指定姓名的结点
void Sort(int tag)//按tag指定的关键字重新排序
2
void ShowAll()//显示全部结点,每10个显示一屏
void SetTag(int t)//置Tag值
int GetTag()//取tag值
Node *GetHeadPtr()//取首指针
~AddrList()//释放链表空间
void CreateList(char *filename)//从二进制文件中读入数据,//构造链表
void WriteToFile(char *filename)//将链表中数据//写入指定的二进制文件
};
三、主要特色
本程序主要特色有两个方面:
1.使用了链表和类共同完成通讯录各个功能的操作。
2.由于动态链表建立,可以自由使用。
四、源代码
#include
#include
#include
#include
#include
class Node
{ char Name[10];//姓名
int OfficePhone;//办公室电话
int HomePhone;//住宅电话
char MobilePhone[15];//手机号码
char EMail[20];//email地址
Node *Next;//下一结点指针
public:
Node(char *pname=NULL, int ophone=0, int hphone=0,
char *pmphone=NULL, char *pemail=NULL)
{
if(pname) strcpy(Name, pname);
else strcpy(Name, " ");
OfficePhone=ophone;
HomePhone=hphone;
if(pmphone) strcpy(MobilePhone, pmphone);
else strcpy(MobilePhone, " ");
if(pemail) strcpy(EMail, pemail);
else strcpy(EMail, " ");
}
void Show()//显示结点数据
{
cout< (H)"< } 3 void SetName(char *name)//修改姓名 { strcpy(Name,name); } void SetOfficePhone(int o)//修改办公室电话 { OfficePhone=o; } void SetHomePhone(int h)//修改住宅电话 { HomePhone=h; } void SetMobilePhone(char *m)//修改手机号码 { strcpy(MobilePhone,m); } void SetEMail(char *e)//修改email地址 { strcpy(EMail,e); } friend class AddrList;//将AddrList类说明为友元类 friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数 friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数 }; //链表类 class AddrList { Node *HeadPtr;//链表首指针 Node *TailPtr;//链表尾指针 int Tag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序 public: //成员函数 AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)//构造函数,产生空链表,将tag的值置为1 { HeadPtr=head; TailPtr=tail; Tag=tag; } void AddTail(Node *p)//将p指向的结点加入到链表尾部 { if(HeadPtr==NULL) { HeadPtr=p; TailPtr=p; p->Next=NULL; } else { TailPtr->Next=p; 4 p->Next=NULL; TailPtr=p; } } void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中 { Node *p1, *p2; if(Tag==1)//按姓名排序 { if(HeadPtr==NULL)//如果插入前原始链表为空链表 { HeadPtr=p; TailPtr=p; p->Next=NULL; } else { if(strcmp(p->Name, HeadPtr->Name)<=0)//插在链表首部 { p->Next=HeadPtr; HeadPtr=p; } else//插在链表中间或尾部 { p1=HeadPtr; p2=HeadPtr; while(p2->Next&&(strcmp(p2->Name, p->Name)<0))//查找待插入位置 {p1=p2; p2=p2->Next;} if(strcmp(p2->Name, p->Name)<0)//插在链表尾部 {p2->Next=p; p->Next=NULL; TailPtr=p;} else//插在链表中间,p2之前 {p->Next=p2; p1->Next=p;} } } } else//按办公室电话排序 { if(HeadPtr==NULL)//如果插入前原始链表为空链表 { HeadPtr=p; TailPtr=p; p->Next=NULL; } else { if((p->OfficePhone-HeadPtr->OfficePhone)<=0)//插在链表首部 { p->Next=HeadPtr; HeadPtr=p; 5 } else//插在链表中间或尾部 { p1=HeadPtr; p2=HeadPtr; while(p2->Next&&((p2->OfficePhone-p->OfficePhone)<0))//查找待插入位置 {p1=p2; p2=p2->Next;} if((p2->OfficePhone-p->OfficePhone)<0)//插在链表尾部 {p2->Next=p; p->Next=NULL; TailPtr=p;} else//插在链表中间,p2之前 {p->Next=p2; p1->Next=p;} } } } } Node *LookUp(char *name)//按姓名查找结点,返回该结点指针 { Node *p; p=HeadPtr; while(p!=NULL) { if(strcmp(p->Name, name)==0) return p; p=p->Next; } return NULL; } void del(char *name)//删除指定姓名的结点 { Node *p1, *p2; if(strcmp(HeadPtr->Name, name)==0)//若待删除的结点为首结点 { p1=HeadPtr; HeadPtr=HeadPtr->Next; delete p1; cout<<"删除了联系人"< system("pause"); } else//删除其他结点 { p1=HeadPtr; p2=HeadPtr; while(strcmp(p2->Name, name)!=0&&p2->Next!=NULL) { p1=p2; p2=p2->Next; } if(strcmp(p2->Name, name)==0) { p1->Next=p2->Next; 6 delete p2; cout<<"删除了一个联系人的信息!"< system("pause"); } } } void Sort(int tag)//按tag指定的关键字重新排序 { Node *p1, *p2; Tag=tag; p2=HeadPtr; HeadPtr=NULL; TailPtr=NULL; while(p2) { p1=p2->Next; AddSort(p2); p2=p1; } TailPtr->Next=NULL; } void ShowAll()//显示全部结点,每10个显示一屏 { int n=0; Node *p; if(HeadPtr==NULL) { cout<<"链表为空,没有记录可显示!"< } else for(p=HeadPtr; p!=NULL; p=p->Next) { p->Show(); n++; if(n%10==0) {cout<<"按任意键显示下一屏:"< } void SetTag(int t)//置Tag值 {Tag=t;} int GetTag()//取tag值 {return Tag;} Node *GetHeadPtr()//取首指针 {return HeadPtr;} ~AddrList()//释放链表空间 { Node *p; if(HeadPtr==NULL) ; else { while(HeadPtr) 7 { p=HeadPtr; HeadPtr=HeadPtr->Next; delete p; } } } void CreateList(char *filename)//从二进制文件中读入数据,//构造链表 { ifstream infile(filename, ios::in|ios::binary|ios::nocreate); if(!infile) {cout<<"文件"< else { infile.read((char *)&Tag, 4);//读出二进制文件的第1个数据Tag int n; infile.read((char *)&n, 4);//读出记录数 Node *p; for(int i=0; i { p=new Node; infile.read((char *)p, sizeof(Node)); AddTail(p); } } infile.close(); cout<<"数据从二进制文件加载成功!"< } void WriteToFile(char *filename)//将链表中数据 //写入指定的二进制文件 { ofstream outfile; outfile.open(filename, ios::out|ios::binary); outfile.write((char *)&Tag, 4); Node *p, *p1; int n=0; for(p1=HeadPtr; p1!=NULL; p1=p1->Next) n++; outfile.write((char *)&n, 4); p=HeadPtr; while(p) { outfile.write((char *)p, sizeof(Node)); p=p->Next; } cout<<"成功导出二进制文件"< outfile.close(); } }; void DisplayMenu()//主菜单 8 { char *menu[]={ " ", " ", " ", " ", " ***********通讯录管理系统************* ", " ", " 1. Add Record ", " 2. Delete Record", " 3. Display All Record", " 4. Query by Name", " 5. Modify Record", " 6. Add from a Text File", " 7. Write to a Text File", " 8. Sort", " 9. Quit", " 请选择(1--9) : ", " ", " ************************************** ", NULL } ; system("cls"); for (int i=0;menu[i];i++) cout << menu[i]< }; for(int i=0;menu[i];i++) cout<