Построить список натуральных чисел длиной N. Сжать полученный список, убрав все четные числа. Задание №2 (Простые списки) (см. Сборник задач для начинающего программиста) Алгоритм: #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 присваиваем следующему элементу; } } }
Ключевые слова:
список, последовательность, структура
|
|||||||