Código fuente de datos dinámicos
# include & ltmalloc.h & gt
# include & ltstring.h & gt#El número máximo de nombres definidos es 50
#Definir NOMAX 20
#Definir tipo de datos estudiante
nodo de estructura typedef
{
void *data;
Nodo de estructura * izquierda
Nodo de estructura *derecha;
} nodo; estructura typedef
{
Estructura nodo *cabeza;
Nodo de estructura*actual;
Nodo de estructura*trasero;
int count;
}Lista vinculada; estructura
p>
{
nombre char[nombre max];
int edad
char no[nombre max] ;
}Tipo de datos; void init _ linklist(lista de enlaces * lista)
{
Lista-> Lista->actual = NULL
Lista->rear=empty;
Lista->count=0;
} void add_linklist(lista de enlaces * lista, void *datos)
{
NODO * nuevoNodo
nuevo NODO =(NODO *)malloc(tamañode(NODO));
Nuevo nodo->data=data;
if (list->head==NULL)
{
Lista-> = newNode
Lista -> actual = newNode
Lista -> rear = newNode
Nuevo nodo -> left = NULL
Nuevo nodo->right=null;
Lista->count++;
}
Otro
{
Lista->detrás->right = newNode
Nuevo nodo->left = lista->detrás;
Nuevo nodo ->right=null p>
Lista ->rear = newNode
Lista ->current = newNode
Lista ->count++;
}
}
void free_list(lista enlazada * lista, tipo de datos *)
{
NODE * tmp = list->head;
Y (tmp! =nulo)
{
if(tmp-& gt; left==NULL)
{
tmp = tmp-& gt; derecha;
Continuar;
}
si(tmp-& gt;right==NULL)
{
gratis((tipo de datos*)(tmp->datos));
gratis(tmp);
descanso;
}
Otro
{
gratis((tipo de datos*)(tmp->left->data));
Gratis(tmp->izquierda);
p>
tmp = tmp-& gt;
}
} init _ linklist(lista);
}void printlist(lista vinculada * lista, tipo de datos *)
{
NODO * tmp = lista-& gt; I = 0;
Y (tmp!=null)
{
Printf("Artículo %d registro:\n ",++ I);
printf("-\ n ");
Printf ("nombre: %s\n ", ((DATATYPE *)(tmp-& gt; datos))-& gt; nombre);
Printf ("Edad: %d\n ", ((DATATYPE *)(tmp-& gt;data))-& gt; edad);
Printf("ID de estudiante:% s\n", ((tipo de datos*)(tmp-->;data))->No);
printf("-\n ") ;
tmp = tmp-& gt; Derecha;
}
Retorno;
}int main()
{
DATATYPE * pStu = NULL
char buf[50]= { 0 };
lista de enlaces;
init _ lista de enlaces(& lista);
mientras(1)
{
pStu=(tipo de datos*)malloc(tamañode(tipo de datos) <); /p>
memset(pStu, 0, sizeof (tipo de datos)); Printf ("Ingrese su nombre:");
fgets(pStu-& gt; nombre, NAMEMAX, stdin) ;
pStu->; nombre[strlen(pStu->nombre)-1]= 0; Printf("Ingrese su edad:");
scanf("% d ", & amp(pStu->;age));
getchar();Printf("Ingrese el número de serie:");
fgets(pStu -> no,nomax,stdin);
pStu->no [strlen(pStu->no)-1]= 0 add_linklist(&list,pStu) ;
Printf("Hacer desea continuar agregando (y/n):");
memset(buf, 0, 50);
fgets(buf , 50, stdin);
buf[strlen(buf)-1]= 0;
Si (! strcmp("y ",buf) ||! strcmp("Y ",buf))
Continuar;
Otro
Pausa;
}
printf(" \ n resultado:\ n ");
Imprimir lista (& lista amp, 0
Lista libre (& lista amp, 0);
Return 0;
}// Lista de impresión nula (lista de enlaces * lista, TIPO DE DATOS *) El tipo detrás del tipo de datos de abajo es muy aburrido de decirte, esto es un énfasis en el tipo de datos usar Se muestra en el interior, pero no se usa en Imprimir lista (& lista, 0; esta oración puede reflejar otro efecto si lo ha considerado al liberar memoria);
Aunque se pueden liberar punteros void* gratuitos, si el puntero void* se libera directamente en C++ sin especificar su tipo, el objeto se liberará inesperadamente. #define DATATYPE STUDENT El propósito de definir esta macro es liberar memoria de manera conveniente e inteligente. Si cambia la estructura de ESTUDIANTE sin este nombre, entonces debe cambiar el nombre en el código correspondiente. Solo necesito modificar esta macro. ¿Es mi escritura tan complicada? Déjame decirte que este código básicamente se copia directamente. Este código ha sido escrito antes. Acabo de interceptar parte de la función que escribí. El código está escrito para ser versátil y reutilizable.