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

Стек и работа с ним - C++

Восстановить пароль Регистрация
 
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
04.04.2012, 23:37     Стек и работа с ним #1
Добрый вечер! Мне дали задания:

1. Написать функцию для удаления всех элементов с четными номерами из односвязного списка
2. Написать функцию для добавления элемента в «середину» двусвязного списка
3. Написать функцию для добавления элемента в стек
4. Написать функцию для вывода информационных полей всех элементов двусвязного списка

Номер 3
Я написала функцию, посмотрите пожалуйста - верно же она написана? спасибо большое!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void addSTACK (STACK **head, STACK *new)
{
    STACK *ohead;
    if ((*head)==NULL)
    {
        (*head)=new;
        new->next=NULL;
    }
    else
    {
        {
            ohead=(*head);
            (*head)=new;
            new->next=ohead;
        }
    }
}
Добавлено через 40 минут
Все, эта верна, помогите пожалуйста сделать 1 задание, оно в шапке описано
вот код программы, надо часть с удалением сделать в функцию, помогите пожалуйста и переменный в список сделать, спасибо
вот код чего добилась:
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 <iostream>
#include <list>
using namespace std;
 
 
int main(){
 
    setlocale(LC_ALL, "RUSSIAN");
 
    list<int> lst;
    int n;
    int data;
 
    cout<<"1 \nВведите размер списка \n";
    cin>>n;
 
    cout<<"\nВвод данных \n";
    //ввод данных
    for(int i = 0; i < n; i++)
    {
        cin>>data;
        lst.push_back(data);
    }
    
    //Печать списка
    cout<<"\nСодержимое списка: ";
    list<int>::iterator p = lst.begin();
    while(p != lst.end()){
        cout<<*p<<" ";
        p++;
    }
 
    //удаление из списка все элементы с четными инф. полями
    p = lst.begin();
    int m;
    for(int i = 0; i < n; i++){
        if(*p%2 == 0){
            p = lst.erase(p);
        }else{
            p++;
        }
    }
    
    //Печать списка
    cout<<"\nСодержимое списка: ";
    p = lst.begin();
    while(p != lst.end()){
        cout<<*p<<" ";
        p++;
    }
 
    system("pause");
    return 0;
}
Добавлено через 39 минут
Или я задание неверно поняла?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.04.2012, 00:24     Стек и работа с ним #2
Цитата Сообщение от kristi1 Посмотреть сообщение
Все, эта верна
Сомнительно как-то она решена...
Цитата Сообщение от kristi1 Посмотреть сообщение
C++
1
void addSTACK (STACK **head, STACK *new)
Вот это STACK *new - что по-вашему? В стек какие-то данные должны помещаться, а вместо них вот эта непонятная конструкция (на всякий случай: слово new нельзя использовать в качестве имени переменной в С++).

Цитата Сообщение от kristi1 Посмотреть сообщение
Написать функцию для удаления всех элементов с четными номерами из односвязного списка
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
#include <iostream>
 
class IntList {
    struct Node {
        int value;
        Node * next;
        Node(int val) : value(val), next(0) {}
    };
    
    Node * pFirst;
    Node * pLast;
    
    IntList(const IntList &);
    IntList & operator = (const IntList &);
    
public:
    IntList() : pFirst(0), pLast(0) {}
    
    void add(int value) {
        Node * n = new Node(value);
        if ( ! pFirst )
            pFirst = n;
        else
            pLast->next = n;
        pLast = n;
    }
    
    void removeEven() {
        Node * p1, * p2;
        
        for ( p1 = pFirst; p1; ){
            if ( p2 = p1->next ){
                p1->next = p2->next;
                delete p2;
            }
            p1 = p1->next;
        }
    }
    
    void dump(std::ostream & ost, const char sep = ' ') const {
        for ( Node * p = pFirst; p; p = p->next )
            ost << p->value << sep;
    }
    
    virtual ~IntList() {
        while ( pFirst ){
            pLast = pFirst->next;
            delete pFirst;
            pFirst = pLast;
        }
    }
};
 
int main(){
    IntList list;
    
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    list.add(8);
    list.add(9);
    list.add(10);
    
    std::cout << "List:\n";
    list.dump(std::cout);
    list.removeEven();
    std::cout << "\nRemoved evens:\n";
    list.dump(std::cout);
    std::cout << std::endl;
    
    return 0;
}
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
05.04.2012, 16:30  [ТС]     Стек и работа с ним #3
Спасибо большое Вам за функцию, по удалению, а в стеке - как тогда вы предлагаете? преподаватель давала когда-то именно так, я и не знаю по-другому как, если честно, а еще я написала 2 и 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
2.
void List::addToList(string data)   //реализация функции добавления
{
    Element *temp = new Element;        //создается временный элемент
    if(pHead == NULL)           //если это первый элемент, то
    {
temp->pred = NULL;      //обнуляем указатель на предшествующий 
//элемент т.к. его нет
        temp->next = NULL;      //то же самое с последующим элементом
                pHead = temp;       //"голова" указывает на созданный элемент
    }
else                    //если не первый, то
                pPrev->next = temp;     //предыдущий указывает на него
    temp->data = data;          //копируем данные
    temp->next = NULL;  //последующего элемента нет (добавляем же в конец)
    temp->pred = pPrev;     //указываем на предыдущий элемент, на который «нацелен» pPrev
    pPrev = temp;     //а теперь хвостовой элемент указывает на последний (добавленный)
    countElem++;      //увеличиваем счетчик элементов в списке
}
 
