ayuda en estructuras de datos
Hola
Necesito tu ayuda por favor!!!!!!!!!!!
Necesito hacer un programa de listas enlazadas usando apuntadores con las siguientes caracteristicas:
a)tenga nombre, direccion y telefono
b)ordene alfabeticamente por nombre
c)busque por nombre
d) no se cuantos registros voy a meter porque se usa memoria dinamica
te adjunto archivos que tengo pero que no se implementar una funcion que ordene los nombres alfabeticamente
lo necesito parecido a esto:
#include <stdlib.h>
#include <stdio.h>
typedef struct _nodo {
int valor;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;
/* Funciones con listas: */
void Insertar(Lista *l, int v);
void Borrar(Lista *l, int v);
int ListaVacia(Lista l);
void BorrarLista(Lista *);
void MostrarLista(Lista l);
int main()
{
Lista lista = NULL;
// pNodo p;
Insertar(&lista, 20);
Insertar(&lista, 10);
Insertar(&lista, 40);
Insertar(&lista, 30);
MostrarLista(lista);
Borrar(&lista, 10);
Borrar(&lista, 15);
Borrar(&lista, 45);
Borrar(&lista, 30);
Borrar(&lista, 40);
MostrarLista(lista);
BorrarLista(&lista);
system("PAUSE");
return 0;
}
void Insertar(Lista *lista, int v)
{
pNodo nuevo, anterior;
/* Crear un nodo nuevo */
nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;
/* Si la lista está vacÃa */
if(ListaVacia(*lista) || (*lista)->valor > v) {
/* Añadimos la lista a continuación del nuevo nodo */
nuevo->siguiente = *lista;
/* Ahora, el comienzo de nuestra lista es en nuevo nodo */
*lista = nuevo;
}
else {
/* Buscar el nodo de valor menor a v */
anterior = *lista;
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga
un valor mayor que v */
while(anterior->siguiente && anterior->siguiente->valor <= v)
anterior = anterior->siguiente;
/* Insertamos el nuevo nodo después del nodo anterior */
nuevo->siguiente = anterior->siguiente;
anterior->siguiente = nuevo;
}
}
void Borrar(Lista *lista, int v)
{
pNodo anterior, nodo;
nodo = *lista;
anterior = NULL;
while(nodo && nodo->valor < v) {
anterior = nodo;
nodo = nodo->siguiente;
}
if(!nodo || nodo->valor != v) return;
else { /* Borrar el nodo */
if(!anterior) /* Primer elemento */
*lista = nodo->siguiente;
else /* un elemento cualquiera */
anterior->siguiente = nodo->siguiente;
free(nodo);
}
}
int ListaVacia(Lista lista)
{
return (lista == NULL);
}
void BorrarLista(Lista *lista)
{
pNodo nodo;
while(*lista) {
nodo = *lista;
*lista = nodo->siguiente;
free(nodo);
}
}
void MostrarLista(Lista lista)
{
pNodo nodo = lista;
if(ListaVacia(lista)) printf("Lista vacÃan");
else {
while(nodo) {
printf("%d -> ", nodo->valor);
nodo = nodo->siguiente;
}
printf("n");
}
}
solo que en c++ y que en lugar de ordenar por v lo haga de acuerdo a un nombre (arreglo o apuntador a una cadena)
Necesito tu ayuda por favor!!!!!!!!!!!
Necesito hacer un programa de listas enlazadas usando apuntadores con las siguientes caracteristicas:
a)tenga nombre, direccion y telefono
b)ordene alfabeticamente por nombre
c)busque por nombre
d) no se cuantos registros voy a meter porque se usa memoria dinamica
te adjunto archivos que tengo pero que no se implementar una funcion que ordene los nombres alfabeticamente
lo necesito parecido a esto:
#include <stdlib.h>
#include <stdio.h>
typedef struct _nodo {
int valor;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;
/* Funciones con listas: */
void Insertar(Lista *l, int v);
void Borrar(Lista *l, int v);
int ListaVacia(Lista l);
void BorrarLista(Lista *);
void MostrarLista(Lista l);
int main()
{
Lista lista = NULL;
// pNodo p;
Insertar(&lista, 20);
Insertar(&lista, 10);
Insertar(&lista, 40);
Insertar(&lista, 30);
MostrarLista(lista);
Borrar(&lista, 10);
Borrar(&lista, 15);
Borrar(&lista, 45);
Borrar(&lista, 30);
Borrar(&lista, 40);
MostrarLista(lista);
BorrarLista(&lista);
system("PAUSE");
return 0;
}
void Insertar(Lista *lista, int v)
{
pNodo nuevo, anterior;
/* Crear un nodo nuevo */
nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;
/* Si la lista está vacÃa */
if(ListaVacia(*lista) || (*lista)->valor > v) {
/* Añadimos la lista a continuación del nuevo nodo */
nuevo->siguiente = *lista;
/* Ahora, el comienzo de nuestra lista es en nuevo nodo */
*lista = nuevo;
}
else {
/* Buscar el nodo de valor menor a v */
anterior = *lista;
/* Avanzamos hasta el último elemento o hasta que el siguiente tenga
un valor mayor que v */
while(anterior->siguiente && anterior->siguiente->valor <= v)
anterior = anterior->siguiente;
/* Insertamos el nuevo nodo después del nodo anterior */
nuevo->siguiente = anterior->siguiente;
anterior->siguiente = nuevo;
}
}
void Borrar(Lista *lista, int v)
{
pNodo anterior, nodo;
nodo = *lista;
anterior = NULL;
while(nodo && nodo->valor < v) {
anterior = nodo;
nodo = nodo->siguiente;
}
if(!nodo || nodo->valor != v) return;
else { /* Borrar el nodo */
if(!anterior) /* Primer elemento */
*lista = nodo->siguiente;
else /* un elemento cualquiera */
anterior->siguiente = nodo->siguiente;
free(nodo);
}
}
int ListaVacia(Lista lista)
{
return (lista == NULL);
}
void BorrarLista(Lista *lista)
{
pNodo nodo;
while(*lista) {
nodo = *lista;
*lista = nodo->siguiente;
free(nodo);
}
}
void MostrarLista(Lista lista)
{
pNodo nodo = lista;
if(ListaVacia(lista)) printf("Lista vacÃan");
else {
while(nodo) {
printf("%d -> ", nodo->valor);
nodo = nodo->siguiente;
}
printf("n");
}
}
solo que en c++ y que en lugar de ordenar por v lo haga de acuerdo a un nombre (arreglo o apuntador a una cadena)
