You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数优化:

    1. 打印前先调用排序函数,保证输出是有序的;
    2. 调整判断逻辑,只输出name不为"empty"或者phone不为0的有效元素,空条目会被自动跳过。

内容的提问来源于stack exchange,提问作者BGOPC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:05:21