Versión en lenguaje C de diseño de curso de estructura de datos. Ahora estoy pidiendo una respuesta para el diseño de un curso. ¿Hay algún inmortal que pueda ayudarme? Solo puedo dar 100 puntos.

/*12.3.2 Programa fuente*/

/******Archivo de encabezado (.h)************** ****/

#include "stdio.h" /*Función de E/S*/

# include "bios.h" /*Función básica de entrada y salida de ROM* /

#include "dos.h" /*Función de interfaz dos*/

#include "conio.h" /*Función de operación de pantalla*/

#include "stdlib.h" / *Otras instrucciones*/

#include "string.h" /*Función de cadena*/

#include "mem.h" /*Memoria función de operación*/

#include "ctype.h" /*Función de operación de caracteres*/

#include "alloc.h" /*Función de asignación dinámica de direcciones*/

/** **Definición de variable*******/

typedef struct z1 /*Definir estructura de datos*/

{

char no[11]; /*Número*/

char nombre[15]; /*Nombre*/

float jbgz; /*Salario básico*/

float koukuan; / *deducción*/

float yfgz /*salarios adeudados*/

float shuijin /*impuestos*/

float; sfgz; /*Pagar salarios reales*/

struct z1 *prior;/*puntero precursor*/

struct z1 *next;/*puntero sucesor*/

}SALARIO; /*Nombre del tipo de estructura*/

struct z1 *Primero; /*Puntero de encabezado de lista doblemente enlazado*/

struct z1 *Último; puntero de cola*/

/******Prototipo de función************/

void init() /*Inicialización*/

void create (); /*Crear lista enlazada*/

void calc(); /*Calcular salarios adeudados*/

void delete(); /*Eliminar*/

void search(); /*Buscar*/

void save() /*Guardar archivo*/

void load( ); /*Leer archivo*/

void computer(); /*Calcular el número requerido de varios cupones*/

void insert() /*Insertar*/

void append (); /*Append*/

void copy() /*Copiar archivos*/

void sort() /*Ordenar*/

void index(); /*index*/

void total(); /*categoría total*/

void list(); todos los datos*/

void print(SALARIO *p); /*Generar un solo registro*/

void display() /*Mostrar uno por uno a voluntad*/<; /p>

fax flotante(flotante x );

Tax*/

int menu_select(); /*Menú principal*/

/**********Se inicia la función principal******* ****/

main()

{

int i;

clrscr();

for(;; )

{

switch(menu_select()) /*Llame a la función de menú para devolver un valor entero*/

{

case 0 :init();break; /*Inicialización*/

case 1:create();break; /*Ingresar datos para crear una lista doblemente enlazada*/

case 2:list() ;break; /*Mostrar todos los datos*/

case 3:display();break /*Pantalla única*/

case; 4:calc();break; /* Calcular salarios reales*/

case 5:search();break /*Buscar datos de información de empleados*/

case 6:delete; ();break; /*Eliminar registros */

case 7:insert();break; /*Insertar registro*/

case 8:append();break; *Agregar registro*/

case 9:save();break; /*Guardar el archivo*/

case 10:load() /*Leer el archivo* /

case 11 :copy();break; /*Copiar archivos*/

case 12:sort();break /*Ordenar en orden ascendente de salarios reales*/

case 13:computer ();break; /*Calcular el número requerido de cupones*/

case 14:index();break /*Indexar por número de empleado*/

caso 15:total( );break; /*Total por departamento*/

caso 16:exit(0); /*Salir*/

}

}

}

/*Función de menú, el valor de retorno de la función es un número entero que representa el elemento de menú seleccionado*/

menu_select()

