EDITO: Sorry, Google me trolleó este código no es mío es de myguestp lo confundí con uno mío muy parecido. Todos los créditos a él.
Traigo este código como un pequeño ejemplo de listas enlazadas.
Lo hice hace ya un par de años así que seguramente no lo volvería a hacer igual
.#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ID_NAME 60
#define ID_APELLIDO1 61
#define ID_APELLIDO2 62
#define ID_TELEFONO 63
typedef struct lista
{
char nombre[10], apellido1[10], apellido2[10], telefono[10];
struct lista *siguiente;
}lista;
lista *primero=NULL, *ultimo=NULL;
void cls();
void pause();
void delnewline(char *array);
void additem();
void recorrer();
bool finditem(char *word, int flag);
int main()
{
int opc, id;
char word[10], op[10];
lista *aux;
while(opc!=4)
{
printf("Indica que hacer:\n\n 1.Introducir contacto\n 2.Recorrer agenda\n 3.Buscar contacto\n 4.Salir\n\n"); cls();
switch(opc)
{
case 1:
additem();
break;
case 2:
recorrer();
pause();
break;
case 3:
printf("Indica por que criterio buscar(nombre, apellido1, apellido2 o telefono): "); delnewline(op);
if(strcmp(op
, "nombre")==0) id
=ID_NAME
; else if(strcmp(op
, "apellido1")==0) id
=ID_APELLIDO1
; else if(strcmp(op
, "apellido2")==0) id
=ID_APELLIDO2
; else if(strcmp(op
, "telefono")==0) id
=ID_TELEFONO
; else break;
cls();
printf("Indica la palabra a buscar:\n\n"); cls();
finditem(word, id);
pause();
break;
case 4:
break;
default:
printf("Elije una opcion correcta"); break;
}
cls();
}
aux=primero;
while(aux!=NULL)
{
aux=aux->siguiente;
}
return 0;
}
void cls()
{
#ifndef WIN32
#else
#endif
}
void pause()
{
}
void delnewline(char *array)
{
while(*array!='\0')
{
if(*array=='\n')
{
*array='\0';
}
array++;
}
}
void additem()
{
lista *nuevo;
nuevo
=(lista
*)malloc(sizeof(lista
)); printf("Introduce el nombre completo(ejemplo: Miguel Ruiz Cruz):\n\n"); scanf("%s %s %s", nuevo
->nombre
, nuevo
->apellido1
, nuevo
->apellido2
); printf("\nIntroduce ahora el numero de telefono(9 cifras): "); scanf("%s", nuevo
->telefono
); cls();
delnewline(nuevo->nombre);
delnewline(nuevo->apellido1);
delnewline(nuevo->apellido2);
delnewline(nuevo->telefono);
if(primero==NULL)
{
primero
=(lista
*)malloc(sizeof(lista
)); ultimo
=(lista
*)malloc(sizeof(lista
)); if(!primero || !ultimo)
{
printf("No se pudo reservar memoria para el item"); return;
}
primero=nuevo;
primero->siguiente=ultimo;
ultimo=nuevo;
ultimo->siguiente=NULL;
return;
}
ultimo->siguiente=nuevo;
ultimo=nuevo;
ultimo->siguiente=NULL;
return;
}
void recorrer()
{
lista *aux;
aux=primero;
if(aux==NULL)
{
return;
}
while(aux!=NULL)
{
printf("Nombre: %s %s %s Telefono: %s\n\n", aux
->nombre
, aux
->apellido1
, aux
->apellido2
, aux
->telefono
); aux=aux->siguiente;
}
return;
}
bool finditem(char *word, int flag)
{
lista *aux;
int cont=0;
aux=primero;
if(aux==NULL)
{
return false;
}
if(flag==ID_NAME)
{
while(aux!=NULL)
{
if(strcmp(aux
->nombre
, word
)==0) {
printf("Nombre: %s %s %s Telefono: %s\n", aux
->nombre
, aux
->apellido1
, aux
->apellido2
, aux
->telefono
); cont++;
}
aux=aux->siguiente;
}
}
else if(flag==ID_APELLIDO1)
{
while(aux!=NULL)
{
if(strcmp(aux
->apellido1
, word
)==0) {
printf("Nombre: %s %s %s Telefono: %s\n", aux
->nombre
, aux
->apellido1
, aux
->apellido2
, aux
->telefono
); cont++;
}
aux=aux->siguiente;
}
}
else if(flag==ID_APELLIDO2)
{
while(aux!=NULL)
{
if(strcmp(aux
->apellido2
, word
)==0) {
printf("Nombre: %s %s %s Telefono: %s\n", aux
->nombre
, aux
->apellido1
, aux
->apellido2
, aux
->telefono
); cont++;
}
aux=aux->siguiente;
}
}
else if(flag==ID_TELEFONO)
{
while(aux!=NULL)
{
if(strcmp(aux
->telefono
, word
)==0) {
printf("Nombre: %s %s %s Telefono: %s\n", aux
->nombre
, aux
->apellido1
, aux
->apellido2
, aux
->telefono
); cont++;
}
aux=aux->siguiente;
}
}
if(cont==0)
{
printf("No se encontraron resultados"); return false;
}
printf("\nSe encontraron %i resultados", cont
); return true;
}
Sa1uDoS