写几个函数:
①输入10个职工的姓名和职工号;
②按职工号由小到大顺序排序,姓名顺序也随之调整;
③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
#include <stdio.h>
#define N 10
// 第7章/p216/15
struct Employee { // 定义结构体
int id; // 职工号
char name[10]; // 姓名
};
void input(struct Employee emp[]);
void sort(struct Employee emp[]);
void search(struct Employee emp[], int id);
int main() {
struct Employee emp[N], *p = emp; // 定义结构体数组和结构体指针
int id;
input(p);
sort(p);
printf("请输入查询职工号:");
scanf("%d", &id);
search(p, id);
return 0;
}
// 输入10个职工的数据记录
void input(struct Employee emp[]) {
for (int i = 0; i < N; i++) {
printf("输入%d个职工姓名和职工号:", i + 1);
scanf("%d %s", &emp[i].id, emp[i].name);
}
}
// 按职工号由小到大排序,姓名顺序也随之调整(使用冒泡排序:从小到大)
void sort(struct Employee emp[]) {
struct Employee temp; // 交换时的临时变量
for (int i = 0; i < N - 1; i++) {
for (int j = 0; j < N - 1 - i; j++) {
if (emp[j].id > emp[j + 1].id) {
temp = emp[j];
emp[j] = emp[j + 1];
emp[j + 1] = temp;
}
}
}
printf("职工号由小到大顺序后:\n");
for (int i = 0; i < N; i++) {
printf("职工号:%d,姓名:%s", emp[i].id, emp[i].name);
printf("\n");
}
}
// 输入要查找的职工号,输出该职工姓名(折半查找法,前提已排好序)
void search(struct Employee emp[], int id) {
int low = 0, high = N - 1, mid; // low:最低索引,high:最高索引,mid:中间项索引
while (low <= high) {
mid = (low + high) / 2; // 求出mid在low和high之间的位置
if (id == emp[mid].id) break; // 若id等于emp[mid].id,则直接返回,结束循环
else if (id > emp[mid].id) low = mid + 1; // 若id大于emp[mid].id,low从mid处开始加1,即下一轮循环从[mid+1,high]查找
else high = mid - 1; // 若id小于emp[mid].id,high从mid处开始减1,即下一轮循环从[low,mid-1]查找
}
if (low <= high)
printf("职工号为%d的员工姓名为:%s", emp[mid].id, emp[mid].name);
else
printf("找不到或不存在该职工!");
}