{

char *f[]= { /*Definir matriz de cadenas de menú*/

"******** ******MENÚ*** **********", /*La línea de título del menú*/

" 0. init list", /*Inicializar el lista de doble enlace*/

" 1 . Ingresar lista", /*Ingresar datos y crear una lista de doble enlace*/

" 2. Listar todo \n", /*Mostrar todos los registros*/

" 3. Mostrar registro por paso", /*Mostrar un solo registro*/

" 4. Calcular el salario", /*Calcular el salario real* /

" 5. Buscar registro por nombre", /*Buscar registro*/

" 6. Eliminar un registro", /*Eliminar registro*/

" 7. Insertar registro en la lista", /*Insertar registro*/

" 8. Agregar registro a f

ile", /*Agregar registros*/

" 9. Guardar datos en el archivo", /*Guardar el archivo*/

" 10. Cargar datos desde el archivo", / *Leer el archivo*/

" 11. Copiar el archivo a un archivo nuevo", /*Copiar el archivo*/

" 12. Ordenar en sfgz", /*Ordenar */

" 13. Número de ticket de computadora", /*Calcular el número requerido de tickets*/

" 14. Índice del número", /*Índice*/

" 15. Total en número", /*Categoría total*/

" 16. Salir" } /*Salir*/

char s[80];

int i;

int key=0; /*Registra el valor de la tecla presionada*/

int c=0;

gotoxy(1 ,25); /*Mover el cursor*/

printf("presione cualquier tecla para ingresar al menú...\n");/*Presione cualquier tecla para ingresar al menú principal*/

getch();

clrscr(); /*Borrar pantalla*/

textcolor(YELLOW); /*Establecer color de texto en amarillo*/

textbackground(BLUE); /*Establece el color de fondo en azul*/

gotoxy(10,2);

putch(0xda); borde de la esquina superior izquierda┏ */

for(i=1;i<44;i++)

putch(0xc4); /*Emite la línea horizontal del borde superior*/

putch( 0xbf); /*Imprime el borde de la esquina superior derecha┓*/

for(i=3;i<22;i++)/*Imprime las líneas verticales a la izquierda y lados derechos*/

{

gotoxy(10,i);patch(0xb3);

gotoxy(54,i);patch(0xb3);

}

gotoxy(10,22);patch(0xc0); /*Generar el borde de la esquina superior izquierda┗*/

for(i=1 ;i<44;i++)

putch (0xc4); /*Imprime la línea horizontal del borde inferior*/

putch(0xd9); */

window(11,3,53,21) ; /* Crea una ventana para mostrar el menú, el tamaño se diseña de acuerdo con la cantidad de elementos del menú*/

clrscr(); /*Borrar la pantalla*/

for(i=0;i<18 ;i++)

{

gotoxy(10,i +1);

cprintf("%s",f[i]); /*matriz de elementos del menú de salida*/

}

i=1 ;

gotoxy(10,2); /*Establece la opción predeterminada en el primer elemento*/

textbackground(LIGHTGREEN);/*Establece el color de fondo en verde claro*/

cprintf("%s",f[1]); /*Elemento del menú de salida, indicando seleccionado* /<

/p>

gotoxy(10,2); /*Mover el cursor al primer elemento del menú*/

while(key!=13) /*Cuando la tecla presionada no es la Ingresar clave* /

{

while(bioskey(1)==0 /*Consultar si se presiona una tecla*/

key=bioskey; (0 ); /*Regresar a la siguiente tecla presionada en el teclado*/

key=key&0xff?key&0xff:key>>8 /*Juzgar la tecla presionada*/

gotoxy(10,i+1);

textbackground(BLUE);/*Establece el color de fondo en azul*/

cprintf("%s",f[i] ) ; /*Elemento del menú de salida*/

if(key==72) i=i==1?17:i-1 /*Si se presiona la tecla de cursor hacia arriba ↑, disminuiré en 1, como por ejemplo, si llegó a la primera línea y luego subió, irá a la última línea*/

if(key==80)i=i==17?1:i+ 1; /*Si presiona la tecla de cursor hacia abajo ↓, aumenta i en 1, si ha llegado a la última línea y luego baja, vaya a la primera línea*/

gotoxy(10,i+ 1); /*Mover el cursor al siguiente elemento de i*/

textbackground(LIGHTGREEN) /*Establecer el color de fondo en verde claro*/

cprintf("%); s",f[i]); /*Salida de elementos del menú*/

c=i-1; /*Asigne un valor al número entero que representa la opción del menú*/

}

textbackground(BLACK); /*Establecer el color de fondo en negro */

window(1,1,80,25) /*Restaurar el tamaño de la ventana original*/

return c; /*Devuelve el valor entero que representa la opción del menú*/

}

/*Función de inicialización*/

void init()

{

Primero=NULL

Último=NULL;

}

/ *Ingrese datos y cree una lista doblemente enlazada*/

void create()

{

int /*Registrar coordenadas de fila*/

int i; /*Registrar el número de registros de entrada*/

int flag= 0; /*Hacer una marca de final*/

float temp /*Definir variables temporales*/

SALARIO *info,*p /*Definir variables temporales*/

if(First!=NULL)

init(); /*Si el puntero principal es nulo, llame a la función de inicialización*/

p=First /*Puntero principal Inicio*/

for(;;)

<; p> {

if(flag==1)

break; /*if flag =1, finalizar entrada*/

i=0;

x=0; /*Determinar las coordenadas de la fila móvil*/

clrscr() / *Borrar pantalla*/

gotoxy(1,3);

printf("******************gongziguanli******* ******");/*Título de salida*/

tengo

oxy(1,4);

printf(" --Enter @ end--");/*Solicitar ingresar @end*/

gotoxy(1,5);

printf("|------------------------------------------------ ------|"); /*Muestra la línea inicial de la tabla*/

gotoxy(1,6);

printf("| no | name | jbgz |");/*Títulos de los campos de salida, preste atención al número de espacios*/

for(;;)

{

gotoxy(1 ,7+x);

printf( "|----------|----------------|----- ---|");/*Generar la línea horizontal de la tabla*/

info=(SALARY *)malloc(sizeof(SALARY));/*Solicitar un espacio de registro*/

if(!info)

{

printf("\nout of Memory");/*Si no se obtiene espacio, genera información de desbordamiento de memoria*/

exit(0);/*Salir del programa*/

}

info->next=NULL;/*El sucesor del nuevo nodo está vacío */

info->prior=NULL;/*El sucesor del nuevo nodo está vacío El predecesor está vacío*/

gotoxy(1,8+x);printf( "|"); /*La línea divisoria entre los datos de salida*/

gotoxy(12,8 +x);printf("|");

gotoxy(29,8 +x);printf("|");

gotoxy(38,8+x); printf("|");

gotoxy(2,8+x); /*El cursor va a la posición del número de entrada*/

inputs(info->no,10);/ *Ingresa el número y verifica que la longitud no exceda de 10*/

if(info->no[0]=='@')

{

bandera =1;

descanso;

} /*El primer carácter del número es @ para finalizar la entrada*/

gotoxy(13,8+x); /*Cursor Ir a la posición del nombre de entrada*/

inputs(info->name,14); /*Ingrese el nombre y verifique que la longitud no exceda 14*/

gotoxy(30,8+x ); al puesto donde se ingresa el salario base*/

scanf("%f",&temp /*Ingrese el salario base en la variable temporal*/

info->); jbgz =temp; /*Asignación de salario básico*/

info->koukuan=0; /*La deducción inicial es 0, ingrese al calcular el salario*/

info->sfgz = 0; /*El salario real inicial es 0 y se calculará cuando se calcule el salario*/

info->shuijin=0 /*El impuesto inicial es 0; se calculará cuando se vaya a calcular el salario*/

info->yfgz=0 /*El salario inicial a pagar es 0, y se calculará cuando se vaya a calcular el salario*/

if(p==NULL)/*Si p está vacío, indica que la entrada es el primer nodo*/

{

Primero

=Último=info;/*Puntero de cabeza y puntero de cola*/

Primero->prior=NULL /*El predecesor del puntero de cabeza es NULL*/

Último->; next= NULL /*El sucesor del puntero de cola es nulo*/

}

else /*El nodo insertado no es el primer nodo, entonces se inserta antes del encabezado. nodo*/

{

info->next=p;/*El sucesor del nuevo nodo apunta al nodo principal original*/

info- >prior=p- >prior;/*El predecesor del nuevo nodo apunta al predecesor del nodo principal original*/

p->prior=info;/*El predecesor del nodo original apunta al nuevo nodo*/

}

p=info; /*El nuevo nodo se convierte en el nodo p, el nodo principal temporal*/

Primero= info; /*Nuevo nodo Conviértete en el nodo principal*/

x+=2; /*Debido a la línea horizontal, mueve el cursor hacia abajo dos líneas*/

gotoxy(1, 8+x);

i++; /*Agregar 1 al número de registros de entrada*/

if(i%9==0)

break ; /*Ingrese 9 registros y cambie la página Ingrese */

}

gotoxy(1,8+x);

}

<; p> printf("|---- ------|----------------|----------------|");/*Emitir el línea horizontal final*/

}

