连载三
/*合并电话簿
输入
有两本电话簿的描述。描述每本电话簿的第一行是一个正整数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<iostream>
#include<cstring>
#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<n;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<n1)&&(num2<n2))
{
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<n2)
{
strcpy(pp[num].s,p2[num2].s);
strcpy(pp[num].p,p2[num2].p);
num2++;
num++;
}
else
while(num1<n1)
{
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<<n<<endl;
for(int i=0;i<n;i++)
cout<<pp[i].s<<" "<<pp[i].p<<endl;
}
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;
}
连载三