¡Date prisa! ¡urgente! Cree urgentemente una lista enlazada dinámica, use la función malloc para abrir un nuevo nodo, el nodo contiene el nombre, la edad, el número de estudiante y luego genere el código fuente, ¡urgente!
#includelt;malloc.hgt;
#includelt;string.hgt;#define NAMEMAX 50
#define NOMAX 20
#define DATATYPE STUDENT
typedef struct node
{
void *data;
struct node *left; p> p>
nodo de estructura *right;
}NODO; estructura typedef
{
nodo de estructura *head; > nodo de estructura *actual;
nodo de estructura *trasero;
int count;
}typedef estructura
{ p>
nombre de char[NOMBREMAX];
int edad;
char no[NOMBREMAX]
}DATATYPE; )
{
lista-gt; cabeza=NULL
lista-gt; actual=NULL
lista-gt; rear= NULL;
list-gt; count=0;
}void add_linklist(lista de enlaces *lista, void *datos)
{
NODO *nuevoNodo;
nuevoNodo=(NODO *)malloc(tamañode(NODO));
nuevoNodo-gt; datos=datos;
if( lista-gt; cabeza==NULL)
{
lista-gt; cabeza=nuevoNodo;
lista-gt; /p >
lista-gt; trasero=nuevoNodo;
nuevoNodo-gt; izquierda=NULL
nuevoNodo-gt; > lista -gt; recuento;
}
else
{
lista-gt;
p>
nuevoNodo-gt; izquierda=lista-gt;
nuevoNodo-gt;
lista-gt; trasero=nuevoNodo;
lista-gt; trasero=nuevoNodo;
lista-gt; actual=nuevoNodo
lista-gt; >
} p>
}
void free_list(lista de enlaces *lista, DA
TATYPE*)
{
NODO *tmp=list-gt;head;
while(tmp!=NULL)
{
if(tmp-gt;left==NULL)
{
tmp=tmp-gt;right;
continuar;
}
else if(tmp-gt;right==NULL)
{
gratis((DATATYPE*)(tmp -gt; datos));
gratis(tmp);
descanso
}
más
{ p> p>
free((DATATYPE*)(tmp-gt;left-gt;data));
free(tmp-gt;left);
tmp =tmp -gt;
}
} init_linklist(lista);
retorno
}void printlist(lista de enlaces) lista, TIPO DE DATOS*)
{
NODO *tmp=list-gt;head;
int i= 0;
mientras (tmp ! =NULL)
{
printf("registro dth:\n", i);
printf("------ -- --------------------\n");
printf("El nombre es: s\n", ((DATATYPE*) (tmp -gt;data))-gt;name);
printf("La edad es: d\n", ((DATATYPE*)(tmp-gt;data))-gt;age) ;
printf("El número de escuela es: s\n ", ((DATATYPE*)(tmp-gt; data))-gt;
printf("- -----------------------\n");
tmp=tmp-gt;right;
}
return;
}int main()
{
TIPO DE DATOS *pStu=NULL
<; p> char buf[50]={0};lista de enlaces;
init_linklist(amp.list);
while(1)
{
pStu=(DATATYPE*)malloc(sizeof(DATATYPE));
memset(pStu, 0, sizeof(DATATYPE)); nombre.");
fgets(pStu-gt; nombre, NAMEMAX, stdin);
pStu-gt; nombre[strlen(pStu-gt; nombre)-1]= 0; printf("Ingrese una edad: ");
"d", amp; (pStu-gt; edad));
getchar(); printf("Ingrese el número de serie:
fgets(pStu-gt; no, NOMAX, stdin);
pStu-gt; no[strlen(pStu-gt; no) -1]=0; add_linklist(amp; lista, pStu);
printf("Continuar agregando (s/n) o no: ");
memset(buf, 0, 50);
fgets(buf, 50, stdin); /p>
buf[strlen(buf)-1]=0;
if (!strcmp("y",buf) || !strcmp("Y",buf)) p>
continuar
else
romper
}
printf("\n el resultado es:\n"
printlist(amp; lista, 0);
free_list(amp; lista, 0;
return
}//void printlist(linklist *list, DATATYPE*) El DATATYPE de abajo detrás de este tipo no tiene sentido. Te digo esto para enfatizar el uso de DATATYPE en el tipo, pero no lo uses printlist(amp; list, 0) ; Esta oración puede reflejar que hay otra función al liberar memoria. Piénselo. Aunque el puntero void* libre se puede liberar, si el puntero void* libre está en C, si libera directamente los punteros void*, suelte directamente el puntero void* en C, no podrá usarlo. Si libera un puntero void* en C sin especificar su tipo, el objeto no se liberará. #define DATATYPE ESTUDIANTE Defino esta macro para facilitar y liberar memoria de forma inteligente. Si cambia la estructura de ESTUDIANTE y no llama a este nombre, entonces no hay necesidad de cambiar el nombre en el código relevante, y solo necesito modificar esta macro. ¿Lo estoy escribiendo tan complicado? Déjame decirte que este código es básicamente una copia directa del código que escribí antes. Utiliza una lista universal doblemente enlazada. Acabo de interceptar algunas de las funciones que escribí para que sean universales y reutilizables.