/*Entrada de cadena y función de verificación*/

entradas(char *s, int count)

{

char p[255];

do{

scanf("%s",p);/*Cadena de entrada*/

if(strlen(p )>count)printf("\n ¡demasiado largo! \n");/*Realice la verificación de longitud y vuelva a ingresar si el valor excede el recuento*/

} while(strlen(p)>count);

strcpy(s,p /*Copia la cadena de entrada a la cadena s*/

}

<); p>/*Mostrar la lista enlazada*/

void list()

{

int i=0,n /*Registra el número de salida; líneas*/

SALARIO *p ; /*Definir el puntero en movimiento*/

clrscr() /*Borrar la pantalla*/

p=Primero /*Comienza desde el puntero principal*/

while(i%10==0&&p!=NULL) /*El bucle externo controla el cambio de página*/

{

i=0; /*Registrar el número de líneas de salida en una página* /

clrscr() /*Borrar pantalla*/

printf("\n\ n\n"); /*Ajustar tres líneas*/

printf("*************************** *********SALARIO********** ****************************** \n"); /*Título de salida*/

printf("|nO | nombre | jbgz | koukuan | yfgz

| shuijin | sfgz |\n"); /*Título del campo de salida*/

printf("|----------|----------- ----|---------|---------|---------|---------|----- ----|\n"); /*Línea horizontal de salida*/

while(p!=NULL) /*Cuando p no está vacío*/

{

printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n",

p - >no,p->nombre,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);

p=p->siguiente; * Mover el puntero hacia atrás*/

i++ /*Agregar 1 al número de línea de salida */

if(i%10==0)

break; /* Si hay 10 líneas, salte del bucle interno*/

}

printf("************** ********** ******************fin********************* *************** ****\n"); /*Imprimir la línea final de esta página*/

printf("Presione cualquier tecla para continuar. ..\n");

getch( ); /*Pausa la salida de una página y presiona cualquier tecla para continuar*/

} /*Regresa al bucle exterior y prepárate para la siguiente página de salida*/

}

/*Registro de visualización única*/

void display()

{

int ch; /*Carácter de opción de menú*/

SALARIO *p; /*Definir puntero temporal*/

clrscr() /*Borrar pantalla*/

p=First; /*Comienza desde el puntero principal*/

if(p==NULL) /*El puntero está vacío, es decir, la lista vinculada está vacía, regresa a la función principal*/

{

printf("¡el registro está vacío!\n");

return;

}

else

{

print(p ); /*Llame a la función de salida para mostrar la información del nodo del encabezado*/

para (;;) /*El ciclo comienza*/

{

printf(" \n\n0. Salir 1. Anterior 2. Siguiente 3. Primero 4.Último \n\ n");

/*Elemento de menú Salir Salir Anterior Anterior Siguiente Siguiente Primero Primero Último Último* /

printf("\npor favor seleccione 0~4:"); /*Preguntar para la opción de menú 0~4*/

scanf("%d",&ch / *Ingrese las opciones de menú 0~4*/

if(ch==0) break); /*Si la opción es 0, salir*/

switch(ch) /*Sentencia de cambio Juzgar según los caracteres de la opción*/

{

case; 1:p=p->

prior;if(p==NULL)p=First;break; /*Apunta al predecesor, ningún predecesor apunta al primero*/

case 2:p=p->next;if(p == NULL) p=Último;break; /*Apunta al sucesor, si no hay sucesor, apunta al último*/

case 3:p=Primero;break; al primer nodo*/

case 4:p=Last;break; /*Apunta al último nodo*/

}

print(p) /*Llame a la función de salida para mostrar la información del nodo del puntero*/

}

}

}

