简体   繁体   中英

Sort an array of structs in c by a specific parameter

I have a structure for every user and I'm trying to sort them by users Lastname
Full code:

#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] = {};
void showData() {
    for(int i = 0;i < 5;i++) {
        if(strcmp(phList[i].name,"empty") == 0 && phList[i].phone == 0){
            printf("%d : %s | %s | null\n", i+1,phList[i].name,phList[i].lastName);
        }
        else {
            printf("%d : %s | %s | %d\n", i+1,phList[i].name,phList[i].lastName,phList[i].phone);
        }
    }
}

The array maximum is 5 items and the minimum is 0
I want to sort them ascending by their Lastname and if there are 4 items don't show the fifth one. and I want to override my Array phList and rewrite the sorted one my showData function is supposed to sort and print I tried These answers but I didn't understand: How to sort an array of structs in C? and How do I sort an array of structs in C by name, age and id?

I also tried to make a bubble sort algorithm but I was struggling to put my sorted data into my phList

Thanks For Help

For starters this declaration

PhNum phList[5] = {};

is invalid in C. Opposite to C++ in C you may not specify empty braces.

You could define the array like for example

PhNum phList[5] = { 0 };

To sort the array you can use standard C function qsort declared in header <stdlib.h> .

You need yourself to track how many actually initialized elements in the array. You may not change the array size.

For example if the array contains n initialized elements where n is greater than 0 and less than or equal to 5 then you can write

int cmp( const void *a, const void *b )
{
    const PhNum *p1 = a;
    const PhNum *p2 = b;

    return strcmp( p1->lastName, p2->lastName );
}    

and in main you can write

qsort( phList, n, sizeof( *phList ), cmp );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM