Сжатие простого списка

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

Алгоритм:
1. Создаем шаблон структуры данных;
2. Заполняем список, длину которого указывает пользователь, случайными числами от 0 до 99;
3. Описываем функцию поиска и удаления четных чисел в списке:
а) Описываем функцию удаления элемента из списка;
б) Описываем функцию определения элемента, идущего ПЕРЕД удаляемым;
4. Выводим результирующий список на экран.

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
 
struct tList {  //Объявляем структуру
    int a;
    tList *next;
} *first, *last, *l; //экземпляры труктуры данных
 
/*функция заполнения списка*/
void Fill_List (int size) {
 
    int i,  stime;
    long ltime;
 
    /* Получение текущего времени для генератора случайных чисел */
    ltime = time(NULL);
	stime = (unsigned) ltime/2;
	srand(stime);
 
	if (first == NULL) {    //Первый элемент
		first = new tList;
		first -> a = rand() % 100;
		last = first;
		printf ("%d ", first -> a);
	}
	for (i=1; i<size; i++) {    //Последующие элементы
		l = new tList;
		l -> a = rand() % 100;
		l -> next = NULL;
		last -> next = l;
		last = l;
		printf ("%d ", l -> a);
	}
}
	/*Функция, определяющая элемент в списке, идущий ПЕРЕД текущим в вызывающей функции*/
tList *prev_search (tList *X, tList *first, tList *last) {
	tList *t;
	t = first;
	while (t) {     //...используя метод перебора с начала списка
		if (t -> next == X)
			return t;
		t = t -> next;
	}
	return t;
}
 
/*функция удаления элемента из списка (первый элемент не обрабатывается)*/
void Remove (tList *x, tList *first, tList *last) {
	tList *prev;
	prev = prev_search(x, first, last);
		if (x == last) {
			last = prev;
			last -> next = NULL;
		}
		else
			prev -> next = x -> next;
}
 
void Search_Even(tList *x, tList *last) {    //Функция поиска четных чисел в списке.
	while (x) {
		if (x -> a % 2 == 0) {
			if (x == first)     //Самостоятельная обработка первого элемента списка
								//без использования функции Remove.
				first = x -> next;
			else                //Все последующие элементы обрабатывает функция Remove.
				Remove(x, first, last);
			if (x -> a > 9)     //Следующая связка операторов if/else
				printf ("X  "); //используется исключительно в эстетических целях.
			else
				printf ("X ");
		}
		else
			printf ("%d ", x -> a);
		x = x -> next;
	}
}
 
/*Функция, вывода уже обработанного списка на экран*/
void Display (tList *x) {
	while (x) {
		printf ("%d ", x -> a);
		x = x -> next;
	}
	if (first == NULL)
		printf ("List is empty :(");
}
 
/*Все объявили, запускаем программу*/
int main(void) {
 
	int N;
	printf ("Enter list size...\n");
	scanf ("%d", &N);   //Задаем размер списка
	printf ("\n\nInitial list:\n");
	Fill_List(N);   //Вызываем функцию заполнения списка размера N и вывода его на экран
	printf ("\n\nDeleting even numbers in list:\n");
	Search_Even(first, last);   //Вызываем функцию поиска и удаления четных чисел в списке
								//которая также выводит результаты своей работы
	printf ("\n\nResulting list:\n");
	Display (first); //Выводим итоговый список, уже очищенный
	if (first == NULL)
		printf ("List is empty :-(");
	getch();    //Ожидание реакции пользователя
	return 0;
}

Ключевые слова: 
список, определение четности, удаление элемента из списка
ВложениеРазмер
List#2.rar17.03 кб