Создать двунаправленный циклический список, заменить элементы модулем - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Создать двунаправленный циклический список, заменить элементы модулем Есть заготовки
struct list2
{int data;
list2 *next;
list2 *prev;
};
 
list2 *root,*p,*q,*fin;
 
root=new list2;
root->data=10;
root->next=root;
root->prev=root;
 
for(i=1;i<N;i++)
{q=new list2;
q->data=10*(i+1);
q->next=root;
q->prev=root->prev;
root->prev->-next=q;
root->prev=q;
root=q;
}

Решение задачи: «Создать двунаправленный циклический список, заменить элементы модулем»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
 
typedef struct node_t
{
   int value;
   struct node_t* next;
   struct node_t* prev;
}  TNode;
 
//-----------------------------------------------------------------------------
TNode* Push(TNode** list, int value)
{
   assert(list);
 
   TNode* node = (TNode*) malloc(sizeof(TNode));
   node->value = value;
 
   if (*list)
   {
      node->next = *list;
      node->prev = (*list)->prev;
      (*list)->prev->next = node;
      (*list)->prev = node;
   }
   else
   {
      node->next = node->prev = node;
      *list = node;
   }
 
   return *list;
}
//-----------------------------------------------------------------------------
void ForAll(TNode* list, void (*func)(int*))
{
   assert(func);
 
   TNode* node = list;
 
   if (list)
   {
      while (node->next != list)
      {
         func(&node->value);
         node = node->next;
      }
      func(&node->value);
   }
}
//-----------------------------------------------------------------------------
void Print(int* value)
{
   printf("%d ", *value);
}
//-----------------------------------------------------------------------------
void Abs(int* value)
{
   *value = abs(*value);
}
//-----------------------------------------------------------------------------
 
int main()
{
   srand(time(NULL));
   size_t count = rand() % 20 + 1;
   TNode* list = NULL;
 
   while (count--)
   {
      Push(&list, rand() % 20 - 10);
   }
 
   ForAll(list, Print);
   printf("\n");
 
   ForAll(list, Abs);
   ForAll(list, Print);
   printf("\n");
 
   return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: , , , .
  2. Объявляем структуру узла списка TNode.
  3. Создаём функцию Push, которая добавляет новый узел в начало списка.
  4. Создаём функцию ForAll, которая обходит все узлы списка и применяет к каждому узлу указанную функцию.
  5. Создаём функции для обхода списка: Print для вывода значения узла и Abs для замены значения узла модулем.
  6. В функции main создаём список, заполняем его случайными значениями от -10 до 10 и выводим на экран.
  7. Заменяем значения узлов списка модулем и снова выводим на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы