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 :P.
#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");
scanf("%i", &opc);
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): ");
scanf("%s", op);
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");
scanf("%s", word);
cls();
finditem(word, id);
pause();
break;
case 4:
break;
default:
printf("Elije una opcion correcta");
break;
}
cls();
}
aux=primero;
while(aux!=NULL)
{
free(aux);
aux=aux->siguiente;
}
return 0;
}
void cls()
{
#ifndef WIN32
system("clear");
#else
system("cls");
#endif
}
void pause()
{
setbuf(stdin, NULL);
getchar();
}
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)
{
printf("Lista vacia");
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