/*Emite el información del nodo señalado por el puntero*/

void print(SALARY *p)

{

if(p) /*Si el puntero no está vacío, mostrar información*/

{

clrscr() /*Borrar pantalla*/

printf("\n\n\n"); Nueva línea*/

printf ("************************************SALARIO *********** *************************\n"); /*Información del título de salida*/

printf("|no | nombre | jbgz | koukuan| yfgz | shuijin | sfgz |\n"); /*Título del campo de salida*/

printf("|---- ------|---- ----------|---------|---------|-------- -|-------- -|---------|\n"); /*Línea divisoria de salida*/

printf("|%-10s|% -15s|%9.2f|%9.2f |%9.2f|%9.2f|%9.2f|\n", p->no,p->nombre,

p->jbgz,p ->koukuan,p->yfgz,p ->shuijin,p->sfgz);/*Información del nodo de salida*/

printf("*************** *********** *******************fin******************* ********* *** ****\n"); /*Marca final de salida*/

}

}

/*Calcular salarios reales*/

void calc()

{

int x /*Coordenadas de fila*/

int i=0; /*Número de registros*/

float temp; /*Deducción de variable temporal*/

SALARIO *p;

clrscr(); /*Borrar pantalla */

p=Primero; /*Comenzar desde el puntero principal*/

while(p!=NULL) /*Cuando p no está vacío, es decir, cuando hay un registro, la página de control de bucle externo cambia*/

{

x=0;

clrscr( );

gotoxy(1,3);

printf("**********

****************gongziguanli********************************* *** ***"); /*Título de salida*/

gotoxy(1,5);

printf("|---------- --- ----------------------------------------------- --- -----------|");

gotoxy(1,6);/*Títulos de los campos de salida a continuación*/

printf(" | no | nombre | jbgz | koukuan | yfgz |shuijin |");

while(p!=NULL) /*Cuando p no está vacío, es decir, cuando hay un registro, El bucle interno controla y procesa 9 registros */

{

gotoxy(1,7+x);

printf("|------ ----|-- ---------------|--------|----------|--------------- -|------ --|--------|");

gotoxy(1,8+x);printf("|");

gotoxy(12,8 +x);printf("|");

gotoxy(29,8+x);printf("|");

gotoxy (38,8+x); printf("|");

gotoxy(49,8+x);printf("|");

gotoxy(58,8) +x);printf("| ");

gotoxy(67,8+x);printf("|");

gotoxy(76,8+x); printf("|");

gotoxy(2,8+x);

printf("%-10s",p->no); /*número de salida*/

gotoxy (13,8+x);

printf("%-15s",p->nombre); /*Nombre de salida*/

gotoxy(30,8+x) ;

printf("%.2f",p->jbgz /*Salario básico de salida*/

gotoxy(39,8+) x);

scanf("%f",&temp); /*Ingresar deducción*/

p->koukuan=temp /*Asignación del campo de deducción*/

p- >yfgz=p->jbgz-p->koukuan; /*Calcular salario a pagar = deducción del salario básico*/

gotoxy(50,8+x);

printf("%.2f",p->yfgz); /*Importar el salario adeudado*/

gotoxy(59,8+x);

p->shuijin= (p->yfgz-1000)*fax(p->yfgz); /*De lo contrario, el impuesto se calcula según la tasa impositiva*/

printf("%.2f ",p->shuijin); /*Impuestos sobre la producción*/

gotoxy(68,8+x);

p->sfgz=p->yfgz-p-> shuijin; /*Calcular salarios reales*/

printf

("%-8.2f",p->sfgz); /*Salarios reales de salida*/

x+=2; /*Mover las coordenadas de la fila dos líneas hacia abajo*/

i++; /*Aumentar el número de registros en 1*/

if(i%9==0)break; /*El número de registros excede 9, saltar fuera del bucle interno*/

p= p->next; /*Mover el puntero hacia atrás y procesar el siguiente elemento*/

}

gotoxy(1,7+x);

printf(" |----------|----------------|--------|--- -------|- -------|--------|--------|\n"); /*Fin de la línea de salida*/

printf("Presione cualquier tecla para continuar...\n");

getch();

}

}

