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

Односвязный, двусвязный список, стек, очередь - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 265, средняя оценка - 4.79
Vasiliusis
37 / 37 / 0
Регистрация: 14.10.2008
Сообщений: 127
11.12.2008, 16:14     Односвязный, двусвязный список, стек, очередь #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
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include <iostream>
#include <windows.h>
using namespace std;
 
class Node
{
public:
    int number;
    Node* next;
};
 
void russia(const char*);
 
void main()
{
    Node* head = NULL;
    Node* lastPtr = NULL;
    short action = -1;
    while (1)
    {
        russia("1. Добавить Элемент\n");
        russia("2. Просмотр Списка\n");
        russia("3. Поиск Элемента\n");
        russia("4. Удалить Элемент\n");
        russia("5. Удалить Элемент По Выбору\n");
        russia("0. Выход\n\n");
        russia("Ваш Выбор: ");
        cin>>action;
        if (action == 0)
        {
            system("CLS");
            break;
        }
 
        if (action == 1)
        {
            system("CLS");
            Node* ptr = new Node;
            int numb = -1;
            russia("Введите Число: ");
            cin>>numb;
            ptr->number = numb;
            ptr->next = NULL;
            if (head == 0)
            {
                head = ptr;
                lastPtr = ptr;
                system("CLS");
                continue;
            }
            lastPtr->next = ptr;
            lastPtr = ptr;
            system("CLS");
            continue;
        }
 
        if (action == 2)
        {
            Node* ptr = NULL;
            system("CLS");
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("* * * * * СПИСОК * * * * *\n\n");
            ptr = head;
            while (1)
            {
                cout<<ptr->number<<" ";
                if (ptr->next == 0)
                    break;
                ptr = ptr->next;
            }
            cout<<"\n\n";
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action == 3)
        {
            Node* ptr = NULL;
            int key = -1;
            system("CLS");
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("Введите Элемент Для Поиска: ");
            cin>>key;
            ptr = head;
            while (1)
            {
                if (key == ptr->number)
                {
                    russia("\n\t!!! ЭЛЕМЕНТ НАЙДЕН !!!\n");
                    break;
                }
                if (ptr->next == NULL)
                {
                    russia("\n\t!!! ЭЛЕМЕНТ НЕ НАЙДЕН !!!\n");
                    break;
                }
                ptr = ptr->next;
            }
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action == 4)
        {
            system("CLS");
            Node* ptrDelete = NULL;         
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            if (head->next == NULL)
            {
                head = NULL;
                delete head;
                continue;
            }
            ptrDelete = head;
            head = ptrDelete->next;
            delete ptrDelete;
            continue;
        }
 
        if (action == 5)
        {
            system("CLS");
            Node* ptrPrev = NULL;
            Node* ptrDelete = NULL;
            int key = -1;
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("Введите Элемент Для Удаления: ");
            cin>>key;
            ptrDelete = head;
            if (ptrDelete->number == key)
            {
                head = ptrDelete->next;
                delete ptrDelete;
                system("CLS");
                continue;
            }
            while (1)
            {
                if (key == ptrDelete->number)
                {
                    ptrPrev->next = ptrDelete->next;
                    delete ptrDelete;
                    break;
                }
                if (ptrDelete->next == 0)
                {
                    russia("\n\t!!! ЭЛЕМЕНТ НЕ НАЙДЕН !!!\n");
                    system("PAUSE");
                    break;
                }
                ptrPrev = ptrDelete;
                ptrDelete = ptrDelete->next;
            }
            system("CLS");
            continue;
        }
 
        if (action > 5)
        {
            system("CLS");
            russia("\t!!! НЕВЕРНЫЙ ВЫБОР. ПОВТОРИТЕ ВВОД !!!\n\n");
            system("PAUSE");
            system("CLS");
            continue;
        }
    }   
}
 
void russia(const char* rus)
{
    char word[100];
    CharToOem(rus, word);
    cout<<word;
}
Двусвязный список
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#include <iostream>
#include <windows.h>
using namespace std;
 
class Node
{
public:
    int number;
    Node* next;
    Node* last;
};
 
void russia(const char*);
 
