Сжатие списка путем удаления четных элементов

Построить список натуральных чисел длиной N. Сжать полученный список, убрав все четные числа. Задание №2 (Простые списки) (см. "Сборник задач для начинающего программиста")

Алгоритм:
1)Указать количество натуральных чисел
2)Создание переменной структурного типа, в которой будут храниться числа и указатели на следующий элемент
3)Занесение чисел в список
4)Поиск четных чисел
5)Переключение указателя на следующий элемент списка
6)Удаление элемента с четным числом
7)Вывод на печать преобразованного списка

#include <stdio.h>
#include <stdlib.h>
 
 
 typedef struct list_elem {	// структура - элемент списка
 
      int index;			// поле данных
			// поле указателя на следующий элемент списка
      struct list_elem *next;
 
  } LEL;			// пользовательский тип структурной переменной
 
  LEL* AddElem (LEL *last);	// функция присоединения нового элемента списка	
 
  void Del_El(void);		// функция проверки четности чисел и удаления элемента списка
 
  void PrintList(void);		//функция вывода на печать данных списка
 
  LEL *list;			// адрес начала списка
 
 
 int main()
 
{
 
  int N;
 
  printf("\nINPUT SIZE OF THE SPISOK: ");
 
  scanf("%d",&N);		// ввод размера списка
 
  LEL *end=NULL;		// указатель на последний элемент
 
  printf("\nINPUT DATE:");
 
  do{			// цикл формирования списка
     end=AddElem(end);
 
     if(end==NULL)		//  выход из цикла
 
       break;
 
    N--;			// счетчик введенных элементов
 
   } while(N > 0); 		// пока необходимо вводить элементы                      
 
   printf("\n\n\nOur SPISOK:");
 
   PrintList();			// вывод на печать сформированного списка
 
   printf("\n\nNew SPISOK:");
 
   Del_El();
 
   PrintList();			// вывод на печать измененного списка
 
 return 0;
}
 
   LEL* AddElem (LEL *last)
 
   {
    LEL *pel;				// указатель на новый элемент		
 
    static int num=1;			// номер вводимого элемента
 
    pel=(LEL*)malloc(sizeof(LEL));		// выделение памяти для элемента
 
    printf("\n\t%d element: ",num);
 
    scanf("%d",&pel->index);		// ввод данных
 
    if(pel->index==0)			// окончание ввода данных
 
      {
       free(pel);			
 
       return NULL;
      }
 
    fflush(stdin);			// очищение буфера ввода
 
    pel->next=NULL;			// элемент становится последним в списке
 
    if(list==NULL)			// если список пуст, то введенный элемент становится первым  
 
       list=pel;
 
    else				// иначе присоединяется к последнему в списке
 
       last->next=pel;
 
    num++;				// счетчик элементов
 
    return pel;
 }
 
   void PrintList(void)			
 
   {
    LEL *pel=list;			// указателю присваивается адрес начала списка
 
    while(pel!=NULL)			// пока не найден последний элемент
 
	{
	 printf("%5d",pel->index);	// выводим содержимое поля index
 
	 pel=pel->next;		// передвигаем указатель на адрес следующего элемента
	}
    }
 
 
   void Del_El(void)
 
   {
    LEL *pel=list,*prev;			// указатели на элемент списка
 
    while(pel!=NULL)			// пока в списке есть элементы
 
      {
       if(pel->index%2!=0)			// проверка четности чисел
 
        {
 
	 prev=pel;			// элемент сохраняется			
 
	 pel=pel->next;		
 
      } else{				// иначе удаляется
 
 
	 if(pel==list)			// если первый в списке
 
	   {
	    list=list->next;		// первым становится следующий элемент		
 
	    free(pel);			// удаление текущего элемента
 
	    pel=list;
 
	  }else{			// если нужно удалить другие элементы
 
	    prev->next=pel->next;		// производим переключение указателей
 
	    free(pel);			
 
	    pel=prev->next;
	  }
	}
      }
    }

Ключевые слова: 
списки, перменная структурного типа, указатели