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

📄 222.cpp

📁 电话簿源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   }
   infile.read((char*)&tag,sizeof(tag));
   while(!infile.eof())
   {  p=new Node;
      infile.read((char*)p,sizeof(Node));
	  if(infile.eof())break;
      else
         addsort(p);
   }
   infile.close();
}
void AddrList::writetofile(char*filename)
{  Node *p=headptr;
   fstream outfile(filename,ios::out|ios::binary);
   if(outfile.fail())
   {  cout<<"can not open this file"<<endl;
      exit(1);
   }
   outfile.write((char*)&tag,sizeof(tag));
   while(p)
   { outfile.write((char*)p,sizeof(Node));
     p=p->next;
   }
   outfile.close();
} 
void AddrList::reverse()
{  Node *p1,*p2,*p3;
   p1=p3=headptr;
   p2=p1->next;        //指定前后指针
   while(p2->next)     //循环逆序到尾指针
   {  p1=p2;
      p2=p2->next;
	  p1->next=p3;
	  p3=p1;
   }
   p2->next=p1;  
   headptr->next=0;    //原头指针变尾指针,next赋空
   headptr=p2;         //把头指针指向原尾指针
}
}
其中上述函数均是对链表进行操作。
类AddrList具体为:
class AddrList                      //AddrList类
{  
	Node* headptr;
	Node* tailptr;
	int tag;
public:
                                     //成员函数
	AddrList();                        //构造函数
	void addtail(Node*p);              //增加尾结点
	void addsort(Node*p);              //按tag顺序增加结点	
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*getheadptr(){return headptr;}  //获得头结点
	~AddrList();                        //析构函数
	void createlist(char *filename);  //用二进制读入信息
 void writetofile(char *filename); //用二进制写入信息
};
//main.h
void add(AddrList&addrlist)//add被调函数
{   char str[]="y";Node *p;
                          
			  while(strcmp(str,"y")==0)
			  {   p=new Node;
                  cout<<"please input   
               name,relation,officephone,homephone,mobilephone,email"<<endl;
			      cin>>p->name>>p->relation>>p->officephone>>p->homephone>>p->mobilephone>>p->email;
                  addrlist.addsort(p);
				  cout<<"continue to add:y/n\t";
				  cin>>str;
			  }
              cout<<"add successfully!"<<endl;
			  system("pause");   
}
void del(AddrList&addrlist)//del被调函数
{      char na[20];
	   cout<<"input the name you want to delete:\t";
			  cin>>na;
			  addrlist.Delete(na);
			  system("pause");
}		  
void query(AddrList&addrlist)//query被调函数
{  char nam[20];
                          Node *k;
			  cout<<"input the name you want to lookup:\t";
			  cin>>nam;
			  k=addrlist.lookup(nam);
                          if(k==0) cerr<<"No record included!\n";
                          else  k->show();
			  system("pause");
}
void showall(AddrList &addrlist)//showall被调函数
{   addrlist.showall();
			  system("pause"); 
 }     
