![]() |
#2
x_tacet2013-08-08 20:01
|

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<fstream>
#include<time.h>
using namespace std;
class Node
{
private:
char Name[10]; //姓名
int Phone; //电话
char Mobile[15]; //手机
char EMail[20]; //email
Node *next; //下一结点指针
public:
char Time[128]; //系统时间
Node(const char *n="0",const int o=0,const char *m="0",const char *e="0",const char *t="0",Node *nx=0)//构造函数,各参数均有缺省值
{
strcpy(Name,n);
Phone=o;
strcpy(Mobile,m);
strcpy(EMail,e);
strcpy(Time,t);
next=nx;
}
void Show(); //显示结点数据
void SetName(char *name); //修改姓名
void SetPhone(int op); //修改电话号码
void SetMobile(char *mp); //修改手机号码
void SetEMail(char *email); //修改email地址
void SetTime(char *t); //记录时间
friend class AddrList; //将AddrList类说明为友元类
friend void writetotxtfile(AddrList&);
friend void addfromtxtfile(AddrList&);
};
void Node::Show() //类外定义函数
{
cout<<Name<<'\t'<<Phone<<'\t'<<'\t'<<Mobile<<'\t'<<'\t'<<EMail<<'\t'<<Time;
}
void Node::SetName(char *name)
{
if(name)
strcpy(Name,name);
else
strcpy(Name," ");
}
void Node::SetPhone(int op)
{ Phone=op;}
void Node::SetMobile(char *mp)
{
if(mp)
strcpy(Mobile,mp);
else
strcpy(Mobile," ");
}
void Node::SetEMail(char *email)
{
if(email) strcpy(EMail,email);
else strcpy(EMail," ");
}
void Node::SetTime(char *t)
{
if(time)strcpy(Time,t);
else strcpy(Time," ");
}
class AddrList
{
private:
Node *Head; //链表首指针
Node *Tail; //链表尾指针
public:
AddrList() //构造函数,创建空链表
{
Node *p=new Node;
p=NULL;
Head=p;
Tail=p;
}
void AddTail(Node *p) //将p指向的结点加入到链表尾部 //类内定义函数
{
if(Head==0)
{ Head=p;
Tail=p;
p->next=NULL;
}
else
{
Tail->next=p;
Tail=p;
p->next=NULL;
}
}
Node *LookUp(char *name) //按姓名查找结点并返回该结点指针
{
Node *p;
p=Head;
while(p!=NULL)
{
if(strcmp(p->Name,name)==0)
return p;
p=p->next;
}
return NULL;
}
void Delete(char *name) //删除p结点
{
Node *p,*head1;
p=LookUp(name);
head1=Head;
if(head1=p)
{
Head=p->next;
delete p;
}
else
{
head1->next=p->next;
delete p;
}
}
void AddSort(Node *p) //将p指向的结点按Tag指定的顺序插入到链表中
{
Node *p1,*p2; //p指向的结点插在p1与p2指向的结点之间
if(Head==NULL) //插入前原始链表为空
{ Head=p;
Tail=p;
p->next=NULL;
}
if(strcmp(Head->Name,p->Name)>0) //插在链表首部
{ p->next=Head;
Head=p;
}
p1=Head; //插在链表中间或尾部
p2=Head;
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;
}
else if(strcmp(p2->Name,p->Name)>0)
{
p->next=p2;
p1->next=p;
}s
}
void ShowAll() //显示全部结点,每20个显示一屏
{
Node *p=Head;
if(p==NULL)
cout<<"链表为空!\n";
else
while(p)
{
cout<<"Name"<<'\t'<<"Phone"<<'\t'<<'\t'<<"Mobile"<<'\t'<<'\t'<<"EMail"<<'\t'<<"Time"<<endl;
for(int i=0;i<20;i++)
{
p->Show();
p=p->next;
if(p==NULL) break;
}
system("pause");
}
}
Node *GetHeadPtr() //取首指针
{ return Head; }
~AddrList() //析构函数,释放链表空间
{
Node *p;
while(Head)
{
p=Head;
Head=Head->next;
delete p;
}
}
void CreateList(char *filename) //从二进制文件中读入数据,构造链表
{
ifstream infile(filename, ios::in|ios::binary);
infile.read((char *)0, 4); //读出二进制文件的第1个数据
int n;
infile.read((char *)&n, 4); //读出记录数
cout<<"正在从数据中加载...";
Node *p;
for(int i=0;i<n;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 *)0,4);
Node *p, *p1;
int n=0;
for(p1=Head; p1!=NULL; p1=p1->next) n++;
outfile.write((char *)&n,4);
p=Head;
while(p)
{
outfile.write((char *)p, sizeof(Node));
p=p->next;
}
cout<<"成功导出二进制文件";
outfile.close();
}
};
void DisplayMenu()
{
char *menu[]={
"1.Add Record","2.Delete Record","3.Display All Record","4.Search",
"5.Modify Record","6.Add from a Text File","7.Write to a Text File"
,"8.Quit"};
cout<<endl<<endl;
cout<<"********************* Contacts By Alex ************************"<<endl<<endl<<endl<<endl;
for(int i=0;i<8;i++)
cout<<'\t'<<'\t'<<'\t'<<*(menu+i)<<endl;
cout<<endl<<endl<<endl<<"************************************************************************"<<endl;
}
void add(AddrList &addrlist) //增加记录,插入结点后,链表仍然保持有序
{
Node *p=new Node;
char name[10],Mobile[15],email[20];
int Phone;
char s;
cout<<"请输入姓名:";
cin>>name;
p->SetName(name);
cout<<endl;
cout<<"请输入电话:";
cin>>Phone;
p->SetPhone(Phone);
cout<<endl;
cout<<"请输入手机号码:";
cin>>Mobile;
p->SetMobile(Mobile);
cout<<endl;
cout<<"请输入email地址:";
cin>>email;
p->SetEMail(email);
cout<<endl;
char ch[128];
time_t t;
memset(ch,0x0,128);
time(&t);
sprintf(ch,"%s", ctime(&t));
strcpy(p->Time,ch);
cout<<"确认添加?(y or n)\n";
cin>>s;
if(s=='y')
{
addrlist.AddSort(p);
p->Show();
cout<<endl;
cout<<"增加记录成功!\n";
}
else if(s=='n')
{
p->Show();
cout<<endl;
cout<<"该记录未添加!\n";
}
else
cout<<"您的输入有误!\n";
}
void showall(AddrList &addrlist) //显示所有记录
{
addrlist.ShowAll();
}
void search(AddrList &addrlist) //按姓名查找并显示
{
char name[10];
Node *p;
cout<<"please input the name"<<endl;
cin>>name;
p=addrlist.LookUp(name);
if(p)
{
cout<<"Contact is found."<<endl;
p->Show();
}
else
cout<<"The contact is not found."<<endl;
system("pause");
}
void del(AddrList &addrlist)
{
char name[10],s;
Node *p;
cout<<"please input the name"<<endl;
cin>>name;
p=addrlist.LookUp(name);
cout<<"Confirm deleted?(y or n)\n";
cin>>s;
if(s=='y')
if(p)
{
addrlist.Delete(name);
cout<<name<<" has been deleted"<<endl;
}
else cout<<"The contact is not found."<<endl;
if(s=='n')
{
p->Show();
cout<<endl;
cout<<"The contact is not deleted\n";
}
}
void addfromtxtfile(AddrList &addrlist) //从正文文件中添加数据到库表中
{
cout<<"请输入源文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ifstream in(filename, ios::in|ios::_Nocreate);
if(!in)
{
cout<<"无法打开源文件";return;
}
char na[10],m[15],e[20],t[128];
int o;
Node *p;
while(!in.eof())
{
in>>na>>o>>m>>e>>t;
p=new Node(na,o,m,e,t);
addrlist.AddTail(p);
}
in.close();
cout<<"记录从正文文件添加成功!";
system("pause");
}
void writetotxtfile(AddrList &addrlist) //将链表中的数据写入指定的正文文件
{
cout<<"请输入目标文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ofstream out;
out.open(filename, ios::out|ios::_Noreplace);
if(!out)
{
cout<<"创建文件失败!";
}
else
{
Node *p;
p=addrlist.GetHeadPtr();
while(p)
{
out<<p->Name<<" "<<p->Phone<<" "<<" "<<p->Mobile<<" "<<p->EMail<<" "<<p->Time<<" "<<endl;
p=p->next;
}
out.close();
cout<<"成功导出正文文件!";
}
}
void quit(AddrList &addrlist)
{
cout<<endl<<endl<<"*****************谢谢使用!****************\n";
cout<<endl;
exit(0);
}
void main()
{
int choice=0,state;
AddrList addrlist;
while(choice!=8)
{
DisplayMenu(); //显示主菜单
cout<<"请输入选择:1~8\n";
cin>>choice;
state=cin.rdstate();
if(state) //处理非法输入,如输入一个字符是非法的
{
char str[80];
cin.clear();
cin.getline(str,80);
choice=10;
}
system("cls");
switch(choice)
{
case 1:add(addrlist);break;
case 2:del(addrlist);break;
case 3:showall(addrlist);break;
case 4:search(addrlist);break;
// case 5:modify(addrlist);break;
case 6:addfromtxtfile(addrlist);break;
case 7:writetotxtfile(addrlist);break;
case 8:quit(addrlist);break;
default:;
}
system("cls");
}
}
#include<stdlib.h>
#include<string.h>
#include<fstream>
#include<time.h>
using namespace std;
class Node
{
private:
char Name[10]; //姓名
int Phone; //电话
char Mobile[15]; //手机
char EMail[20]; //email
Node *next; //下一结点指针
public:
char Time[128]; //系统时间
Node(const char *n="0",const int o=0,const char *m="0",const char *e="0",const char *t="0",Node *nx=0)//构造函数,各参数均有缺省值
{
strcpy(Name,n);
Phone=o;
strcpy(Mobile,m);
strcpy(EMail,e);
strcpy(Time,t);
next=nx;
}
void Show(); //显示结点数据
void SetName(char *name); //修改姓名
void SetPhone(int op); //修改电话号码
void SetMobile(char *mp); //修改手机号码
void SetEMail(char *email); //修改email地址
void SetTime(char *t); //记录时间
friend class AddrList; //将AddrList类说明为友元类
friend void writetotxtfile(AddrList&);
friend void addfromtxtfile(AddrList&);
};
void Node::Show() //类外定义函数
{
cout<<Name<<'\t'<<Phone<<'\t'<<'\t'<<Mobile<<'\t'<<'\t'<<EMail<<'\t'<<Time;
}
void Node::SetName(char *name)
{
if(name)
strcpy(Name,name);
else
strcpy(Name," ");
}
void Node::SetPhone(int op)
{ Phone=op;}
void Node::SetMobile(char *mp)
{
if(mp)
strcpy(Mobile,mp);
else
strcpy(Mobile," ");
}
void Node::SetEMail(char *email)
{
if(email) strcpy(EMail,email);
else strcpy(EMail," ");
}
void Node::SetTime(char *t)
{
if(time)strcpy(Time,t);
else strcpy(Time," ");
}
class AddrList
{
private:
Node *Head; //链表首指针
Node *Tail; //链表尾指针
public:
AddrList() //构造函数,创建空链表
{
Node *p=new Node;
p=NULL;
Head=p;
Tail=p;
}
void AddTail(Node *p) //将p指向的结点加入到链表尾部 //类内定义函数
{
if(Head==0)
{ Head=p;
Tail=p;
p->next=NULL;
}
else
{
Tail->next=p;
Tail=p;
p->next=NULL;
}
}
Node *LookUp(char *name) //按姓名查找结点并返回该结点指针
{
Node *p;
p=Head;
while(p!=NULL)
{
if(strcmp(p->Name,name)==0)
return p;
p=p->next;
}
return NULL;
}
void Delete(char *name) //删除p结点
{
Node *p,*head1;
p=LookUp(name);
head1=Head;
if(head1=p)
{
Head=p->next;
delete p;
}
else
{
head1->next=p->next;
delete p;
}
}
void AddSort(Node *p) //将p指向的结点按Tag指定的顺序插入到链表中
{
Node *p1,*p2; //p指向的结点插在p1与p2指向的结点之间
if(Head==NULL) //插入前原始链表为空
{ Head=p;
Tail=p;
p->next=NULL;
}
if(strcmp(Head->Name,p->Name)>0) //插在链表首部
{ p->next=Head;
Head=p;
}
p1=Head; //插在链表中间或尾部
p2=Head;
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;
}
else if(strcmp(p2->Name,p->Name)>0)
{
p->next=p2;
p1->next=p;
}s
}
void ShowAll() //显示全部结点,每20个显示一屏
{
Node *p=Head;
if(p==NULL)
cout<<"链表为空!\n";
else
while(p)
{
cout<<"Name"<<'\t'<<"Phone"<<'\t'<<'\t'<<"Mobile"<<'\t'<<'\t'<<"EMail"<<'\t'<<"Time"<<endl;
for(int i=0;i<20;i++)
{
p->Show();
p=p->next;
if(p==NULL) break;
}
system("pause");
}
}
Node *GetHeadPtr() //取首指针
{ return Head; }
~AddrList() //析构函数,释放链表空间
{
Node *p;
while(Head)
{
p=Head;
Head=Head->next;
delete p;
}
}
void CreateList(char *filename) //从二进制文件中读入数据,构造链表
{
ifstream infile(filename, ios::in|ios::binary);
infile.read((char *)0, 4); //读出二进制文件的第1个数据
int n;
infile.read((char *)&n, 4); //读出记录数
cout<<"正在从数据中加载...";
Node *p;
for(int i=0;i<n;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 *)0,4);
Node *p, *p1;
int n=0;
for(p1=Head; p1!=NULL; p1=p1->next) n++;
outfile.write((char *)&n,4);
p=Head;
while(p)
{
outfile.write((char *)p, sizeof(Node));
p=p->next;
}
cout<<"成功导出二进制文件";
outfile.close();
}
};
void DisplayMenu()
{
char *menu[]={
"1.Add Record","2.Delete Record","3.Display All Record","4.Search",
"5.Modify Record","6.Add from a Text File","7.Write to a Text File"
,"8.Quit"};
cout<<endl<<endl;
cout<<"********************* Contacts By Alex ************************"<<endl<<endl<<endl<<endl;
for(int i=0;i<8;i++)
cout<<'\t'<<'\t'<<'\t'<<*(menu+i)<<endl;
cout<<endl<<endl<<endl<<"************************************************************************"<<endl;
}
void add(AddrList &addrlist) //增加记录,插入结点后,链表仍然保持有序
{
Node *p=new Node;
char name[10],Mobile[15],email[20];
int Phone;
char s;
cout<<"请输入姓名:";
cin>>name;
p->SetName(name);
cout<<endl;
cout<<"请输入电话:";
cin>>Phone;
p->SetPhone(Phone);
cout<<endl;
cout<<"请输入手机号码:";
cin>>Mobile;
p->SetMobile(Mobile);
cout<<endl;
cout<<"请输入email地址:";
cin>>email;
p->SetEMail(email);
cout<<endl;
char ch[128];
time_t t;
memset(ch,0x0,128);
time(&t);
sprintf(ch,"%s", ctime(&t));
strcpy(p->Time,ch);
cout<<"确认添加?(y or n)\n";
cin>>s;
if(s=='y')
{
addrlist.AddSort(p);
p->Show();
cout<<endl;
cout<<"增加记录成功!\n";
}
else if(s=='n')
{
p->Show();
cout<<endl;
cout<<"该记录未添加!\n";
}
else
cout<<"您的输入有误!\n";
}
void showall(AddrList &addrlist) //显示所有记录
{
addrlist.ShowAll();
}
void search(AddrList &addrlist) //按姓名查找并显示
{
char name[10];
Node *p;
cout<<"please input the name"<<endl;
cin>>name;
p=addrlist.LookUp(name);
if(p)
{
cout<<"Contact is found."<<endl;
p->Show();
}
else
cout<<"The contact is not found."<<endl;
system("pause");
}
void del(AddrList &addrlist)
{
char name[10],s;
Node *p;
cout<<"please input the name"<<endl;
cin>>name;
p=addrlist.LookUp(name);
cout<<"Confirm deleted?(y or n)\n";
cin>>s;
if(s=='y')
if(p)
{
addrlist.Delete(name);
cout<<name<<" has been deleted"<<endl;
}
else cout<<"The contact is not found."<<endl;
if(s=='n')
{
p->Show();
cout<<endl;
cout<<"The contact is not deleted\n";
}
}
void addfromtxtfile(AddrList &addrlist) //从正文文件中添加数据到库表中
{
cout<<"请输入源文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ifstream in(filename, ios::in|ios::_Nocreate);
if(!in)
{
cout<<"无法打开源文件";return;
}
char na[10],m[15],e[20],t[128];
int o;
Node *p;
while(!in.eof())
{
in>>na>>o>>m>>e>>t;
p=new Node(na,o,m,e,t);
addrlist.AddTail(p);
}
in.close();
cout<<"记录从正文文件添加成功!";
system("pause");
}
void writetotxtfile(AddrList &addrlist) //将链表中的数据写入指定的正文文件
{
cout<<"请输入目标文件的文件名(扩展名为txt):";
char filename[80];
cin.get();
cin.getline(filename, 80);
ofstream out;
out.open(filename, ios::out|ios::_Noreplace);
if(!out)
{
cout<<"创建文件失败!";
}
else
{
Node *p;
p=addrlist.GetHeadPtr();
while(p)
{
out<<p->Name<<" "<<p->Phone<<" "<<" "<<p->Mobile<<" "<<p->EMail<<" "<<p->Time<<" "<<endl;
p=p->next;
}
out.close();
cout<<"成功导出正文文件!";
}
}
void quit(AddrList &addrlist)
{
cout<<endl<<endl<<"*****************谢谢使用!****************\n";
cout<<endl;
exit(0);
}
void main()
{
int choice=0,state;
AddrList addrlist;
while(choice!=8)
{
DisplayMenu(); //显示主菜单
cout<<"请输入选择:1~8\n";
cin>>choice;
state=cin.rdstate();
if(state) //处理非法输入,如输入一个字符是非法的
{
char str[80];
cin.clear();
cin.getline(str,80);
choice=10;
}
system("cls");
switch(choice)
{
case 1:add(addrlist);break;
case 2:del(addrlist);break;
case 3:showall(addrlist);break;
case 4:search(addrlist);break;
// case 5:modify(addrlist);break;
case 6:addfromtxtfile(addrlist);break;
case 7:writetotxtfile(addrlist);break;
case 8:quit(addrlist);break;
default:;
}
system("cls");
}
}
调试的时候貌似删除那块出问题了,录如信息后,删除后边的结点会把前边的都给删除~~void Delete(char *name) //删除p结点
{
Node *p,*head1;
p=LookUp(name);
head1=Head;
if(head1=p)
{
Head=p->next;
delete p;
}
else
{
head1->next=p->next;
delete p; //目测是这块的问题~~求各位前辈释疑~~~
}
}
求解先行谢过!!!!