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

📄 222.cpp

📁 电话簿源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//main.cpp
#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>
#include"Node.h"
#include"AddrList.h"
#include"main.h"
#include"DisplayMenu.h"
void main()
{ 
	int choice=0,state;
    AddrList addrlist;
    addrlist.createlist("addrlist.dat");// 从二进制文件中读入数据,构建链表
    while(choice!=10)
    { 
		system("cls");
	    DisplayMenu();
        cin>>choice;
	    state=cin.rdstate();
	    if(state)//处理非法输入,如输入一个字符是非法的
		{  char str[80]; cin.clear();cin.getline(str,80); choice=10;}
  switch(choice)
		{  
		  case 1: add(addrlist);//增加对象
			  break;
		  case 2: 
			  del(addrlist);//删除对象
			  break;
		  case 3: showall(addrlist);//显示所有对象
              break;
		  case 4: query(addrlist);//查找对象
			  break;
		  case 5: modify(addrlist);//修改对象
			  break;
		  case 6: addfromtxtfile(addrlist);
			  break;
		  case 7: writetotxtfile(addrlist);
			  break;
		  case 8: sort(addrlist);
			  break;
		  case 9: rev(addrlist);
			  break;
		  case 0: quit(addrlist);
			  break;
		}
   }
}
//AddrList.h
void ShowModiMenu()//显示菜单
{  char *submenu[]={"(1) Name","(2) Relation","(3) OfficePhone",
   "(4) HomePhone","(5) MobilePhone","(6) EMail", NULL};
   cout<<'\n';
   for(int i=0; submenu[i]!=NULL; i++) cout<<submenu[i]<<endl;
cout<<"Choice: ";
}
class AddrList//AddrList类
{  
	Node* headptr;
	Node* tailptr;
	int tag;
public:
	AddrList();
	void addtail(Node*p);
	void addsort(Node*p);
	Node *lookup(char*name);
	void modify(char*na);
	void Delete(char*name);
	void sort(int m);
	void showall();
	void settag(int t){  tag=t;}
    int gettag(){  return tag;}
	Node*getheadptri(){return headptr;}
	~AddrList();
	void char *filename);
    void writetofile(char *filename);
};
AddrList::AddrList()//AddrList构造
{   headptr=NULL;
    tailptr=NULL;
	tag=1;
}
void AddrList::addtail(Node*p)//添加尾链表
{  if(headptr==0)
   {  headptr=tailptr=p;
      tailptr->next=0;
   }
   else 
   {  tailptr->next=p;
      tailptr=p;
      tailptr->next=0;
   }
}
void AddrList::addsort(Node*p)//按指定顺序添加链表
{  if(tag==1)
   { if(headptr==0)
     { headptr=tailptr=p;
        tailptr->next=NULL;
        return;
      }
      if(strcmp(headptr->name,p->name)>0)
      { p->next=headptr;
        headptr=p;
        return;
      }
      else
      { Node*q,*s;
q=s=headptr;
        while(s->next&&(strcmp(s->name,p->name)<0))
        { q=s;s=s->next;}
        if(strcmp(s->name,p->name)>=0)
        { p->next=s;
          q->next=p;
          return;
        }
        else 
        { s->next=p;
          tailptr=p;
          tailptr->next=NULL;
          return;
        }
	  }
	}
    if(tag==2)
	{ if(headptr==0)
      { headptr=tailptr=p;
        tailptr->next=NULL;
        return;
       }
      if((headptr->officephone)>(p->officephone))
      { p->next=headptr;
        headptr=p;
        return;
      }
      else
      { Node*q,*s;
        q=s=headptr;
        while(s->next&&((s->officephone)<(p->officephone)))
        { q=s;s=s->next;}
 if((s->officephone)>=(p->officephone))
        { p->next=s;
          q->next=p;
          return;
        }
        else 
        { s->next=p;  
          tailptr=p;
          tailptr->next=NULL;
          return;
        }
      }
   }
}
void AddrList::modify(char*na)//修改类对象
{   Node *p;
    p=lookup(na);
    if(p==0) cout<<"no such record!"<<endl;
    else
    {
    p->show();
    ShowModiMenu();
    int x;
    cin>>x;
    switch(x)
    {  case 1: 
             cerr<<"input new name:\t"; 
             char na[20];
             cin>>na;
             p->setname(na);
              break;
       case 2:
    cerr<<"input new relation:\t";
             char re[20];
             cin>>re; 
             p->setrelation(re);
              break;
       case 3:
             cerr<<"input new officephone:\t";
             int op;
             cin>>op;
             p->setofficephone(op);
              break;
       case 4:
            cerr<<"input new homephone:\t";
            int hp;
            cin>>hp;
            p->sethomephone(hp);
              break;
       case 5:
            cerr<<"input new mobilephone:\t";
            char mp[20];
            cin>>mp;
            p->setmobilephone(mp);
             break;
       case 6:
            cerr<<" input new email:\t";
            char em[40];
            cin>>em;
            p->setemail(em);
     }
         cerr<<"modified successfully!\n";
   }
}   
Node *AddrList::lookup(char*name)//查找类对象
{  Node*p=headptr;
   while(p!=NULL)
   {  if(strcmp(p->name,name)==0) return p;
      p=p->next;
   }
	   return NULL;
}
void AddrList::Delete(char*name)//删除类对象
{  Node *p1,*p2;
   if(headptr==0)
     {  cerr<<"No such record!"<<endl;
       return;
     }  
   if(strcmp(headptr->name,name)==0)
   {  headptr=headptr->next;
      cerr<<"deleted!\n";
   }
   else
   {  p1=p2=headptr;
      while(p2->next!=NULL&&strcmp(p2->name,name)!=0)
	  {   p1=p2;p2=p2->next;}

	  if(strcmp(p2->name,name)==0)
      {  p1->next=p2->next;   
	     cerr<<"deleted!"<<endl;
		 delete p2;
	  }
	  else
        {
           cerr<<"no such record!\n";
           p1=NULL;
      }
   }
}
void AddrList::sort(int m)//按指定顺序排序
{  settag(m);
   AddrList newptr;     // 本例中新链表对象是局部对象
	newptr.tag = tag;    //tag为排序依据
	Node *p = headptr,*p1,*p2;
	while(p!=NULL)
	{  p1=new Node;
           *p1=*p;
           newptr.addsort(p1);
           p2=p;
	   p=p->next;
           delete p2;
	}
        tag=newptr.tag;
	headptr=newptr.headptr;
	tailptr=newptr.tailptr;
	newptr.headptr=NULL;   //将新链表置空,如没有置空, 
	newptr.tailptr=NULL;    //则newptr和addrlist是一个表,
                            //撤消newptr时,将把addrlist表空间释放掉   
}
void AddrList::showall()//显示对象
{  Node*p=headptr;
   int n=0;
   while(p)
   {  cout<<(p->name)<<'\t'<<(p->relation)<<'\t'<<(p->officephone)<<'\t'<<(p->homephone)<<'\t'
      <<(p->mobilephone)<<'\t'<<(p->email)<<endl;
      p=p->next;
  n++;
	  if(n%10==0)  
	  { system("pause");
	    system("cls");
	  }
   }
}
AddrList::~AddrList()//AddrList析构函数
{  Node*p1,*p2;
   p1=p2=headptr;
   while(p2)
   {  p1=p2;
      p2=p2->next;
	  delete []p1;
   }
}
void AddrList::createlist(char*filename)
{  Node *p;
   fstream infile(filename,ios::in|ios::binary);
   if(infile.fail())
   {  cout<<"can not open this file"<<endl;
      cout<<"vacant list has been created!"<<endl;
	  //exit(1);

⌨️ 快捷键说明

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