void modify(AddrList&addrlist)//modify被调函数
{   char t[20];
              cout<<"input the name you want to modify:\t";
	  cin>>t;
			  addrlist.modify(t);
			  addrlist.sort(1);
			  system("pause");
}
void sort(AddrList&addrlist)//sort被调函数
{  int m;
   char s[3];
   cout<<"tag present value is:   "<<addrlist.gettag()<<endl;
   cerr<<"modify or not:y/n:\t";
   cin>>s;
   if(strcmp(s,"y")==0) 
{ cout<<"input  modified tag value\t";
	  cin>>m;
    addrlist.sort(m);
   }
	 system("pause");
}
void addfromtxtfile(AddrList&addrlist)
{   Node *p;
    int Tag;
	fstream infile("030530219刘超.txt",ios::in|ios::nocreate);
    if(!infile)
	{  cout<<"can not open file:030530219刘超.txt"<<endl;
	   exit(1);
	}
    infile>>Tag;
	addrlist.settag(Tag);
	while(!infile.eof())
    {  p=new Node;
infile>>p->name>>p->relation>>p->officephone>>p->homephone>>p->mobilephone>>p->email;
 if(infile.eof()) break;
	   else
       addrlist.addsort(p);
	}
	infile.close();
	cout<<"read successfully!"<<endl;
        system("pause");
}
void writetotxtfile(AddrList&addrlist)
{   ofstream outfile;
    outfile.open("030530219刘超.txt");
	Node*p=addrlist.getheadptr();
	outfile<<addrlist.gettag()<<endl;
	while(p)
	{    outfile<<p->name<<'\t'<<p->relation<<'\t'<<p->officephone<<'\t'<<p->homephone<<'\t'<<p->mobilephone<<'\t'<<p->email<<endl;
	     p=p->next;
	}
	outfile.close();
       cout<<"write successfully!"<<endl;
	   system("pause");
}
void rev(AddrList&addrlist)
{   addrlist.reverse();
    cout<<"reverse successfully!"<<endl;
    system("pause");
}
void quit(AddrList&addrlist)
{   //Node*p=addrlist.getheadptr();
	cout<<"thank you for using this program!"<<endl;
	cout<<"exit successfully!"<<endl;
    addrlist.writetofile("addrlist.dat");
exit(0);
}
//Node.h
class Node//Node类
{
	char name[10];
	char relation[10];
	int officephone;
	int homephone;
	char mobilephone[15];
	char email[20];
	Node *next;//类成员
public:
	Node(char*na="刘超",char*r="自己",int o=52117556,
int h=57560662,char*m="13814196034",char*e="lch@163.com.cn");
	void show();
	void setname(char*);
	void setrelation(char*);
	void setofficephone(int);
	void sethomephone(int);
	void setmobilephone(char*);
	void setemail(char*);
	friend class AddrList;
        friend void add(AddrList &addrlist);
        friend void writetotxtfile(AddrList&addrlist);
        friend void addfromtxtfile(AddrList&addrlist);
        friend void quit(AddrList&addrlist);
};
Node::Node(char*na,char*r,int o,int h,char*m,char*e)//Node构造函数
{   strcpy(name,na);
    strcpy(relation,r);
	officephone=o;
homephone=h;
    strcpy(mobilephone,m);
	strcpy(email,e);
        next=NULL;
}
void Node::show()//Node显示
{   cerr<<name<<'\t'<<relation<<'\t'<<officephone<<"(O)"<<'\t'
     <<homephone<<"(H)"<<'\t'<<mobilephone<<"(M)"<<'\t'<<email<<'\n';
}
void Node::setname(char*na)//重置姓名
{   strcpy(name,na);}
void Node::setrelation(char*r)//重置关系
{   strcpy(relation,r);}
void Node::setofficephone(int o)//重置办公室号码    
{   officephone=o;}
void Node::sethomephone(int h)//重置家里号码
{   homephone=h;}
void Node::setmobilephone(char*m)//重置手机号码
{   strcpy(mobilephone,m);}
void Node::setemail(char*e)//重置电子邮箱
{   strcpy(email,e);}
}
//DisplayMenu.h
void DisplayMenu()//菜单内容
{	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",
				NULL
				};
	cout<<"\n\n =====Address Book Managing Syetem===== \n\n";
    for(int i=0; menu[i]!=NULL; i++)	cout<<menu[i]<<endl;
	cout<<"\n======================================= \n";
	cout<<"Choice: ";
}

  举两个函数分析说明:
分别为sort函数和createlist函数
其一,
Sort 流程图

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);  //调用addsort函数排序
       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::createlist(char*filename)
{  Node *p;                定义指针Node p;
   fstream infile(filename,ios::in|ios::binary);  
//建立fstraem对象,并调用构造函数,以二进制方式打开文件
   if(infile.fail())                        
//判断文件是否存在
   {  cout<<"can not open this file"<<endl;
      cout<<"vacant list has been created!"<<endl;
// 判断为空,建立新链表
   }
   infile.read((char*)&tag,sizeof(tag));   
//读入排序值tag
   while(!infile.eof())                   
//做循环至文件尾部
   {  p=new Node;                     //给p开辟空间           
      infile.read((char*)p,sizeof(Node)); 
 //读入每个结点信息
	    if(infile.eof())break;                
//如果是文件尾则跳出循环
      else addsort(p);      //否则调用addsort函数排序
   }
   infile.close();                         //关闭文件
}

⌨️ 快捷键说明

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