BG Development


  Reply to this topicStart new topicStart Poll

> изтриване на най-големия елемент в опашката
Heiru
Публикувано на: 24-05-2022, 19:17
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 23.05.22



Трябва да изтрия елемента max от опашката, без да използвам библиотеката на опашката, масивите или нещо подобно. Сигурен съм, че първите две функции работят както трябва, но не съм сигурен за функцията del_max. Може ли някой просто да оправи програмата и да я изпрати? От толкова време се опитвам да го поправя.

CODE
#include <iostream>

using namespace std;

void push(int n);
int pop(int& n);
void del_max(int m);
void print_q();

struct elem
{
      int key;
      elem* next;
}*first = NULL, * last = NULL;

int main()
{
      int num{}, count=0, choice = 0;

      do
      {
            cout << "Menu"
                  "\n1. Push"
                  "\n2. Pop"
                  "\n3. Delete max"
                  "\n4. Show queue"
                  "\n5. Exit\n";
            cin >> choice;

            switch (choice)
            {
            case 1:
            {
                  cout << "\nHow many elements would you like to enter? " << endl;
                  cin >> count;

                  cout << "\nEnter elements: \n";

                  for (int i = 0; i < count; i++)
                  {
                        cin >> num;
                        push(num);
                  }
                  break;
            }
            case 2:
            {
                  pop(num);
                  print_q();
                  cout << "\n";
                  break;
            }
            case 3:
            {
                  del_max(num);
                  cout << "\nLargest element deleted. \n" << endl;
                  system("pause");
                  break;
            }
            case 4:
            {
                  cout << "\nQueue: " << endl;
                  print_q();
                  system("pause");
                  break;
            }
            case 5:
                  return 0;
            }system("cls");
      } while (choice < 6);

      system("pause");

      return 0;
}

void push(int n)
{
      elem* p = last;
      last = new elem;
      last->key = n;
      last->next = NULL;
      if (p != NULL)
            p->next = last;
      if (first == NULL)
      {
            first = last;
      }
}

int pop(int& n)
{
      if (first)
      {
            elem* p = first;
            n = first->key;
            first = first->next;
            delete p;
            return 1;
      }
      else
            return 0;
}

void del_max(int m)
{
      if (first)
      {
            m = first->key;
            elem* p = first;
            while (p->next != NULL)
            {
                  p = p->next;
                  if (m < p->key)
                        m = p->key;
            }

            elem* max = first;

            if (max->key = m)
            {
                  first = first->next;
            }
            else
            {
                  while (max->key != m)
                        max = max->next;
                  if (max = p)
                  {
                        elem* q = first;
                        while (q->next != max)
                              q = q->next;
                        q->next = NULL;
                  }
                  else
                  {
                        elem* q = first;
                        elem* s = max->next;
                        while (q->next != max)
                              q = q->next;
                        q->next = s;
                  }
            }
            delete max;
      }
}

void print_q()
{
      elem* p = first;

      if (first)
      {
            while (p)
            {
                  cout << p->key << "\t";
                  p = p->next;
            }
            cout << "\n";
      }
      else
            cout << "\n The queue is empty. \n";
}
PMEmail Poster
Top
DarkOne
Публикувано на: 24-05-2022, 21:42
Quote Post


Group Icon
Име: Александър Петков
Група: Администратор
Ранг: Почетен член

Мнения: 3665
Регистриран на: 30.01.04



От питането не става ясно дали трябва да се изтрият всички най-големи елементи, или напр. само първия. Алгоритъмът излежда че ще се опитва да трие всички, но после решава да трие само един.

CODE
if (max->key = m) // Присвоява на max->key стойността на m
                  // и проверява дали е присвоено различно от 0

CODE
if (max = p) // Присвоява на max стойността на p
             // и проверява дали е присвоено различно от 0
Две очевидни синтактично-логически грешки, НО! Пусни програмата през дебъгер и я изпълнявай ред по ред, за да видиш какви стойности получават променливите и в кои if-ове и цикли влизаш.

Това мнение е било редактирано от DarkOne на 24-05-2022, 21:48


--------------------
The man who learns only what others know
is as ignorant as if he learns nothing.
The treasures of knowledge are the most rare,
and guarded most harshly.
-- Chronicle of the First Age
PMICQ
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0