Вывод элементов очереди: указатели остаются в последнем положении - 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". Но после этого указатели остаются в последнем положении и я, например, не могу еще раз вывести эту же очередь или пробежаться по всем элементам, чтобы удалить только отрицательные. Подскажите, как здесь можно откатить указатель на самый первый элемент? То есть сохранить их прежнее положение, как до вывода. Спасибо.

Решение задачи: «Вывод элементов очереди: указатели остаются в последнем положении»

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;
    }
}

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

В данном коде функция Print() выводит элементы из очереди, представленной в виде связного списка. Список представлен в виде структурных объектов Node, которые содержат в себе указатель на следующий элемент списка (next) и данные, хранящиеся в этом элементе (data). Первый элемент списка (первый в очереди) хранится в поле first структуры Queue. Алгоритм работы функции следующий:

  1. В переменной tmp сохраняется указатель на первый элемент списка (first).
  2. Далее, в цикле, который выполняется N раз, происходит вывод данных из текущего элемента списка.
  3. При помощи оператора printf() выводятся данные текущего элемента списка (tmp -> next -> data).
  4. Указатель tmp переводится на следующий элемент списка (tmp = tmp -> next).
  5. Цикл продолжается до тех пор, пока не будут выведены все элементы списка (N).

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

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