/*合并电话簿
输入
有两本电话簿的描述。描述每本电话簿的第一行是一个正整数n(n<50),接下来有n行,
每行是一个人数据,包括姓、名、所在城市和电话号码。每本电话簿都按姓以字典序
升序排列。
输出
对这两本电话簿进行合并,使合并后仍然按姓以字典序升序排序。首先输出合并后的
个人数据总数,接着输出个人信息。如果两本电话簿中的个人数据完全一致,则保留
一个。如果两个人的姓相同,那么先出现的人仍然在前。
样例输入
2
Dupont Albert Paris 45247000
Smith John Washington 18554420
3
Brown Gordon London 44863645
Martin Martin Troyes 25452829
Popov Nikolai Moscow 18222931
样例输出
5
Brown Gordon London 44863645
Dupont Albert Paris 45247000
Martin Martin Troyes 25452829
Popov Nikolai Moscow 18222931
Smith John Washington 18554420
*/
思路分析:为了能够合并两本电话簿,需将第一本中的姓与第二本中的姓利用strcmp函数进行比较,如果第一个本中的姓在第二本中的姓的前面的话,其值为负,相同其值为0,否则为正;还需要注意两个人的姓相同时的情况。
#include
#include
#define m 50
using namespace std;
typedef struct phonelist
{
char s[m];
char p[m];
}phoneform;
void readdata(phoneform *pp,int n)//读取电话簿
{
for(int i=0;i { cin>>pp[i].s; cin.getline(pp[i].p,30); } } phoneform *pmerge(phoneform *p1,phoneform *p2,int n1,int n2,int *total)//合并电话簿 { int num1=0,num2=0,num=0,pd; phoneform *pp=new phoneform[(n1+n2)*sizeof(phoneform)]; while((num1 { pd=strcmp(p1[num1].s,p2[num2].s); if(pd<0||pd==0&&strcmp(p1[num1].p,p2[num2].p)!=0) { strcpy(pp[num].s,p1[num1].s); strcpy(pp[num].p,p1[num1].p); num1++; } else if(strcmp(p1[num1].p,p2[num2].p)==0) { strcpy(pp[num].s,p1[num1].s); strcpy(pp[num].p,p1[num1].p); num1++; num2++; } else { strcpy(pp[num].s,p2[num2].s); strcpy(pp[num].p,p2[num2].p); num2++; } num++; } if(num1==n1) while(num2 { strcpy(pp[num].s,p2[num2].s); strcpy(pp[num].p,p2[num2].p); num2++; num++; } else while(num1 { strcpy(pp[num].s,p1[num1].s); strcpy(pp[num].p,p1[num1].p); num1++; num++; } *total = num; return pp; } void pshow(phoneform *pp,int n)//输出电话簿 { cout< for(int i=0;i cout< } int main() { phoneform *p1,*p2,*p; int n1,n2,n; cin>>n1; p1 = new phoneform[n1*sizeof(phoneform)]; readdata(p1,n1); cin>>n2; p2 = new phoneform[n2*sizeof(phoneform)]; readdata(p2,n2); p = pmerge(p1,p2,n1,n2,&n); pshow(p,n); return 0; }