C语言中按Lastname升序排序结构体数组的实现需求
C语言通讯录排序与打印问题解决方案
以下是修改后的完整代码,实现按姓氏升序排序并仅打印有效元素:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> struct phNum { char name[30]; char lastName[30]; int phone; }; typedef struct phNum PhNum; PhNum phList[5] = {}; // 按lastName升序排序phList数组,直接修改原数组 void sortPhListByLastName() { int i, j; PhNum temp; for (i = 0; i < 5 - 1; i++) { for (j = 0; j < 5 - i - 1; j++) { // 比较相邻元素的姓氏,前者字典序更大则交换 if (strcmp(phList[j].lastName, phList[j+1].lastName) > 0) { temp = phList[j]; phList[j] = phList[j+1]; phList[j+1] = temp; } } } } void showData() { // 先排序再打印 sortPhListByLastName(); printf("通讯录(按姓氏升序):\n"); for(int i = 0; i < 5; i++) { // 仅打印非空有效元素 if (!(strcmp(phList[i].name, "empty") == 0 && phList[i].phone == 0)) { printf("%d : %s | %s | %d\n", i+1, phList[i].name, phList[i].lastName, phList[i].phone); } } }
关键修改说明
排序函数实现:
使用冒泡排序直接操作全局数组phList,通过strcmp比较姓氏的字典序,交换时用临时结构体变量存储元素,确保排序结果直接覆盖原数组。之前你可能没正确处理结构体元素的交换,导致排序结果无法存入原数组,这种直接赋值结构体的方式可以解决这个问题。showData函数优化:
- 打印前先调用排序函数,保证输出是有序的;
- 调整判断逻辑,只输出
name不为"empty"或者phone不为0的有效元素,空条目会被自动跳过。
内容的提问来源于stack exchange,提问作者BGOPC
相关产品推荐
相关产品推荐

