Como ordenar un struct por nombres en C?

Tengo una estructura con los siguientes campos

Nombre, Apellido, Número de identidad y al querer ordenarlos alfabéticamente me he complicado un poco, porque no he podido entender en donde esta mi error... Por favor si me ayudan les agradecería!

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define N 5

typedef struct datos{
char nombre[80];
char apellido[80];
char ci[30];
int id;

}DATOS;

void ordenar_nombre(DATOS v[])
{
int i,j,cmp;
char aux[80];
for(j=1;j<N;j++)
{
cmp=strcmp(v[j].nombre,v[j+1].nombre); //compara los nombres de las estructuras
if(cmp>0)
strcpy(aux,v[j].nombre);//copia nombre en la variable auxiliar
strcpy(v[j].nombre,v[j+1].nombre);
strcpy(v[j+1].nombre,aux);
}
system("pause");
}

int main()
{
system("color 5F");
DATOS v[N];
int opcion;
char opcion1;
inicializar_vector(v);
int p=0;
while(opcion !=8){
desplegar_menu();
scanf("%d", &opcion);
switch(opcion){
case 1:
system("cls");
cargar_identidad(v,p);
p++;
break;
case 2:
system("cls");
borrar_identidad(v);
break;
case 3:
busqueda_nombre(v);
break;
case 4:
busqueda_apellido(v);
break;
case 5:
busqueda_ci(v);
break;
case 6:
system("cls");
ordenar_nombre(v);
break;
case 7:
system("cls");
desplegar_lista(v);
break;
case 8:
default:
break;
}
}
return 0;
}

void inicializar_vector(DATOS v[]){
int i;
for(i=0; i<N; i++){
v[i].id= -1;
}
}

void cargar_identidad(DATOS v[], int i ){
if(i==N){
puts("Espacio Insuficiente para agregar el contacto");
}
puts("\t\t\tAGREGAR CONTACTOS");
printf("\nNombre: ");
fflush(stdin);
gets(v[i].nombre);
printf("\nApellido: ");
fflush(stdin);
gets(v[i].apellido);
fflush(stdin);
printf("\nCedula de Identidad : ");
gets(v[i].ci);
v[i].id=i+1;
puts("\n\nEl contacto se ha agregado correctamente. . . \n\n");
system("pause");
}

void desplegar_menu(){
system("cls");
puts("\t\t\tAGENDA DE CONTACTOS\n\n\n");
puts("1- Agregar Contactos ");
puts("2- Borrar Contacto ");
puts("3- Buscar por Nombre ");
puts("4- Buscar por Apellido");
puts("5- Buscar por Nro de ci");
puts("6- Ordenar por Nombre");
puts("7- Desplegar lista de Contactos");
puts("8- SALIR");
printf("\nOpcion: ");
}

void borrar_identidad(DATOS v[])
{
int x;
desplegar_lista(v);
printf("\nNumero de contacto que desea eliminar ");
scanf("%d",&x);
v[x].id= -1;
printf("\n\tEl contacto se ha eliminado correctamente\n\n\n");
system("pause");
}

void desplegar_lista(DATOS v[]){
int j;
puts("\t\t\tCONTACTOS ");
puts("\n");
printf("\n\tNombre\t\tApellido\tNro de C.I ");
puts("\n\t__________|___________|_________________\n");
for(j=0; j<N; j++){
if(v[j].id !=-1)
printf("\n%d- \t%s \t\t%s \t\t%s",j,v[j].nombre,v[j].apellido,v[j].ci);
}
puts("\n\n");
system("pause");
}
void imprimir_busqueda(DATOS v[], int i){

puts("Resultados Encontrados");
printf("\nNro contacto:\t\t%2d",i);
printf("\nNombre:\t\t\t%2s", v[i].nombre);
printf("\nApellido:\t\t%2s", v[i].apellido);
printf("\nNro de C.I:\t\t%2s\n",v[i].ci);
}

void busqueda_nombre(DATOS v[])
{
int i;
char name[80];
puts("\t\t\tBusqueda por Nombre");
printf("\nNombre de la persona que desea buscar: ");
scanf("%s",&name);
for(i=0; i<N; i++){
if(strcmp(v[i].nombre,name)==0){
imprimir_busqueda(v,i);
}
}
system("pause");
}

void busqueda_apellido(DATOS v[])
{
int i;
char name[80];
puts("\t\t\tBusqueda por Apellido");
printf("\nApellido de la persona que desea buscar: ");
scanf("%s",&name);
for(i=0; i<N; i++){
if(strcmp(v[i].apellido,name)==0){
imprimir_busqueda(v,i);
}
}

system("pause");
}
void busqueda_ci(DATOS v[])
{
int i;
char name[80];
puts("\t\t\tBusqueda por Nro C.I");
printf("\nNro de C.I de la persona que desea buscar: ");
scanf("%s",&name);
for(i=0; i<N; i++){
if(strcmp(v[i].ci,name)==0){
imprimir_busqueda(v,i);
}
}

system("pause");
}

Añade tu respuesta

Haz clic para o