Вывод элементов очереди: указатели остаются в последнем положении - C (СИ)

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

Помогите разобраться с работой с указателями в очереди. Есть следующий код:
#include "stdafx.h"
#include "stdio.h"
#include "locale.h"
#include "stdlib.h"
#include "conio.h"
#include "windows.h"
 
struct Node //описание узла списка
{
    int data; //информационное поле
    Node *next; //указатель на следующий элемент
};
struct Queue //описание очереди
{
    int size; //счетчик размера очереди
    Node *first; //указатель на начало очереди
    Node *last; //указатель на конец очереди
};
void Creation(Queue *Q) //создание очереди
{
    Q -> first = new Node;
    Q -> first -> next = NULL;
    Q -> last = Q -> first;
    Q -> size = 0;
}
bool Full(Queue *Q) //проверка очереди на пустоту
{
    if (Q -> first == Q -> last) return true;
    else return false;
}
void Print(Queue *Q, int N) //вывод начального элемента
{ 
    int i;
    for(i = 0; i < N; i++)
    {
        printf("Очередь: %d\n", Q -> first -> next -> data);
        Q -> first = Q -> first -> next;
    }
}
void Add(Queue *Q, int N) //добавление элемента
{
    int value;
    int i;
    for(i = 0; i < N; i++)
    {
        value = -99 + rand()%99;
        Q -> last -> next = new Node;
        Q -> last = Q -> last -> next;
        Q -> last -> data = value; //добавление элемента в конец
        Q -> last -> next = NULL; //обнуление указателя на следующий элемент
        Q -> size++;
    }
    printf("\nЭлемент добавлен\n\n");
 
}
void Delete(Queue *Q) //удаление элемента
{
    Q -> first = Q -> first -> next; //смещение указателя
    Q -> size--;
    printf("\nЭлемент удален\n\n");
}
int Size(Queue *Q) //размер очереди
{ 
    return Q -> size;
}
void main() //главная функция
{
    setlocale(LC_ALL,"Rus");
    Queue Q;
    Creation(&Q);
    int number, N, i;
    do
    {
        printf("1. Добавить элемент\n");
        printf("2. Удалить элемент\n");
        printf("3. Вывести верхний элемент\n");
        printf("4. Узнать размер очереди\n");
        printf("0. Выйти\n");
        printf("Номер команды > ");
        scanf("%d", &number);
        switch (number)
        {
            case 1: 
            printf("Введите количество элементов > ");
            scanf("%d", &N);
            Add(&Q, N);
            Sleep(2000);
            system("cls");
            break;
            //-----------------------------------------------
            case 2:
            if (Full(&Q)) 
                printf("Очередь пуста");
                    else 
                        Delete(&Q);
            Sleep(2000);
            system("cls");
            break;
            //-----------------------------------------------
            case 3:
            if (Full(&Q)) printf("Очередь пуста");
                else 
                    
                    Print(&Q, N);
            break;
            //-----------------------------------------------
            case 4:
            if (Full(&Q)) 
                printf("Очередь пуста");
                    else 
                        printf("Размер очереди %d\n\n", Size(&Q));
            Sleep(2000);
            system("cls");
            break;
            //-----------------------------------------------
            case 0: break;
            default: printf("Команда не определена\n");
            Sleep(2000);
            system("cls");
            break;
        }
    } while(number!='0');
    getch();
}
В функции:
void Print(Queue *Q, int N) //вывод начального элемента
{ 
    int i;
    for(i = 0; i < N; i++)
    {
        printf("Очередь: %d\n", Q -> first -> next -> data);
        Q -> first = Q -> first -> next;
    }
}
Я вывожу все элементы очереди. Вывел элемент "data", нарастил указатели на первый/последующий, вывел следующий "data". Но после этого указатели остаются в последнем положении и я, например, не могу еще раз вывести эту же очередь или пробежаться по всем элементам, чтобы удалить только отрицательные. Подскажите, как здесь можно откатить указатель на самый первый элемент? То есть сохранить их прежнее положение, как до вывода. Спасибо.

Код к задаче: «Вывод элементов очереди: указатели остаются в последнем положении - C (СИ)»

textual
void Print(Queue *Q, int N) //вывод начального элемента
{ 
    Node *tmp = Q->first;
    int i;
    for(i = 0; i < N; i++)
    {
        printf("Очередь: %d\n", tmp -> next -> data); 
        tmp = tmp -> next;
    }
}
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.

7   голосов, оценка 4.286 из 5


СДЕЛАЙТЕ РЕПОСТ