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

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

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

Нужно сделать кольцевой односвязный список, элементы которого будут вводиться с клавиатуры. Я новичок в Си, создал список, получил количество элементов в списке, но организовать цикл заполнения его элементами не получается, надеюсь на вашу помощь.

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
 
typedef struct NODE {
    int value;
    struct NODE * next;
} node_t;
 
void push(node_t ** pRing, int nValue) {
    node_t * pNode = malloc(sizeof(node_t));
    assert ( pNode );
    pNode->value = nValue;
    if ( ! *pRing ) {
        pNode->next = pNode;
        *pRing = pNode;
    }
    else {
        pNode->next = (*pRing)->next;
        (*pRing)->next = pNode;
        *pRing = pNode;
    }
}
 
void rotate(node_t ** pRing, int steps) {
    assert ( *pRing && steps > 0 );
    while ( steps-- )
        *pRing = (*pRing)->next;
}
 
 
int top(const node_t * ring) {
    return ring->value;
}
 
int is_empty(const node_t * ring) {
    return ( ! ring );
}
 
int shift(node_t ** pRing) {
    int ret;
    assert ( *pRing );
    ret = (*pRing)->value;
 
    if ( (*pRing)->next == *pRing ) {
        free(*pRing);
        *pRing = NULL;
    }
    else {
        node_t * pPrev = (*pRing)->next;
        while ( pPrev->next != *pRing )
            pPrev = pPrev->next;
        pPrev->next = (*pRing)->next;
        free(*pRing);
        *pRing = pPrev->next;
    }
 
    return ret;
}
 
int main(void) {
    node_t * ring = NULL;
    int i;
 
    printf("adding 5 elements...\n");
    for ( i = 1; i < 6; ++i )
        push(&ring, i);
 
    printf("Value on top: %d\n", top(ring));
 
    printf("Rotating by 3 steps...\n");
    rotate(&ring, 3);
 
    printf("Now on top: %d\n", top(ring));
 
    printf("Purge all values from that point...\n");
    while ( ! is_empty(ring) )
        printf("%d ", shift(&ring));
 
    return 0;
}

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

  1. В начале кода определяются структура узла и две функции: push и rotate.
  2. Структура узла содержит целочисленное значение и указатель на следующий узел.
  3. Функция push добавляет новый узел в кольцевой список, вводя значение с клавиатуры.
  4. Функция rotate поворачивает кольцевой список на заданное количество шагов.
  5. В функции main создаётся пустой кольцевой список и заполняется пятью элементами с клавиатуры.
  6. Выводится значение элемента, находящегося на вершине списка.
  7. Кольцевой список поворачивается на три шага.
  8. Выводится значение элемента, находящегося на вершине списка после поворота.
  9. Все элементы списка удаляются с помощью функции shift.
  10. Возвращается значение 0, сигнализирующее о успешном завершении программы.

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


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

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

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