Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 527
#1

однонаправленная очередь - C++

29.10.2012, 12:49. Просмотров 455. Ответов 4
Метки нет (Все метки)

Проблема следующая,это одноноправленная очередь.

1)Создую очередь,удалаю элементы,все хорошо,НО тут же хочу создать заново очередь,пишет при добавлении элемента порвеждение кучи,помогите поправить.

Код
ОС Windows инициировала точку останова в aaa.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в aaa.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит aaa.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки

2)Нужно было добавить "+" в конец элемент и удалить "-" из начало ,сделать перегруженными,я правильно сделал?если нет скажите как должно выглядеть


.h

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <conio.h>
 
#ifndef Turn_H 
#define Turn_H
 
using namespace std;
 
class Turn
{
private:
        struct Point
        {
                int key;//информативное поле
                Point *next;
        };
        Point* first;       //указатель на первый элемент списка
        Point* current;     //указатель на текущий элемент списка
 
public:
        Turn();
        virtual ~Turn();
        void operator +(int);
        void operator -(int&);
        void print();
};
#endif
.cpp

Код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include "Turn.h"
 
Turn::Turn()
{
    first = 0;
    current = 0;
}
 
Turn::~Turn()
{
    if(first)//если список не пуст
    {
        current=first;
    }
    while(first)//пока список не пуст
    {
        first=first->next;//взяли следующий элемент
        delete current;//освобождение памяти.Удалили текущий
        current=first;
    }
}
 
void Turn::operator + (int a)
{
    Point* ph = new Point;
    ph->key=a;           //заполнение информатвного поля
    ph->next = 0;
    if (current!=0)
    {
        current->next = ph;
        current = ph;
    }
    else
    {
        ph->next = 0;
        first = ph;
        current = ph;
    }
}
 
void Turn::operator - (int &a)
{
    if(first)
    {
   // a = first->key;
    Point* ph = first;
    first = first->next;
    delete ph;
    cout<<"Элемент успешно удален....";
    }
    else
    {
         cout<<"Список пуст!";  
    }
}
 
void Turn::print()
{
    if(first)
    {
    Point* temp=first;
    cout<<"Список: ";
    while(temp)
    {
        cout << " " << temp->key;
        temp = temp->next;
    }
    cout << endl;
    }
    else
    {
        cout<<"Список пуст!";
    }
}
main.cpp
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdafx.h"
#include "Turn.h"
 
int main()
{
    setlocale(LC_ALL,"Russian");
    Turn w; 
    int b=0,a;
    while(true)
    {
        cout<<"1) Добавить элемент в конец очереди"<<endl;
        cout<<"2) Вывести на экран очередь"<<endl;
        cout<<"3) Извлечь элемент из начала очереди(удалить)"<<endl;
        cout<<"4) Выход"<<endl<<endl;
        cout<<"Ввод: "; 
        cin>>b;
        switch(b)
        {
        case 1 : 
        
            system("cls");
            cout<<"Введите значение: ";
            cin>>a;
            w+a;
            system("cls");
            continue;
        
        case 2:
 
                system("cls");
                w.print();
                getch();
                system("cls");
                continue;
 
        case 3:
        
                system("cls");
                w-a;
                getch();
                system("cls");
                continue;
        
        case 4:
        
                 break;
        
        default: cout<<"Error!"<<endl<<endl;
                 continue;
        }
        break;
    }
    return 0;
}
Добавлено через 53 минуты
Ошибки поправил в нескольких местах, например вместо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Turn::operator + (int a)
{
    Point* ph = new Point;
    ph->key=a; 
    ph->next = 0;
    if (current!=0)
    {
        current->next = ph;
        current = ph;
    }
    else
    {
        ph->next = 0;
        first = ph;
        current = ph;
    }
}
написал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Turn::operator + (int a)
{
    Point* ph = new Point;
    ph->key=a; 
    ph->next = 0;
    if (first)
    {
        current->next = ph;       
        current = current->next;
    }
    else
    {
        first = ph;
        current = ph;
    }
    cout<<"Элемент добавлен";
}
Перегрузку верно сделал саму?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2012, 12:49     однонаправленная очередь
Посмотрите здесь:

Очередь C++
C++ Очередь С++
Очередь C++
C++ Очередь
Очередь C++ C++
C++ Очередь
Кольцевая однонаправленная очередь C++
Очередь C++
C++ Очередь
очередь C++
C++ Очередь
C++ с++ очередь

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
extenup
53 / 53 / 3
Регистрация: 12.11.2011
Сообщений: 109
29.10.2012, 15:00     однонаправленная очередь #2
Перепиши этот метод. Надо обнулять ссылку на объект current.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Turn::operator - (int &a)
{
    if(first)
    {
   // a = first->key;
    Point* ph = first;
    first = first->next;
    delete ph;
    if(first == NULL) current = NULL;
    cout<<"Элемент успешно удален....";
    }
    else
    {
         cout<<"Список пуст!";
    }
}
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 527
29.10.2012, 16:34  [ТС]     однонаправленная очередь #3
Норм,доидеализировал код.Теперь такой вопрос,а как имеенно в с++ проверяется проверка на символ,в си я бы это сделал так

C++
1
while(!fflush(stdin)&&printf("Vvedite chislo x: ")&&!scanf("%f",&x)); //если x флоат
extenup
53 / 53 / 3
Регистрация: 12.11.2011
Сообщений: 109
29.10.2012, 17:25     однонаправленная очередь #4
C++
1
2
3
4
while(!fflush(stdin) && printf("Vvedite chislo x: ") && !(cin >> x))
{
    cin.clear();
}
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 527
29.10.2012, 18:02  [ТС]     однонаправленная очередь #5
Пасиб ,в дальнейшем буду применять этот метод
Yandex
Объявления
29.10.2012, 18:02     однонаправленная очередь
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru