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

Ошибка в получение значения (LIFO) - C++

Восстановить пароль Регистрация
 
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
25.07.2013, 20:07     Ошибка в получение значения (LIFO) #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool CStack::GetVal( int &val)
{
    if(pFirst==NULL)
        return 0;
    else
    {
        val=pFirst->val;
    }
    Elem *pCur=pFirst;
    pFirst=pFirst->pNext;
    delete pFirst;
}
весь код у меня работает правильно, но вот после вызова даного метода получается ошибка какае-то
может я что не так делаю, у меня вывод не последний элемент как должно, а первый, да и потом сам стек меняется как-то
если что вот весь код, подскажите где я напортачил если не сложно, может я зря грешу на данный метод, а ошибка в другом месте
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
using namespace std; 
class CStack
{
    int size;
    struct Elem
    {
        Elem *pNext;
        int val;
    };
    Elem *pFirst;
    public:
        CStack():size(0),pFirst(NULL) 
        {}
        ~CStack();
        void SetVal(int val);
        bool GetVal(int &val);
        void ShowStack();
};
void CStack::SetVal(int val)
{
    Elem *pNew=new Elem;
    pNew->pNext=NULL;
    pNew->val=val;
    if(pFirst==NULL)
        pFirst=pNew;
    else
    {
        Elem *pCur;
        pCur=pFirst;
        while(pCur->pNext!=NULL)
            pCur=pCur->pNext;
        pCur->pNext=pNew;
    }
    size++;
}
void CStack::ShowStack()
{
    Elem *pCur=pFirst;
    if(pCur!=NULL)
        while(pCur->pNext!=NULL)
        {
            cout<<pCur->val<<"\t";
            pCur=pCur->pNext;
        }
        cout<<pCur->val<<endl;
}
bool CStack::GetVal( int &val)
{
    if(pFirst==NULL)
        return 0;
    else
    {
        val=pFirst->val;
    }
    Elem *pCur=pFirst;
    pFirst=pFirst->pNext;
    delete pFirst;
}
CStack::~CStack()
{
    Elem *pCur;
    while(pFirst!=NULL)
    {
        pCur=pFirst;
        pFirst=pFirst->pNext;
        delete pCur;
    }
}
void main()
{
    int v;
    CStack s;
    while(1)
    {
        cout <<"Vvedite znachenie: "<<endl;
        cin>>v;
        s.SetVal(v);
        cout<<"Prodolgit?"<<endl;
        cin>>v;
        if(v!=1)
            break;
    }
    s.ShowStack();
    s.GetVal(v);
    cout<<"Poslednij element: "<<v<<endl;
    s.ShowStack();
    scanf("%i");
}
Добавлено через 2 минуты
может тут надо как-то с size работать, ну при получение значения, оно же у меня считает количество элементов, а тут я его не использую, просто непонимаю зачем оно мне тут, но вводил для отнимания
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2013, 20:07     Ошибка в получение значения (LIFO)
Посмотрите здесь:

Реализация стека FIFO и LIFO C++
Получение значения через список параметров C++
Список FIFO и LIFO C++
C++ Множество, LIFO, FIFO
C++ Получение битов и байтов от значения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 20:45     Ошибка в получение значения (LIFO) #2
Тут что делается?
C++
1
2
3
Elem *pCur=pFirst;
pFirst=pFirst->pNext; 
delete pFirst;
Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool CStack::GetVal(int &val)
{
    if(pFirst == NULL)
        return 0;
    else
    {
        val = pFirst->val;
    }
    Elem *pCur = pFirst;
    pFirst = pFirst ->pNext;
    delete pCur;
    return 1;
}
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
25.07.2013, 20:48  [ТС]     Ошибка в получение значения (LIFO) #3
ну как я думаю, в pCur записывается pFirst потом идет уменшения на один и удаления, хотя тупо как-то, сначало надо было уменьшить, а потом удалить или нет?
C++
1
2
3
    Elem *pCur=pFirst->pNext;
    delete pFirst;
    pFirst=pCur;
так надо? или

Добавлено через 1 минуту
ну я вроде бы понял что не так по коду, чет сразу не сообразил, а вот как я написал щас так будет правильно? или по вашему лучше?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 20:49     Ошибка в получение значения (LIFO) #4
Цитата Сообщение от итернал Посмотреть сообщение
так надо?
Можно и так.

Добавлено через 27 секунд
Цитата Сообщение от итернал Посмотреть сообщение
а вот как я написал щас так будет правильно? или по вашему лучше?
Без разницы.
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
25.07.2013, 20:52  [ТС]     Ошибка в получение значения (LIFO) #5
а всеравно удаляет первый элемент, а не последний, я ввожу 5 3 5 4 7 6 8
потом пишет последний элемент 5
и выводи новый список
3 5 4 7 6 8

