Удаление элементов стека

227
28 марта 2018, 05:31

Создать проект, демонстрирующий работу со стеком, организованным на основе списка. Все операции со стеком реализовать через функции. Разработать функцию удаления элементов стека, кратных 3, если такие есть. Дополнить проект функцией очистки стека clear(), сохранения в файл и считывания из файла. Проблема, собственно, в удалении, вроде как удаляет, но при проверке выводом получается совсем не то и выводит ошибку. Косяк явно в функции, но решить не получается. Буду очень признательна за помощь

 #include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <fstream>
using namespace std;
struct STACK {
    int Name;
    STACK *next, *prev, *head;
};
int _tmain(int argc, _TCHAR* argv[])
{
    int buff[100];
    setlocale(LC_CTYPE, "Russian");
    STACK* Nstk = NULL;
    int n, chislo, i;
    cout << "Сколько чисел необходимо ввести?" << endl;
    cin >> n;
    for (i = 0; i <n; i++)
    {
        cout << "Введите число" << endl;
        cin >> chislo;
        buff[i] = chislo;
        push(chislo, Nstk);
    }
        delete3(Nstk);
        return 0;
}
 void delete3(STACK *&Nstk)
{
    STACK *temp = Nstk;
    STACK *tmp;
    while (temp)                                           //сама функция удаления//
    {
        if ((temp->Name)%3==0)
        {
            tmp = temp;
            temp = temp->next;
            delete tmp;
        }
        temp = temp->next;
    }
    cout << "\nЛишние значения удалены!" << endl;
    cout << "____________" << endl;
}
void push(int strN, STACK *&Nstk)
{
    STACK *tmp = new STACK;//выделение памяти для нового элемента
    tmp->Name = strN;//запись элемента в поле
    tmp->next = Nstk;
    Nstk = tmp;
}
Answer 1

Давайте смотреть.

  1. struct STACK {
      int Name;
      STACK *next, *prev, *head;
    };
    

    зачем здесь поля prev и head?

  2. buff[i] = chislo; В чем смысл этой строки?

  3. void delete3(STACK *&Nstk)
    {
      STACK *temp = Nstk;
      STACK *tmp;
      while (temp)   //сама функция удаления//
      {
        if ((temp->Name) %3 == 0)
        {
            tmp = temp;
            temp = temp->next;
            delete tmp;
        }
        temp = temp->next;
      }
      cout << "\nЛишние значения удалены!" << endl;
      cout << "____________" << endl;
    }
    
    здесь неправильно почти все
    1. Если мы удалили элемент из вершины стека, то в основной программе указатель на вершину ведет в никуда
    2. Когда мы удаляем элемент, то мы дважды вызываем temp = temp->next;

Как должно быть

void delete3(STACK *&Nstk) {
  while (Nstk) {
    if ((Nstk->Name) % 3 == 0) {
      STACK *temp = Nstk;
      Nstk = Nstk->next;
      delete temp;
    } else
      Nstk = Nstk->next;
  }
  cout << "\nЛишние значения удалены!" << endl;
  cout << "____________" << endl;
}
  1. И не забудьте в конце удалить все элементы из стека
READ ALSO
Помогите с шифрованием RSA - JAVA

Помогите с шифрованием RSA - JAVA

Пишу приложение-криптер на java для школьного проекта(можно сказать еще новичок), хочу реализовать алгоритм RSA, чтобы можно было через него...

314