4.
void List::printList()              //реализация функции вывода на экран списка
{
    Element *pTemp = pHead;     //создается временный элемент
 
    if (pHead == NULL)          //если список пуст, то 
    {
        cout << "Spisok pust";  //выводим соответствующее сообщение
    }
    else                    //если все такие он не пуст, то
    {
        cout << "Spisok ->: ";      
        while(pTemp != NULL)    //пока врем. элем. не будет указывать на хвост
        {
            cout << pTemp->data + ' ';  //выводим данные элемента
            pTemp = pTemp->next;    //и переходим на следующий за ним элем.
        }
    cout << endl;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.04.2012, 17:19     Стек и работа с ним #4
Цитата Сообщение от kristi1 Посмотреть сообщение
а в стеке - как тогда вы предлагаете?
Вот так как-нибудь:
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
#include <iostream>
#include <stdexcept>
 
class IntStack {
    struct Node {
        int value;
        Node * next;
        Node(int val, Node * prev = 0) : value(val), next(prev) {}
    };
    
    Node * top;
    
    IntStack(const IntStack &);
    IntStack & operator = (const IntStack &);
public:
    IntStack() : top(0) {}
    virtual ~IntStack() {
        Node * ptr;
        
        while ( ptr = top ){
            top = top->next;
            delete ptr;
        }
    }
    
    bool empty() const { return ( ! top ); }
    
    void push(int value) {
        Node * n = new Node(value, top);
        top = n;
    }
    
    int pop() {
        if ( empty() )
            throw ( std::runtime_error("Empty stack!") );
        
        int ret = top->value;
        Node * n = top;
        top = top->next;
        delete n;
        
        return ret;
    }
};
 
int main(){
    IntStack stack;
    stack.push(13);
    stack.push(69);
    stack.push(95);
    
    while ( ! stack.empty() ){
        int val = stack.pop();
        std::cout << val << ' ';
    }
    std::cout << std::endl;
    
    return 0;
}
kristi1
10 / 10 / 1
Регистрация: 07.03.2010
Сообщений: 465
05.04.2012, 17:23  [ТС]     Стек и работа с ним #5
Цитата Сообщение от easybudda Посмотреть сообщение
void push(int value) { Node * n = new Node(value, top); top = n; }
Получается это функция добавления в стек, как я поняла, а остальные функции вы не погли бы посмотреть? спасибо большое!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.04.2012, 01:22     Стек и работа с ним #6
Цитата Сообщение от kristi1 Посмотреть сообщение
а остальные функции
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
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <stdexcept>
 
class TwoWayIntList {
    struct Node {
        int value;
        Node * prev;
        Node * next;
        Node(int val, Node * p = 0, Node * n = 0) : value(val), prev(p), next(n) {}
    };
    
    Node * first;
    Node * last;
    size_t count;
    
    TwoWayIntList(const TwoWayIntList &);
    TwoWayIntList & operator = (const TwoWayIntList &);
    
public:
    TwoWayIntList() : first(0), last(0), count(0) {}
    
    virtual ~TwoWayIntList() {
        while ( first ){
            last = first->next;
            delete first;
            first = last;
        }
    }
    
    void add(int value) {
        Node * node = new Node(value);
        if ( ! first )
            first = node;
        else {
            node->prev = last;
            last->next = node;
        }
        last = node;
        count += 1;
    }
    
    void insertAfter(size_t pos, int value) {
        if ( pos > count  )
            throw ( std::runtime_error("Out of bounds") );
        
        Node * node = new Node(value);
        if ( pos == 0 ) {
            node->next = first;
            first->prev = node;
            first = node;
        }
        else if ( pos == count ) {
            node->prev = last;
            last->next = node;
            last = node;
        }
        else {
            Node * ptr = first;
            while ( --pos )
                ptr = ptr->next;
            node->prev = ptr;
            node->next = ptr->next;
            ptr->next->prev = node;
            ptr->next = node;
        }
        count += 1;
    }
    
    size_t getCount() const { return count; }
    
    void dump(std::ostream & ost, const char sep = ' ') {
        for ( Node * n = first; n; n = n->next )
            ost << n->value << sep;
    }
    
    void reverseDump(std::ostream & ost, const char sep = ' ') {
        for ( Node * n = last; n; n = n->prev )
            ost << n->value << sep;
    }
};
 
int main() {
    TwoWayIntList list;
    
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    
    std::cout << "Forward:" << std::endl;
    list.dump(std::cout);
    std::cout << "\nBackward:" << std::endl;
    list.reverseDump(std::cout);
    std::cout << std::endl;
    
    list.insertAfter((list.getCount() + (list.getCount() & 1)) / 2, 13);
    
    std::cout << "Forward:" << std::endl;
    list.dump(std::cout);
    std::cout << "\nBackward:" << std::endl;
    list.reverseDump(std::cout);
    std::cout << std::endl;
    
    list.insertAfter((list.getCount() + (list.getCount() & 1)) / 2, 69);
    
    std::cout << "Forward:" << std::endl;
    list.dump(std::cout);
    std::cout << "\nBackward:" << std::endl;
    list.reverseDump(std::cout);
    std::cout << std::endl;
    
    return 0;
}
Yandex
Объявления
06.04.2012, 01:22     Стек и работа с ним
Ответ Создать тему
Опции темы

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