Преобразование списка путем удаления всех четных чисел.

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

Алгоритм:
1) Просим указать количество натуральных чисел N;
2) Создаем список, который содержит последовательность натуральных чисел от 1 до N;
а) создаем первый элемент списка. Заносим в него единицу;
b) создаем остальные элементы списка, в которые помещаем оставшуюся последовательность натуральных чисел;
3) Преобразуем данную последовательность, убрав из нее все четные элементы;
а) создаем три указателя: 1 будет указывать на предыдущий элемент, 2 - на рассматриваемый, 3 - на следующий;
b) если элемент четный, то удаляем его, соединив предыдущий элемент с последующим, после удаленного;
с) если элемент нечетный, то просто переходим на следующий элемент;
4) распечатываем преобразованную последовательность.

#include <stdio.h>
#include <stdlib.h>
 
 
void list(int N);
void gripelist (int N);
 
 
	struct Tnode					// создаем структуру данных;
	{	
		int n;					// здесь хранится натуральное число;
		Tnode *next;				// ссылка на следующий элемент списка;
	}*start, *last;					// указатели на начало и конец натурального ряда;
 
 
 int main ()
{
 
int N=0;						// инициализируем переменную;
start = NULL;						// инициализаруем указатель start; 
last = NULL;						// инициализаруем указатель last;
 
Tnode *p,*p1,*p2;
 
	printf ("Enter you namber N > 0 : ");           // указываем количество натуральных чисел;
	scanf ("%d", &N);
 
	list (N);					// вызывем функцию создания списка, в котором  будет указываться последовательность натуральных чисел от 1 до N;
 
	p = start;					// указателю р присваиваем начальное значение в списке;
 
	printf ("\nSequence: ");				
	while(p != NULL)				// печатаем созданный список;
	{
		printf ("%d ", p->n);
		p = p -> next;
	}
 
 
	gripelist (N);					// вызываем функцию, которая убирает все четные числа; 
 
	p = start;
 
	printf ("\n\ngripe sequence: ");
		while(p != NULL)			// печатаем все значения из списка, полученные в результете преобразования;
	{
		printf ("%d ", p->n);
		p = p -> next;
	}
	printf ("\n\n");				// делаем отступ для красоты )))
 
 
	p = start; p1 = start; p2 = NULL;
	while (p != NULL)				// освобождаем память
	{
		p1 = p -> next;
		delete p;
		p = p1;
	}
 
	scanf ("%d", &p );				// для запуска .exe, чтобы окно не закрывалось сразу, по желанию;
 
return 0;
 
}
 
 
 void list (int N)
 {
	Tnode *p;
 
	if ( start == NULL )			// если элемент является первым в списке;
 
		start = new Tnode;		// создаем этот первый элемент;	
		start -> n = 1;			// присваиваем ему значение 1;
		start ->next = NULL;	        // адресс элемента ставим в NULL; 
		last = start;			// последний элемент теперь является первым; 
 
 
		for (int i=2; i <= N; i++)		// создаем все остальные элементы в списке;
		{
			p = new Tnode;			// создаем новый элемент;	
			p -> n = i;			// присваиваем ему значение i;
			p -> next = NULL;		// адресс элеменнта ставим в NULL;
			last -> next = p;		// делаем так, чтобы предыдущий элемент ссылался на вновь созданный; 
			last = p;			// теперь последний элемент  - это вновь созданный; 
		}					// цикл повторяется;
 
 }
 
 
 
	void gripelist (int N)				
	{
		Tnode *p,*p1,*p2;			// создаем три указателя: р1 будет указывать на предыдущий элемент,  р - на рассматриваемый, р2- на следующий;
 
		p = start;				//	ставим все указатели в начало списка;
		p1 = start;						
		p2 = start;						
 
		for ( int i=1; i <=N ; i++ )	        // "пробегаем" по всей последовательности; 
		{ 
			if ( (p->n)%2 == 0 )		// если элемент является четным;
			{
				if ( p->next == NULL)	// если элемент является последним в списке;
				{  
 
					delete p;		// удаляем его, так как он четный;
					p = p1; p2 = p1;	// указатели остаются на предпоследнем элементе;
					p1 -> next= NULL;	// предпоследнему элементу присваиваем адресс NULL;
					break;			// прерываем работу функции;
				}
 
				p2 = p->next;			// указатель р2 присваиваем на следующий элемент в списке;
				delete p;			// удаляем данный элемент;
				p1 -> next = p2;		// переприсваиваем адресс предыдущего элемента, ссылаясь на следующий элемент, после удаленного;
				p1 = p2;			// перебрасываем указатель на след. элемент;
				p = p2;				// перебрасываем указатель на след. элемент;
 
 
 
			}else{					// если элемент нечетный;
 
				if ( p2->next == NULL)          // если элемент является последним в списке;
					break;			// прерываем работу функции;
 
				p = p->next;			// указатель р присваиваем следующему элементу, без удаления;
				p2 = p->next;			// указатель р2 присваиваем следующему элементу;
 
			}
		}
	}

Ключевые слова: 
список, последовательность, структура
ВложениеРазмер
spiski_p.rar9.99 кб