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

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

Восстановить пароль Регистрация
 
a.n.o.n.i.m
137 / 137 / 15
Регистрация: 26.02.2011
Сообщений: 492
29.10.2012, 12:49     однонаправленная очередь #1
Проблема следующая,это одноноправленная очередь.

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<<"Элемент добавлен";
}
Перегрузку верно сделал саму?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Сообщений: 492
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
Сообщений: 492
29.10.2012, 18:02  [ТС]     однонаправленная очередь #5
Пасиб ,в дальнейшем буду применять этот метод
Yandex
Объявления
29.10.2012, 18:02     однонаправленная очередь
Ответ Создать тему
Опции темы

Текущее время: 15:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru