好友列表

</pre>好友列表MAIN.CPP<pre name="code" class="cpp">#include "friend.h"


int AddGroupFriend(UserInfo *p,UserInfo *group[],int n)
{
	if(p == NULL || group == NULL) return -1;
	int pos = 0;
	while(pos < n && group[pos] != NULL)
	{
		if(!p->AddFriend(group[pos++]))
		{
			cout<<"添加朋友失败!"<<endl;
		}
	}
	return pos;
}
void ShowAllInfo(UserInfo *p)
{
	cout<<"********			朋友信息	**************"<<endl;
	p->ShowFriend();
	cout<<"********			个人信息	**************"<<endl;
	p->ShowInfo();
}
void ShowAllInfo(UserInfo *group[],int n)
{
	for(int i = 0; i < n; ++i)
	{
		if(group[i] != NULL) 
		{
			cout<<"********			第"<<i+1<<"个人信息"<<endl;
			ShowAllInfo(group[i]);
			cout<<endl;
		}
	}
}
void main()
{
	SystemInfo sys;
	//typedef set<Friend_Info>::iterator iter;
	//iter it;
	//cout<<typeid(*it).name()<<endl;
	sys.AddUser("yanglei","4566","110","中国");
	sys.AddUser("yanglei1","45","1881587","北京!");
	sys.AddUser("yanglei2","456","1291587","西安!");
	UserInfo *p = sys.GetUser("yanglei");
	const int N = 2;
	UserInfo *group[N] = {}; 
	group[0] = sys.GetUser("yanglei1");
	group[1] = sys.GetUser("yanglei2");
	AddGroupFriend(p,group,N);

	ShowAllInfo(p);//打印yanglei的个人信息
	ShowAllInfo(group,N);//打印group的所有个人信息
	cout<<endl<<endl;
	p->DeleteFriend(group[0]);///yanglei删除了yanglei1

	ShowAllInfo(p);//打印yanglei的个人信息
	ShowAllInfo(group,N);//打印group的所有个人信息

	//if(p == NULL) cout<<"NOT elem"<<endl;
	//else 
	//{
	//	if(p->AddFriend(sys.GetUser("yanglei1")))
	//		cout<<"ADD success!"<<endl;
	//}
	//if(p->AddFriend(sys.GetUser("yanglei2")))
	//	cout<<"ADD success!"<<endl;
	//p->ShowFriend();
	//cout<<"********			个人信息	**************"<<endl;
	//p->ShowInfo();
	//p->DeleteFriend(sys.GetUser("yanglei2"));

	//cout<<"********			删除以后	**************"<<endl;
	//p->ShowFriend();
	
}


好友列表

#pragma once 
#include <vector>
#include <iostream>
#include <set>
#include <algorithm>
#include <map>//
using namespace std;
const int Init_Len = 200;
const int ID_LEN=20;
const int NAME_LEN=20;
const int PWD_LEN=20;
const int RECV_BUFFER_LEN=1024;
const int BUFFER_LEN=1024;
const int IP_LEN=20;
const int STR_LEN=40;
class Friend_Info
{//存储的好友信息
public:
	Friend_Info(char name[], char passwd[], char phone[], char addr[])
	{
		strcpy(mname, name);
		strcpy(mpasswd, passwd);
		strcpy(mphone, phone);
		strcpy(maddr, addr);
	}
	Friend_Info(){}//默认构造
	~Friend_Info(){}
	void Change_Name(char name[])
	{
		memset(mname,0,sizeof(mname));
		strcpy(mname, name);
	}
	void Change_Passwd(char passwd[])
	{
		memset(mpasswd,0,sizeof(mname));
		strcpy(mpasswd, passwd);
	}
	void Change_Phone(char phone[])
	{
		memset(mphone,0,sizeof(mname));
		strcpy(mphone, phone);
	}
	void Change_Addr(char addr[])
	{
		memset(maddr,0,sizeof(maddr));
		strcpy(maddr, addr);
	}
	void operator=(Friend_Info &src)
	{
		if(&src == this) return ;//防止自赋值
		Change_Name(src.mname);
		Change_Passwd(src.mpasswd);
		Change_Phone(src.mphone);
		Change_Addr(src.maddr);
	}
	friend ostream& operator<<(ostream &out, const Friend_Info &src);
	char* GetName(){return mname;}
	char* GetName()const{return mname;}///////import
	bool operator<( Friend_Info & src){return strcmp(mname,src.mname) < 0;}
	bool operator<(const Friend_Info & src)const{return strcmp(mname,src.mname) < 0;}
	bool operator==( Friend_Info & src){return strcmp(mname,src.mname) == 0;}
	bool operator==(const Friend_Info & src)const{return strcmp(mname,src.mname) == 0;} //mutable///Imoprt 常量版本的
private:
	mutable char mname[NAME_LEN];
	char mpasswd[PWD_LEN];
	char mphone[STR_LEN];
	char maddr[STR_LEN];
};
ostream& operator<<(ostream &out,const Friend_Info &src)
{
	out<<"name: "<<src.mname<<"    ";
	//out<<"name: "<<src.mpasswd<<"    ";
	out<<"phone: "<<src.mphone<<"    ";
	out<<"addr: "<<src.maddr<<endl;
	return out;
}

class Friend_Table//好友表
{
public:
	typedef set<Friend_Info>::iterator iter;
	bool AddFriend( Friend_Info &src)//添加好友信息
	{//////////////////////////////////////?????
		iter it = find(mfriends_set.begin(),mfriends_set.end(),src);
		//cout<<typeid(*it).name()<<endl;
		if(it != mfriends_set.end()) return false;//已经存在
		pair<set<Friend_Info>::iterator,bool> res = mfriends_set.insert(src);
		return res.second;
	}
	bool DeleteFriend(Friend_Info &src)//添加好友信息
	{
		iter it = find(mfriends_set.begin(),mfriends_set.end(),src);
		if(it == mfriends_set.end()) return false;//找不到
		mfriends_set.erase(it);//删除  返回迭代器
		return true;
	}
	int GetFriend_Num(){return mfriends_set.size();}

private:
	set<Friend_Info> mfriends_set;
	friend ostream& operator<<(ostream &out, Friend_Table &src);
};
ostream& operator<<(ostream &out, Friend_Table &src)
{//打印好友列表所有信息
	for(Friend_Table::iter it = src.mfriends_set.begin(); it !=  src.mfriends_set.end(); ++it)
	{
		cout<<*it;
	}
	return out;
}
class UserInfo
{

public:
	friend class SystemInfo;
	UserInfo(){}

	UserInfo(SystemInfo* sys):sysinfo(sys){}
	UserInfo(char name[], char passwd[], char phone[], char addr[], SystemInfo* sys)
		:myinfo(name, passwd,phone, addr),sysinfo(sys){}//带有自己初始信息的初始化
	void ChangeUserInfo(Friend_Info &src){myinfo = src;}//改变自己的用户信息
	bool AddFriend(UserInfo *src){ return AddFriend(*src);}//调用bool AddFriend(UserInfo &)
	//bool AddFriend(const UserInfo &src){return AddFriend(const_cast<UserInfo*>(&src));}//调用AddFriend(UserInfo *)
	bool AddFriend(UserInfo &src)
	{//添加好友,双方同时添加
		if(fr_table.GetFriend_Num() > Max_Friend || src.fr_table.GetFriend_Num() > Max_Friend)//超出上限
		{
			return false;//失败
		}
		bool res = fr_table.AddFriend(src.myinfo);//自己添加好友消息
		if(!res) cout<<"UserInfo AddFriend error!"<<endl;
		res = src.fr_table.AddFriend(myinfo);//对方也添加好友消息
		if(!res) cout<<"UserInfo AddFriend error!"<<endl;
		return true;
	}
	
	bool operator==(const UserInfo &src)const{return strcmp(myinfo.GetName(),src.myinfo.GetName()) == 0;}//比较名字是否相等
	bool operator==(UserInfo &src){return strcmp(myinfo.GetName(),src.myinfo.GetName()) == 0;}//比较名字是否相等
	bool DeleteFriend(UserInfo *src){return DeleteFriend(*src);}
	bool DeleteFriend(UserInfo &src)
	{//删除好友,双方同时删除
		if(fr_table.GetFriend_Num() <= 0 || src.fr_table.GetFriend_Num() <= 0)//超出上限
		{
			return false;//失败
		}
		
		fr_table.DeleteFriend(src.myinfo);//自己添加好友消息
		src.fr_table.DeleteFriend(myinfo);//对方也添加好友消息
		return true;
	}
	void ShowFriend(){cout<<fr_table<<endl;}
	void ShowInfo(){cout<<myinfo<<endl;}
	UserInfo* FindUser(char* name);//查找用户根据ID

private:
	Friend_Table fr_table;//好友表
//////////个人信息
	Friend_Info myinfo;
	
	SystemInfo *sysinfo;
	static const int Max_Friend = 200;//最大好友数

};

class SystemInfo
{
public:
	typedef set<UserInfo*>::iterator iter;
	//////////
	SystemInfo(){}
	int UserNum(){return mSys_set.size();}
	bool AddUser(char name[], char passwd[], char phone[], char addr[])
	{
		if( UserNum() > Max_User){return false;}
		UserInfo* src = new UserInfo(name,passwd,phone,addr,this);//构造一个用户
		if(src == NULL) 
		{
			cerr<<"exit ! add user malloc error !"<<endl;
			exit(0);
		}
		return AddUser(src);
	}
	bool GetUserIter(UserInfo* src,iter &it)
	{//引用方式获取用户迭代器
		it = find(mSys_set.begin(), mSys_set.end(), src );
		if(it == mSys_set.end() ) return false;
		return true;
	}
	bool AddUser(UserInfo *src)
	{
		if(mSys_set.size() > Max_User) return false;
		pair<set<UserInfo*>::iterator,bool> res = mSys_set.insert(src);//插入
		//接受插入的返回值,并且返回
		return res.second;
	}	
	bool DeleteUser(UserInfo *src)
	{
		if(mSys_set.size() <= 0) return false;
		iter it;
		if( GetUserIter(src,it) )//获取迭代器
		{
			mSys_set.erase(it);//删除用户
			return true;
		}
		return false;
	}
	UserInfo *GetUser(char* name)
	{
		UserInfo temp;
		temp.myinfo.Change_Name(name);
		iter it;
		for(it = mSys_set.begin() ; it != mSys_set.end(); ++it)
		{
			if( *(*it) == temp)  return *it;//import !
		}
		//iter it = find(mSys_set.begin(),mSys_set.end(),&temp);//比较是否相等  比较的是地址!而不是内容...
		//if(it == mSys_set.end()) return NULL;
		return NULL;//找不到
	}
	//bool AddFriend()
private:
	set<UserInfo*> mSys_set;
	
	static const int Max_User = 200000;//最大好友数
};



///////
UserInfo* UserInfo::FindUser(char* name)//查找用户根据ID
{
	return (*sysinfo).GetUser(name);//用到在后面才定义的方法,所以要在后面定义函数
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值