Добавлено через 1 минуту
а должно писать 8 по идее
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 21:22     Ошибка в получение значения (LIFO) #6
Цитата Сообщение от итернал Посмотреть сообщение
а всеравно удаляет первый элемент, а не последний,
Как делаете, так и удаляет.
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
25.07.2013, 21:23  [ТС]     Ошибка в получение значения (LIFO) #7
ну а как тогда зделать, что бы удаляло последний?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 21:27     Ошибка в получение значения (LIFO) #8
Цитата Сообщение от итернал Посмотреть сообщение
ну а как тогда зделать, что бы удаляло последний?
Найти последний и удалить.
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
25.07.2013, 21:29  [ТС]     Ошибка в получение значения (LIFO) #9
как вот вроде так изменил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool CStack::GetVal( int &val)
{
    Elem *pCur=pFirst->pNext;
    if(pFirst==NULL)
        return 0;
 
    else
    {
        while(pCur->pNext!=NULL)
            pCur=pCur->pNext;
        val=pCur->val;
    }
    
    delete pCur;
    
}
но удаляет как-то неправильно, ну всмысле удаляет, но ошибку показывает

Добавлено через 2 минуты
там в конце вместо цифры, в обновленом выводит как пустое место ну там -большое число
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.07.2013, 21:31     Ошибка в получение значения (LIFO) #10
Посмотрите, для подсказки, как добавляете в конец новый элемент.
итернал
4 / 4 / 0
Регистрация: 17.09.2012
Сообщений: 284
25.07.2013, 21:42  [ТС]     Ошибка в получение значения (LIFO) #11
ну я вроде бы так же делаю, нахожу последний элемент беру от туда значение и удаляю его или перед удаление надо еще зделать что-то?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 00:33     Ошибка в получение значения (LIFO)
Еще ссылки по теме:

C++ Получение значения из функции
Tuple, получение значения по индексу C++
C++ Указатель: получение значения без разименовывания?

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.07.2013, 00:33     Ошибка в получение значения (LIFO) #12
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
bool CStack::GetVal( int &val)
{
    if(pFirst == NULL)
        return 0;
    else
    {
        Elem *pCur = pFirst;
        if (pCur ->pNext == NULL) // если элемент один 
        {
             val = pCur ->val;
             delete pCur;
             pFirst = NULL;
             return 1;
        }
        while(pCur ->pNext ->pNext != NULL)
            pCur = pCur->pNext;
        Elen *pLast = pCur; // запомнили адрес предпоследнего (будет последним после удаления)
        pCur = pCur->pNext; // последний
        val = pCur ->val;
        delete pCur; // удалили последний
        pLast ->pNext = NULL; // предпоследний стал последним
        return 1;
    }
}
Но, вообще-то, стек у вас неправильно организован. Должен быть указатель на вершину стека (последний добавленный элемент) и через него делать все операции. У вас всё наоборот.

Добавлено через 2 часа 45 минут
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
using namespace std; 
 
class CStack
{
    int size;
    struct Elem
    {
        Elem *pNext;
        int val;
    };
    Elem *pFirst;
  
  public:
    CStack():size(0), pFirst(NULL) 
    {}
    ~CStack();
    void SetVal(int val);
    void GetVal(int &val);
    void ShowStack();
};
 
void CStack::SetVal(int val)
{
    Elem *pNew = new Elem;
    
    pNew ->val = val;
    pNew ->pNext = pFirst;
    pFirst = pNew;
    
    size++;
}
 
void CStack::ShowStack()
{
    if(pFirst == NULL)
    {
         cout <<  "\nThe stack is empty!\n";
         return;
    }
    
    Elem *pCur = pFirst;
    cout << endl;
    while(pCur != NULL)
    {
        cout << pCur ->val << endl;
        pCur = pCur ->pNext;
    }
    cout << endl;
}
 
void CStack::GetVal(int &val)
{
    if(pFirst == NULL)
    {
         cout <<  "\nThe stack is empty!\n";
         return;
    }
        
    val = pFirst ->val;
    Elem *pCur = pFirst;
    pFirst = pFirst ->pNext;
    delete pCur;
    --size;
}
 
CStack::~CStack()
{
    if(pFirst != NULL)
    {
        Elem *pCur;
        while(pFirst != NULL)
        {
            pCur = pFirst;
            pFirst = pFirst ->pNext;
            delete pCur;
            --size;
        }
    }
}
 
int main()
{
    CStack s;
    
    int v;
    while(1)
    {
        cout <<"Vvedite znachenie: "<<endl;
        cin >> v;
        s.SetVal(v);
        cout << "Prodolgit?" << endl;
        cin >> v;
        if(v != 1) break;
    }
    
    s.ShowStack();
    s.GetVal(v);
    cout << "Poslednij element: " << v << endl;
    s.ShowStack();
    
    system("pause");
    return 0;
}
Yandex
Объявления
26.07.2013, 00:33     Ошибка в получение значения (LIFO)
Ответ Создать тему
Опции темы

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