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