#include <stdio.h>

typedef unsigned char t_data;
typedef unsigned char t_key;

struct node {
	struct node * next;
	t_data data;
	t_key key;
};

void add_begin (node ** root, t_data d, t_key k)
{
	node * neu = new node;
	neu->next = *root;
	neu->data = d;
	neu->key  = k;
	*root = neu;
}

node * create_node (t_data d, t_key k)
{
	node * neu;
	neu = new node;
	neu->next = NULL;
	neu->data = d;
	neu->key  = k;
	return neu;
}

node * add_ende (node * p, t_data d, t_key k)
{
	if (!p)	// neue Liste
		return create_node (d,k);
	else if (p->next)	// noch nicht letztes Element
	{
		add_ende (p->next, d,k);
		return p;
	}
	else 
	{
		p->next = create_node(d,k);
		return p;
	}
}

void add_end (node ** p, t_data d, t_key k)
{
	if (!(*p))
		*p = create_node (d,k);
	else if ((*p)->next)
		add_end (&((*p)->next), d,k);
	else (*p)->next = create_node (d,k);
}
	
void print_list (node * p)
{
	printf ("Data: %c\tKey: %c\n", p->data, p->key);
	if (p->next)
		print_list (p->next);
}

t_data find (node * p, t_key item)
{
	if (p->key == item)
		return p->data;
	if (p->next)
		return find (p->next, item);
	else return 0;
}

t_data find_nr (node *p, t_key item)
{
	while (p)
	{
		if (p->key == item)
			return p->data;
		p = p->next;
	}
}
	

int find_all (node * p, t_key item)
{
	if (p->next && item == p->key)
		return find_all (p->next, item) + 1;
	else if (p->next)
		return find_all (p->next, item);
	else return 0;
}

int main()
{
	int i = 0;
	int j = 0;
	char f;
	int a;
	node * root = NULL;

	for (i=0; i< 5;i++)
		for (j=1; j< 10; j++)
			add_end (&root, 'a' + i,'a'+ i + j);
	print_list (root);
	
	f = find (root, 'c');
	printf("key 'c' hat Data %c.\n", f);

	a = find_all (root, 'b');
	printf ("'b' wurde %d mal gefunden\n", a);
	return 0;
}
	

