Ho scritto due righe di codice durante la pausa caffe... sicuramente puo esser ottimizzato. Genera casualmente una lista di 100 elementi. Il valore di ciascuno è intero e casuale. La seconda lista è formata dagli elementi in posizione multipla di N ed il cui valore è maggiore del precedente.

codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct doublelinked{
	int num;
	struct doublelinked *prev;
	struct doublelinked *next;
	};

void add(int, struct doublelinked **);
void init(int, struct doublelinked **);
void list_forward(struct doublelinked **);

void init(int nr, struct doublelinked **first){

	int i = 0; 
	struct doublelinked *new;

	for(; i < nr; i++){
		if(!(new = (struct doublelinked *)malloc(sizeof(struct doublelinked))))
			abort();

		(*(new)).num = rand()%100;
		(*(new)).next = *first;
		(*(new)).prev = NULL;

		if(*first != NULL)
			(*(first))->prev = new;

		*first = new;
		}
}


void list_forward(struct doublelinked **first){

	struct doublelinked *current;

	for(current = *first; current != NULL; current = (*(current)).next)
		printf("%d ", (*(current)).num);
	printf("\n\n");
}

void add(int nr, struct doublelinked **first){
	struct doublelinked *new, *current;
	if(!(new = (struct doublelinked *)malloc(sizeof(struct doublelinked))))
		abort();
	(*(new)).num = nr;
	if(*first == NULL){
		*first = new;
		(*(first))->prev = NULL;
		(*(first))->next = NULL;
		}
	if(*first != NULL){
		for(current = *first; (*(current)).next != NULL; current = (*(current)).next);
		(*(current)).next = new;
		(*(new)).next = NULL;
		(*(new)).prev = current;
		}
}


void main(){
	int i, N = 4;
	struct doublelinked *first_1 = NULL, *first_2 = NULL, *current;
	srand(time(NULL));
	init(100, &first_1);
	list_forward(&first_1);
	for(i = 0, current = first_1; current != NULL; current = (*(current)).next, i++){
		if(i == 0){
			add((*(current)).num, &first_2);
		}
		if(((i+1)%N == 0) && (*(current)).num > (*(current)).prev->num)
			add((*(current)).num, &first_2);
		}
	list_forward(&first_2);
}