void main()
{
    short action = -1;
    Node* head = NULL;
    Node* tail = NULL;
    Node* ptrLast = NULL;
 
    while (1)
    {       
        russia("1. Добавить Элемент\n");
        russia("2. Просмотр Списка Слева Направо\n");
        russia("3. Просмотр Списка Справа Налево\n");
        russia("4. Удалить Голову\n");
        russia("5. Удалить Хвост\n");
        russia("6. Поиск Элемента\n");
        russia("0. Выход\n\n");
        russia("Ваш Выбор: ");
        cin>>action;
 
        if (action == 0)
        {
            system("CLS");
            break;
        }
 
        if (action == 1)
        {
            system("CLS");
            int numb = -1;
            russia("Введите Число: ");
            cin>>numb;
            Node* ptr = new Node;
            ptr->number = numb;
            ptr->next = NULL;
            tail = ptr;
            if (head == NULL)
            {
                head = ptr;
                ptrLast = ptr;
                ptr->last = NULL;
                system("CLS");
                continue;
            }
            ptr->last = ptrLast;
            ptrLast->next = ptr;
            ptrLast = ptr;
            system("CLS");
            continue;
        }
 
        if (action == 2)
        {
            system("CLS");
            Node* ptr = NULL;
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("* * * * * СПИСОК: СЛЕВА НАПРАВО * * * * *\n\n");
            ptr = head;
            while (1)
            {
                cout<<ptr->number<<" ";
                if (ptr->next == 0)
                    break;
                ptr = ptr->next;
            }
            cout<<"\n\n";
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action == 3)
        {
            system("CLS");
            Node* ptr = NULL;           
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("* * * * * СПИСОК: СПРАВА НАЛЕВО * * * * *\n\n");
            ptr = tail;
            while (1)
            {
                cout<<ptr->number<<" ";
                if (ptr->last == 0)
                    break;
                ptr = ptr->last;
            }
            cout<<"\n\n";
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action == 4)
        {
            system("CLS");
            Node* ptrDelete = NULL;         
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            if (head->next == NULL)
            {
                head = NULL;
                tail = NULL;
                delete head;
                continue;
            }
            ptrDelete = head;
            head = ptrDelete->next;
            head->last = NULL;
            delete ptrDelete;
            continue;
        }
 
        if (action == 5)
        {
            system("CLS");
            Node* ptrDelete = NULL;
            if (tail == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            if (tail->last == NULL)
            {
                head = NULL;
                tail = NULL;
                delete tail;
                continue;
            }           
            ptrDelete = tail;
            tail = ptrDelete->last;
            tail->next = NULL;
            ptrLast = tail;
            delete ptrDelete;
            continue;
        }
 
        if (action == 6)
        {
            system("CLS");
            Node* ptr = NULL;
            int key = -1;
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("Введите Элемент Для Поиска: ");
            cin>>key;           
            ptr = head;
            while (1)
            {
                if (key == ptr->number)
                {
                    russia("\n\t!!! ЭЛЕМЕНТ НАЙДЕН !!!\n");
                    break;
                }
                if (ptr->next == NULL)
                {
                    russia("\n\t!!! ЭЛЕМЕНТ НЕ НАЙДЕН !!!\n");
                    break;
                }
                ptr = ptr->next;
            }
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action > 6)
        {
            system("CLS");
            russia("\t!!! НЕВЕРНЫЙ ВЫБОР. ПОВТОРИТЕ ВВОД !!!\n\n");
            system("PAUSE");
            system("CLS");
            continue;
        }
    }
}
 
void russia(const char* rus)
{
    char word[100];
    CharToOem(rus, word);
    cout<<word;
}
Стек
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include <windows.h>
using namespace std;
 
class Node
{
public:
    int number;
    Node* last;
};
 
void russia(const char*);
 
void main()
{
    Node* ptrLast = NULL;
    Node* top = NULL;
    short action = -1;
 
    while (1)
    {
        russia("1. Затолкнуть В Стек\n");
        russia("2. Вытолкнуть Из Стека\n");
        russia("3. Вершина Стека\n");
        russia("4. Содержимое Стека\n");
        russia("0. Выход\n\n");
        russia("Ваш Выбор: ");
        cin>>action;        
 
        if (action == 0)
        {
            system("CLS");
            break;
        }
 
        if (action == 1)
        {
            system("CLS");
            int numb = -1;          
            russia("Введите Число: ");
            cin>>numb;
            Node* ptr = new Node;
            ptr->number = numb;         
            if (top == NULL)
            {
                ptr->last = NULL;
                top = ptr;
                ptrLast = ptr;
                system("CLS");
                continue;
            }
            top = ptr;
            ptr->last = ptrLast;
            ptrLast = ptr;
            system("CLS");
            continue;
        }
 
        if (action == 2)
        {
            system("CLS");
            Node* ptrDelete = NULL;
            if (top == NULL)
            {
                russia("\t!!! СТЕК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }           
            ptrDelete = top;
            if (ptrDelete->last == NULL)
            {
                top = NULL;
                delete ptrDelete;
                system("CLS");
                continue;
            }
            top = ptrDelete->last;
            ptrLast = top;
            delete ptrDelete;
            continue;
        }
 
        if (action == 3)
        {
            system("CLS");
            if (top == NULL)
            {
                russia("\t!!! СТЕК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("Вершина Стека: ");
            cout<<top->number<<"\n\n";
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action == 4)
        {
            system("CLS");
            Node* ptr = NULL;
            if (top == NULL)
            {
                russia("\t!!! СТЕК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("* * * * * СОДЕРЖИМОЕ СТЕКА * * * * *\n\n");
            ptr = top;
            while (1)
            {
                cout<<ptr->number<<endl;
                if (ptr->last == NULL)
                {
                    system("PAUSE");
                    system("CLS");
                    break;
                }
                ptr = ptr->last;
            }
        }
 
        if (action > 4)
        {
            system("CLS");
            russia("\t!!! НЕВЕРНЫЙ ВЫБОР. ПОВТОРИТЕ ВВОД !!!\n\n");
            system("PAUSE");
            system("CLS");
            continue;
        }
 
    }
}
 
void russia(const char* rus)
{
    char word[100];
    CharToOem(rus, word);
    cout<<word;
}
Очередь
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <iostream>
#include <windows.h>
using namespace std;
 
class Node
{
public:
    int number;
    Node* last;
    Node* next;
};
 
void russia(const char*);
 
void main()
{
    Node* head = NULL;
    Node* tail = NULL;
    Node* ptrLast = NULL;
    short action = -1;
 
    while(1)
    {
        russia("1. Добавить Элемент\n");
        russia("2. Просмотр Очереди\n");
        russia("3. Удалить Элемент\n");
        russia("4. Поиск Элемента\n");
        russia("0. Выход\n\n");
        russia("Ваш Выбор: ");
        cin>>action;
 
        if (action == 0)
        {
            system("CLS");
            break;
        }
 
        if (action == 1)
        {
            system("CLS");
            int numb = -1;
            russia("Введите Число: ");
            cin>>numb;
            Node* ptr = new Node;
            ptr->number = numb;
            ptr->next = NULL;
            tail = ptr;
            if (head == NULL)
            {
                head = ptr;
                ptrLast = ptr;
                ptr->last = NULL;
                system("CLS");
                continue;
            }
            ptr->last = ptrLast;
            ptrLast->next = ptr;
            ptrLast = ptr;
            system("CLS");
            continue;
        }
 
        if (action == 2)
        {
            system("CLS");
            Node* ptr = NULL;           
            if (head == NULL)
            {
                russia("\t!!! ОЧЕРЕДЬ ПУСТА !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("* * * * * ОЧЕРЕДЬ * * * * *\n\n");
            ptr = tail;
            while (1)
            {
                cout<<ptr->number<<" ";
                if (ptr->last == 0)
                    break;
                ptr = ptr->last;
            }
            cout<<"\n\n";
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action == 3)
        {
            system("CLS");
            Node* ptrDelete = NULL;
            if (head == NULL)
            {
                russia("\t!!! ОЧЕРЕДЬ ПУСТА !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            if (head->next == NULL)
            {
                head = NULL;
                tail = NULL;
                delete tail;
                continue;
            }           
            ptrDelete = head;
            head = ptrDelete->next;
            head->last = NULL;
            delete ptrDelete;
            continue;
        }
 
        if (action == 4)
        {
            system("CLS");
            Node* ptr = NULL;
            int key = -1;
            if (head == NULL)
            {
                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                system("PAUSE");
                system("CLS");
                continue;
            }
            russia("Введите Элемент Для Поиска: ");
            cin>>key;           
            ptr = head;
            while (1)
            {
                if (key == ptr->number)
                {
                    russia("\n\t!!! ЭЛЕМЕНТ НАЙДЕН !!!\n");
                    break;
                }
                if (ptr->next == NULL)
                {
                    russia("\n\t!!! ЭЛЕМЕНТ НЕ НАЙДЕН !!!\n");
                    break;
                }
                ptr = ptr->next;
            }
            system("PAUSE");
            system("CLS");
            continue;
        }
 
        if (action > 4)
        {
            system("CLS");
            russia("\t!!! НЕВЕРНЫЙ ВЫБОР. ПОВТОРИТЕ ВВОД !!!\n\n");
            system("PAUSE");
            system("CLS");
            continue;
        }
    }
}
 
void russia(const char* rus)
{
    char word[100];
    CharToOem(rus, word);
    cout<<word;
}
Пользуйтесь, наздоровье
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Wireless
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 15
28.02.2009, 15:44     Односвязный, двусвязный список, стек, очередь #2
Спасибо.

Только как это у вас в двусвязном списке получается...head->last указывает на саму себя? тогда у вас вывод справа налево не работает...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
28.02.2009, 19:21     Односвязный, двусвязный список, стек, очередь #3
Цитата Сообщение от Vasiliusis Посмотреть сообщение
..... Баггов вы не найдете.
Запросто.
1. Ни один из приведенных классов Node не поддерживает правильное конструирование и присваивание.
2. На более-менее соответствующем Стандарту компиляторе (например, GCC 4.3, 4.4) ни один из примеров даже не скомпилируется.

Далее. Если уж это C++ (судя по #include <iostream>), то имело бы смысл все структуры данных (списки, стек и очередь) оформить в виде классов.

Исправь, плз. После исправления - довольно полезные примеры будут.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
28.02.2009, 23:25     Односвязный, двусвязный список, стек, очередь #4
если программе не хватит памяти, будет разыменовывать нулевой указатель

Код
Node* ptr = new Node;
TurboDune
22 / 22 / 1
Регистрация: 20.02.2009
Сообщений: 59
01.03.2009, 00:34     Односвязный, двусвязный список, стек, очередь #5
Цитата Сообщение от accept Посмотреть сообщение
если программе не хватит памяти, будет разыменовывать нулевой указатель

Код
Node* ptr = new Node;
Будет выброшено исключение типа std::bad_alloc!
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2009, 01:59     Односвязный, двусвязный список, стек, очередь #6
да, может быть
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
01.03.2009, 10:44     Односвязный, двусвязный список, стек, очередь #7
Это, на самом деле, зависит от реализации new в компиляторе. Должно быть выброшено исключение - но MSVC++, например, не выбросит исключение и вернет NULL. Борланд, по-моему, тоже.
TurboDune
22 / 22 / 1
Регистрация: 20.02.2009
Сообщений: 59
01.03.2009, 13:29     Односвязный, двусвязный список, стек, очередь #8
Интересно, с каких это пор MSVC++ в операторе new не бросает исключение?
Предлагаю посмотреть реализацию в файле new.cpp.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
01.03.2009, 21:43     Односвязный, двусвязный список, стек, очередь #9
TurboDune, CheshireCat прав. Это зависит от реализации в конкретном компиляторе. new может работать мовершенно по-разному на различных компиляторах. Например, где-то он реализован через malloc, где еще через что. Поэтому где-то будет исключение, а где-то просто NULL. Я сталкивался и с первым и со вторым случаем.
ostgals
 Аватар для ostgals
873 / 668 / 14
Регистрация: 23.01.2009
Сообщений: 1,565
01.03.2009, 22:09     Односвязный, двусвязный список, стек, очередь #10
Короче, любая программа несовершенна...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
02.03.2009, 11:37     Односвязный, двусвязный список, стек, очередь #11
На самом деле, что произойдет при неудачной попытке выделить память - довольно-таки неоднозначная ситуация. Более того, даже на одном и том же компиляторе это зависит от кода!! Я немного поэкспериментировал с доступными мне компиляторами, и вот какие результаты получились:
Тест 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
#include <iostream>
#include <exception>
#include <stdexcept>
 
using namespace std;
 
int main()
{
    try
    {
        while(true)
        {
            char* p = new char[0x40000000];
            if (p == NULL)
            {
                cout << "NULL pointer" << endl;
                break;
            }
        }
    }
    catch(bad_alloc& a)
    {
        cout << "bad_alloc exception" << endl;
    }
    return 0;
}
 
// GCC 3.4             bad_alloc exception
// GCC 4.4             bad_alloc exception
// MSVC++ 5 (97)       NULL pointer
// MSVC++ 6            NULL pointer
// MSVC++ 7.0          bad_alloc exception
// MSVC++ 7.1 (2003)   bad_alloc exception
// MSVC++ 2005         bad_alloc exception
// Borland C++ 5.5     bad_alloc exception
Тест 2
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
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    try
    {
        while(true)
        {
            char* p = new char[0x40000000];
            if (p == NULL)
            {
                printf("NULL pointer\n");
                break;
            }
        }
    }
    catch(...)
    {
        printf("bad_alloc exception\n");
    }
    return 0;
}
 
// GCC 3.4             bad_alloc exception
// GCC 4.4             bad_alloc exception
// MSVC++ 5 (97)       NULL pointer
// MSVC++ 6            NULL pointer
// MSVC++ 7.0          NULL pointer
// MSVC++ 7.1 (2003)   NULL pointer
// MSVC++ 2005         bad_alloc exception
// Borland C++ 5.5     bad_alloc exception
Вот это и привносит любопытную проблему - как написать переносимый код?....

Добавлено через 32 минуты 40 секунд
PS: юзать new(std::nothrow) не предлагать - бо имеется большой объем legacy code... и переписывать его - не вариант.
TurboDune
22 / 22 / 1
Регистрация: 20.02.2009
Сообщений: 59
02.03.2009, 11:58     Односвязный, двусвязный список, стек, очередь #12
Спасибо CheshireCat! Вот это действительно полезные сведения.

Добавлено через 15 минут 20 секунд
Хотя так и не понял чем принципиально отличается Тест1 от Теста2, что так значительно влияет на результаты.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
02.03.2009, 12:48     Односвязный, двусвязный список, стек, очередь #13
Различие между тестами в том, что Тест1 использует заголовки и код в стиле C++, а Тест2 - old-style заголовки и код в стиле C. Вот цитата из MSDN (июль 2003):
(естественно, касается только компиляторов MS Visual C++)

Beginning in Visual C++ .NET 2002, the CRT's new function (in libc.lib, libcd.lib, libcmt.lib, libcmtd.lib, msvcrt.lib, and msvcrtd.lib) will continue to return NULL if memory allocation fails. However, the new function in the Standard C++ Library (in libcp.lib, libcpd.lib, libcpmt.lib, libcpmtd.lib, msvcprt.lib, and msvcprtd.lib) will support the behavior specified in the C++ standard, which is to throw a std::bad_alloc exception if the memory allocation fails.

Normally, if you #include one of the C++ standard headers, like <new>, you'll get a /defaultlib directive in your object that will reference the appropriate C++ Standard Library according to the CRT model you used (the /M* compiler options). Generally, that will cause the linker to use the throwing operator new from the C++ Standard Library instead of the nonthrowing one from the main CRT, because the order of defaultlib directives will cause libcp.lib to be searched before libc.lib (under /ML).
Vasiliusis
37 / 37 / 0
Регистрация: 14.10.2008
Сообщений: 127
29.03.2009, 17:55  [ТС]     Односвязный, двусвязный список, стек, очередь #14
Это для студентов. Не будьте строги
real199007
Сообщений: n/a
02.05.2009, 13:11     Односвязный, двусвязный список, стек, очередь #15
СЛУШАЙ Vasiliusis А ТЫ МОЖЕШЬ В ОДНОСВЯЗАННОМ СПИСКЕ СОРТИРОВКУ ПО ВОЗРАСТАНИЮ ИЛИ УБЫВАНИЮ СДЕЛАТЬ

Добавлено через 6 минут 21 секунду
Vasiliusis, А ТЫ МОЖЕШЬ В ОДНОСВЯЗАННОМ СПИСКЕ СОРТИРОВКУ ПО ВОЗРАСТАНИЮ ИЛИ УБЫВАНИЮ СДЕЛАТЬ
dpi
Сообщений: n/a
02.05.2009, 14:20     Односвязный, двусвязный список, стек, очередь #16
Цитата Сообщение от real199007 Посмотреть сообщение
СЛУШАЙ Vasiliusis А ТЫ МОЖЕШЬ В ОДНОСВЯЗАННОМ СПИСКЕ СОРТИРОВКУ ПО ВОЗРАСТАНИЮ ИЛИ УБЫВАНИЮ СДЕЛАТЬ

Добавлено через 6 минут 21 секунду
Vasiliusis, А ТЫ МОЖЕШЬ В ОДНОСВЯЗАННОМ СПИСКЕ СОРТИРОВКУ ПО ВОЗРАСТАНИЮ ИЛИ УБЫВАНИЮ СДЕЛАТЬ
Используй класс:
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
#include<iostream.h>
class Spisok
{
  private:
    struct node
      {
        int elem; 
        node *sled;
      } *phead; //Указатель на начало списка.
  public: 
    Spisok() {phead = new (node); (*phead).sled=NULL;} //Конструктор.
    ~Spisok() { delete phead; } //Деструктор.
    void POSTROENIE (); 
    void VYVOD (); 
    void OCHISTKA ();
}; 
 
int main ()
{
  Spisok A;
 
  A.POSTROENIE ();
  A.VYVOD ();
  A.OCHISTKA ();
  return 0;
} 
 
void Spisok::POSTROENIE ()
//Построение однонаправленного списка с заглавным звеном.
// phead - указатель на заглавное звено списка. 
{
  node *t;
  int el;
  t = phead;
  cout<< "Вводите элементы списка: ";
  cin>>el;
  while (el!=0)
  { 
    (*t).sled = new (node); 
    t = (*t).sled; (*t).elem = el; (*t).sled = NULL; 
    cin>>el;
  }
} 
 
void Spisok::VYVOD ()
//Вывод содержимого однонаправленного линейного списка
//с заглавным звеном.
// phead - указатель на заглавное звено списка.
{
  node *t;
  t = (*phead).sled; 
  cout<<"Список: ";
  while (t!=NULL)
  { 
    cout<<(*t).elem<<" "; 
    t = (*t).sled;
  }
  cout<<endl;
} 
 
void Spisok::OCHISTKA ()
//Удаление однонаправленного списка из памяти.
// phead - указатель на заглавное звено списка.
{
  node *q,*q1;// Рабочие указатели.
 
  q = phead;
  q1 = (*q).sled; // Указатель q1 "опережает" указатель q.
  while (q1!=NULL)
  { q = q1; q1 = (*q1).sled; delete q;}
}
real199007
Сообщений: n/a
02.05.2009, 19:26     Односвязный, двусвязный список, стек, очередь #17
dpi,
слушай я в С++ не бум бум
вот в верху есть Односвязный список построенный Vasiliusis
ты можешь туда запихнуть сортировку

dpi, вот в верху есть Односвязный список построенный Vasiliusis
ты можешь туда запихнуть сортировку
grom
 Аватар для grom
1 / 1 / 0
Регистрация: 09.02.2009
Сообщений: 31
20.05.2009, 20:55     Односвязный, двусвязный список, стек, очередь #18
а кто нибудь знает как насследованием из класса стек сделать дек
NAG
8 / 8 / 1
Регистрация: 15.03.2009
Сообщений: 267
14.10.2009, 19:41     Односвязный, двусвязный список, стек, очередь #19
а как "очередь" будет "звучать"(написано) на СИ, а не Си++?
А то в Си я не очень силен. Если, кто может, то переделйте)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2009, 14:42     Односвязный, двусвязный список, стек, очередь
Еще ссылки по теме:

C++ Преобразовать односвязный список в двусвязный
Односвязный список (очередь). Удаление узла C++
Очередь через односвязный список C++

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

Или воспользуйтесь поиском по форуму:
apis1
Сообщений: n/a
22.12.2009, 14:42     Односвязный, двусвязный список, стек, очередь #20
Цитата Сообщение от Vasiliusis Посмотреть сообщение
В общем, всем кто нуждается. Баггов вы не найдете.
Пользуйтесь, наздоровье
да спасибо
очередь пошла на DEVCPP как дети в школу
только int main потребовала

а зачем здесь windows.h?
Yandex
Объявления
22.12.2009, 14:42     Односвязный, двусвязный список, стек, очередь
Закрытая тема Создать тему
Опции темы

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