Your data structure doesn't directly record an employee number. You have the array stack
which records the employee number, and the array employee
which records names. You need to preserve the relationship stack[i]
contains the employee number for employee[i]
which means any sorting of the existing data structure has to sort two arrays in parallel. While it can be done, it is not the best way to fix the problems (and it is harder than it need be, and will require a custom sort function).
You should upgrade the data structure to include the employee number:
struct employee
{
int number;
char first_name[15];
char surname[15];
} employee[20];
Note that I've retagged the structure as struct employee
(instead of struct system
) since it seems more relevant to the content of the structure.
You can then use the qsort()
function from the standard C library (declared in <stdlib.h>
) and the techniques documented in the proposed duplicate (How to sort an array of structs in C?) to sort the data straight-forwardly. It is also easier to write your searching code.
You can also clean up the display code; you can have a single function that is passed an employee structure (or pointer to one). It will contain a single printf()
statement that formats the data correctly. This saves you writing the same elaborate printf()
code 3 times, making it easier to fix the formatting if (when) you need to do so. You can also avoid using tabs in the output (generally a good idea), leading to:
void print_employee(const struct employee *emp)
{
printf("%8d %-15s %-15s\n", emp->number, emp->first_name, emp->surname);
}
This will produce well aligned output unless your employee number grows to more than 8 digits (in which case, change the 8 to 10 or whatever). You can also generalize one step further if you wish, passing a FILE *fp
argument to the function, and using fprintf(fp, "…", …)
instead of printf()
.
You call the function:
print_employee(&employee[i]);
You might also consider a function to print the headings since you have that function call 3 times. Alternatively, you might just have a constant string at file scope that contains the correct headings which you use in 3 places. You could do that with the print_employee()
function too; have a constant string at file scope that is the format you use.
Also, in your display_first()
and display_last()
functions, the loops are curious. You've written:
for(i=front;i<=top;i++)
break;
{
printf(" %d \t\t %s \t %s\n", stack[i], employee[i].first_name, employee[i].surname);
}
You should realize (on review) that this is equivalent to:
i = front;
printf(" %d \t\t %s \t %s\n", stack[i], employee[i].first_name, employee[i].surname);
(If front
is larger than top
, then i = front
is the only part of the loop executed; otherwise, the break
is executed; either way, after the loop, i == front
.)