/*Según el salario adeudado, calcular la tasa impositiva*/

float fax(float x)

{

float f1;

if(x<1000)

devuelve 0; /*menos de 1000, devuelve 0*/

switch((int)(x/1000))

{

caso 1:f1=0.05;break; /*1000~1999, devuelve 0.05*/

caso 2:f1=0.1;break; /*2000~2999, devuelve 0.1*/

caso 3:f1=0.15;break; /*3000~3999, devuelve 0.15*/

caso 4:f1=0.2; break; /*4000~4999, devuelve 0.2*/

default:f1=0.3;break; /*Por encima de 5000, devuelve 0.3*/

}

return f1;

}

/*Calcular el número de cupones*/

void computer()

{

SALARIO *p;

int i=0,a[7]={0},t100,t50,t20,t10,t5,t2,t1;/*Establecer la matriz y temporal variables para guardar el número de cupones*/

float t /*Variable de transición, guarda el salario restante actual*/

p=Primero /*Mueve el puntero comenzando desde el puntero de inicio*/

while(p!=NULL) /*Cuando p Cuando no está vacío*/

{

t100=(int)p-> sfgz/100; /*Calcular el número de hojas de 100 yuanes*/

a [0]=a[0]+t100; /*ahorro acumulado*/

t=p ->sfgz-t100*100; /*salario restante*/

t50= (int)(t/50); /*Calcular el número de hojas de 50 yuanes*/

a[1]=a[1]+t50; /*Ahorrar acumulativamente*/

t=t-t50*50; /*Salarios restantes*/

t20=(int )(t/20); /*Calcular el número de hojas de 20 yuanes*/

a[ 2]=a[2]+t20 /*acumular y guardar*/

t=t-t2

0*20; /*Salarios residuales*/

t10=(int)(t/10); /*Calcular el número de hojas de 10 yuanes*/

a[3] =a [3]+t10; /*Acumular y ahorrar*/

t=t-t10*10; /*Salario restante*/

t5=(int)(t /5) ; /*Calcular el número de hojas de 5 yuanes*/

a[4]=a[4]+t5 /*Guardar acumulativamente*/

t=t; -t5*5; /*Salarios residuales*/

t2=(int)(t/2); /*Calcular el número de hojas de 2 yuanes*/

a[5); ]=a[5]+ t2; /*Acumular y ahorrar*/

t=t-t2*2; /*Salario restante*/

t1=(int)( t); /*Calcular 1 yuan Número de imágenes*/

a[6]=a[6]+t1 /*Acumulado y guardado*/

p=p-; >next; /*Mover el puntero hacia atrás y procesar el siguiente registro*/

}

clrscr() /*Borrar pantalla*/

printf(" \n\n\n**** *******número de billete******************\n"); /*Título de salida*/

printf("--100-- ---50------20-----10-----5------2------1-- ----\n");

/*Ingrese el número de títulos de imágenes*/

for(i=0;i<7;i++)

printf("%5d ",a[i] );/*Imprima el número requerido de hojas*/

printf("\n");/*Salto de línea*/

}

/*Presione Registro de búsqueda de número*/

SALARIO *find(char *no)

{

SALARIO *p; /*Definir puntero móvil*/

p=Primero; /*Comenzar desde el puntero principal*/

while(p) /*Cuando p no está vacío*/

{

if(!strcmp(no,p->no))

return p; /*Comparar igual, encontrar correctamente, devolver puntero*/

p=p->next; / *El puntero desigual se mueve hacia atrás*/

}

printf("not found\n"); *No encontrado*/

return NULL; / *devuelve como un puntero nulo*/

}

src="/style/tongji.js">