题目:
题目描述
⑴ 自定义结构类型用于存储以下联系人信息,用typedef将类型标识符定义为PS。
long id : 学号
char name[10]: 姓名
char sex[2] : 性别(m 代表男,f 代表女)
⑵ 编写函数int del(PS *p1, int m, PS *p2,int n) 。 p1指向数组中保存m个联系人信息, p2指向数组中保存n个联系人信息。从p1数组中删除在p2数组中重复出现的联系人信息(id值相同)。返-回值为执行删除操作后p1数组中保存的联系人信息的数量。
⑶ 编写函数int merge(PS *p1,int m, PS *p2 ,int n) 。p1指向数组中保存m个联系人信息, p2指向数组中保存n个联系人信息。将p1数组中联系人信息合并到p2数组中。已知p1和p2数组中存储的联系人信息按成员id升序排列,合并后p2数组中的联系人信息仍按id升序(从小到大)排列。返回值为合并后p2数组中联系人信息的数量。
⑷ 编写函数void sort(PS *p,int n),对p指向的数组中的n个联系人信息排序。要求:按性别排序(f在前m在后,f的编码小于m的编码),性别相同的按姓名排序(字典序)。
⑸ 编写函数void display(PS *p,int n), 将p指向的数组中存储的n个联系人信息输出到显示器(第一行显示标题,以后每行显示一个联系人信息)。
⑹ 编写main函数,声明结构数组a、b并用测试数据初始化(a、b数组中数据按成员id值升序存储;显示a,b数组中数据(显示数组数据调用display函数完成,下同);调del函数从a数组中删除在b数组中重复出现的联系人信息,显示a数组中数据;调merge函数将a数组中全部联系人信息合并到b数组,显示b数组中数据;调sort函数对a数组中数据排序,显示a数组中数据。
代码:(带详细注释)
#include<stdio.h>
#include<string.h>
typedef struct{
long id;
char name[10];
char sex[2];
}PS;//自定义结构类型,标识符定为PS
int del(PS *p1, int m, PS *p2,int n){//把a数组中在b数组中重复出现的元素删除,返回删除后a数组中元素的个数
int i,j,k;//m是a数组中元素个数,n是b数组中元素个数
for(i=0;i<m;i++)//遍历a、b数组中的元素,寻找重复元素并且删除
for(j=0;j<n;j++){
if(strcmp(p1[i].name,p2[j].name)==0){//进行字符串比较,若最后值为0则说明两个字符串完全相同
for(k=i;k<m-1;k++){//利用循环来删除a数组中重复的字符串
p1[k].id=p1[k+1].id;
strcpy(p1[k].name,p1[k+1].name);//注意用strcpy来对字符串进行赋值
strcpy(p1[k].sex,p1[k+1].sex);
}
m--;
i--;
}
}
return m;
}
int merge(PS *p1,int m, PS *p2 ,int n){//把a、b数组信息合并,按学号升序排列,返回合并后的信息个数
int i,j,k=m+n,t;
char temp[10];
for(i=0;i<m;i++){//把a数组中的信息全部放入b数组信息的后面去
p2[n+i].id=p1[i].id;
strcpy(p2[n+i].name,p1[i].name);
strcpy(p2[n+i].sex,p1[i].sex);
}
for(j=0;j<5;j++){
for(i=0;i<k-1;i++)//对b数组中学号进行排序同时交换名字和性别信息
if(p2[i].id>p2[i+1].id){
t=p2[i].id;
p2[i].id=p2[i+1].id;
p2[i+1].id=t;//大的学号放在后面
strcpy(temp,p2[i].name);//利用字符数组temp来交换姓名信息,因为字符串不能直接进行赋值操作
strcpy(p2[i].name,p2[i+1].name);
strcpy(p2[i+1].name,temp);
strcpy(temp,p2[i+1].sex);//利用字符数组temp来交换性别信息,因为字符串不能直接进行赋值操作
strcpy(p2[i+1].sex,p2[i].sex);
strcpy(p2[i].sex,temp);
}
}
return m+n;
}
void sort(PS *p,int m){// 对p指向的数组中的n个联系人信息排序。要求:按性别排序(f在前m在后,f的编码小于m的编码),性别相同的按姓名排序(字典序)
int i,k,t;
char temp[10];
for(k=0;k<4;k++){
for(i=0;i<m-1;i++){
if(strcmp(p[i].sex,p[i+1].sex)>0){//利用strcmp比较性别字符编码的差值来判断男女,并交换相关信息,让f在上,m在下
t=p[i].id;
p[i].id=p[i+1].id;
p[i+1].id=t;
strcpy(temp,p[i].name);
strcpy(p[i].name,p[i+1].name);
strcpy(p[i+1].name,temp);
strcpy(temp,p[i+1].sex);
strcpy(p[i+1].sex,p[i].sex);
strcpy(p[i].sex,temp);
}
}
}
for(k=0;k<4;k++){//利用strcmp比较姓名字符编码的差值来排序,并交换相关信息
for(i=0;i<m-1;i++){
if(strcmp(p[i].name,p[i+1].name)>0){
t=p[i].id;
p[i].id=p[i+1].id;
p[i+1].id=t;
strcpy(temp,p[i].name);
strcpy(p[i].name,p[i+1].name);
strcpy(p[i+1].name,temp);
strcpy(temp,p[i+1].sex);
strcpy(p[i+1].sex,p[i].sex);
strcpy(p[i].sex,temp);
}
}
}
return;
}
void display(PS *p,int n){//定义一个输出结构类型数组的函数display
printf("\nID NAME SEX");
int i;
for(i=0;i<n;i++)
printf("\n%ld %s %s",p[i].id,p[i].name,p[i].sex);
}
int main(void)//主函数,调用已编写的各个函数
{
PS a[10]={{101, "tom","m"},{103,"mary","f"},{104,"mark","m"},{105,"julia","f"},{106, "sara","f"}},
b[10]={{102, "mark","m"},{104,"mark","m"}};//用PS来定义两个结构类型数组并且进行初始化,字符串要用双引号括住勿漏
int m=5,n=2;
printf("a:");
display(a,5);//调用display函数输出a、b数组中的数据
printf("\nb:");//换行
display(b,2);
m=del(a,m,b,n);//调用del函数删除a数组中在b数组中重复出现的信息,返回最终a数组中信息个数
printf("\na:");
display(a,m);
n=merge(a,m,b,n);//此时a、b数组中信息已经完全不相同了,可以直接合并再排序即可
printf("\nb:");
display(b,n);
sort(a,m);// 调sort函数对a数组中数据排序,显示a数组中数据。
printf("\na:");
display(a,m);
return 0;
}

浙公网安备 33010602011771号