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

Динамический список - C++

Восстановить пароль Регистрация
 
Algiz
159 / 159 / 13
Регистрация: 23.02.2011
Сообщений: 347
09.08.2011, 01:30     Динамический список #1
Пытаюсь реализовать стек. Не работает, вылетает при вызове процедуры pop. Я запутался. Помогите.
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
struct _stack
{
    int num;
    _stack* next;
};
 
void push(_stack** stack, int number)
{
    _stack* el=new _stack;
    el->num=number;
    el->next=*stack;
    stack=⪙
}
 
void pop(_stack** stack,int* num)
{
    _stack* temp=(*stack)->next;
    *num=(*stack)->num;
    delete stack;
    stack=&temp;
    
}
 
int main(int argc, char** argv)
{
    _stack* head=new _stack;
    int num=1;
    head->next=NULL;
    head->num=0;
    while (num!=0){ 
        scanf("%d",&num);
        push(&head,num);
    }
    while (head->next!=NULL){
        pop(&head,&num);
        printf("%d\n",num);
    }
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2011, 01:30     Динамический список
Посмотрите здесь:

динамический список C++
Динамический список C++
Динамический список C++
Динамический список C++
динамический список C++
C++ Динамический список
C++ Динамический список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.08.2011, 01:50     Динамический список #2
C++
1
2
3
4
5
6
7
8
void pop(_stack** stack,int* num)
{
    _stack* temp = (*stack)->next;
    *num = (*stack)->num;
    delete *stack; //<-
    stack = &temp;
        
}
Algiz
159 / 159 / 13
Регистрация: 23.02.2011
Сообщений: 347
09.08.2011, 02:07  [ТС]     Динамический список #3
Maxwe11, не помогло.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
09.08.2011, 03:41     Динамический список #4
Даже мельком посмотрел увидел ошибки, вот накидал рабочий вариант.
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
#include <iostream>
using namespace std;
 
struct _stack {
  int      num;
  _stack*  next;
};
 
void push(_stack** st, int num) {
  _stack* ns = new _stack();
  ns->next   = *st;
  ns->num   = num;
  *st   = ns;
}
 
void pop(_stack** st, int*  num) {
  _stack* tmp = *st;
  *num   = tmp->num;
  *st   = (*st)->next;
  delete tmp;
  tmp   = NULL;
}
 
int main(void){
 
   _stack*  stk = NULL;
   int      num = 0;
 
   while(cin >> num && num != 0)
       push(&stk, num);
 
   while(stk) {
       pop(&stk, &num);
       cout << '\t' << num << endl;
   }
   stk = NULL;
 
   system("pause");
   return 0;
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.08.2011, 04:22     Динамический список #5
Цитата Сообщение от Maxwe11
C++
1
2
3
4
5
6
7
8
void pop(_stack** stack,int* num)
{
    _stack* temp = (*stack)->next;
    *num = (*stack)->num;
    delete *stack; //<-
    stack = &temp;
        
}
Цитата Сообщение от Algiz
Maxwe11, не помогло.
C++
1
2
3
4
5
6
7
8
void pop(_stack **stack, int *num)
{
    _stack *temp = (*stack)->next;
    
    *num = (*stack)->num;
    delete *stack; //<-
    *stack = temp;
}
mac_alleb
7 / 7 / 0
Регистрация: 05.08.2011
Сообщений: 54
09.08.2011, 05:24     Динамический список #6
Судя по всему, ошибка не в процедуре pop, а в процедуре push. В строке 2 должно быть наоборот
*stack->next = e1
Кроме того, перед применением процедуры push не худо бы найти начало списка, а это означает,
что список должен быть двусторонним (т.е. содержать еще и элемент previous).
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.08.2011, 06:06     Динамический список #7
Цитата Сообщение от mac_alleb
Судя по всему, ошибка не в процедуре pop
функция pop() у него неправильная

а функция push() неправильно сохраняет указатель
C++
1
2
3
4
5
6
7
8
9
void push(_stack **stack, int number)
{
    _stack *el = new _stack;
    
    el->num = number;
    el->next = *stack;
    *stack = el;    
    //stack=&el;
}
Добавлено через 4 минуты
и из названия типа надо убрать подчёркивание
подчёркивания делаются у служебных типов, которые программист потом не использует
они делаются для типов, которые используются в программе внутренне

C++
1
_stack*  stk = NULL;
вот ты сделал этот стек - использовал служебный тип
такого не должно быть
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2011, 08:14     Динамический список
Еще ссылки по теме:

C++ Динамический список
динамический список C++
Динамический список C++
C++ Динамический список
C++ Динамический список на xp и семёрке

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

Или воспользуйтесь поиском по форуму:
Olga_
 Аватар для Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
09.08.2011, 08:14     Динамический список #8
После минимальных исправлений, рабочий код:

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
struct _stack
{
        int num;
        _stack* next;
};
 
void push(_stack** stack, int number)
{
        _stack* el=new _stack;
        el->num=number;
        el->next=*stack;
        *stack=el;
}
 
void pop(_stack** stack,int* num)
{
        _stack* temp=(*stack)->next;
        *num=(*stack)->num;
        delete *stack;
        *stack = temp;
 
}
 
int main(int argc, char** argv)
{
        _stack* head=new _stack;
        int num=1;
        head->next=NULL;
        head->num=0;
        while (num!=0){
                scanf("%d",&num);
                push(&head,num);
        }
        while (head->next!=NULL){
                pop(&head,&num);
                printf("%d\n",num);
        }
 
        return 0;
}
Yandex
Объявления
09.08.2011, 08:14     Динамический список
Ответ Создать тему
Опции темы

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