Создать кольцевой односвязный список, элементы которого будут вводиться с клавиатуры - 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;
}
Объяснение кода листинга программы
- В начале кода определяются структура узла и две функции:
pushиrotate. - Структура узла содержит целочисленное значение и указатель на следующий узел.
- Функция
pushдобавляет новый узел в кольцевой список, вводя значение с клавиатуры. - Функция
rotateповорачивает кольцевой список на заданное количество шагов. - В функции
mainсоздаётся пустой кольцевой список и заполняется пятью элементами с клавиатуры. - Выводится значение элемента, находящегося на вершине списка.
- Кольцевой список поворачивается на три шага.
- Выводится значение элемента, находящегося на вершине списка после поворота.
- Все элементы списка удаляются с помощью функции
shift. - Возвращается значение 0, сигнализирующее о успешном завершении программы.