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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 265, средняя оценка - 4.79
Vasiliusis
41 / 41 / 2
Регистрация: 14.10.2008
Сообщений: 131
#1

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

11.12.2008, 16:14. Просмотров 34027. Ответов 34
Метки нет (Все метки)

Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
В общем, всем кто нуждается. Баггов вы не найдете.

Односвязный список
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;
}
Пользуйтесь, наздоровье
35
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2008, 16:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Односвязный, двусвязный список, стек, очередь (C++):

Реализовать классы «стек» и «очередь» наследованием от базового класса «двусвязный список» - C++
Всем добрый вечер! Помогите пожалуйста с лабораторной работой, дело в том что скоро сдавать, а я в С++ новичок. и совсем не понимаю как это...

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов - C++
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный список студентов. Помогите пожалуйста,...

Двусвязный в односвязный список - C++
Добрый день.Помогите,пожалуйста,переделать программу,обрабатывающую двухсвязный список,для обработки односвязного списка. :( Листинг: ...

Преобразовать односвязный список в двусвязный - C++
Нужна помощь в написании следующей программы: Дана односвязная цепочка и указатель на ее первый элемент, нужно преобразовать данную цепочку...

Преобразовать односвязный список в двусвязный - C++
Привет всем!) У меня проблема такого плана: есть односвязный список: //------вспомогательный класс-------// class elemspiska ...

Возможно ли как-то переделать односвязный список в двусвязный? - C++
Собственно вопрос в названии. Возможно ли переделать односвязный список в двусвязный? Или проще написать программу наново? Вот сама...

34
Wireless
0 / 0 / 0
Регистрация: 12.12.2008
Сообщений: 15
28.02.2009, 15:44 #2
Спасибо.

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

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

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

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

Код
Node* ptr = new Node;
Будет выброшено исключение типа std::bad_alloc!
1
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2009, 01:59 #6
да, может быть
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
01.03.2009, 10:44 #7
Это, на самом деле, зависит от реализации new в компиляторе. Должно быть выброшено исключение - но MSVC++, например, не выбросит исключение и вернет NULL. Борланд, по-моему, тоже.
0
TurboDune
22 / 22 / 1
Регистрация: 20.02.2009
Сообщений: 59
01.03.2009, 13:29 #8
Интересно, с каких это пор MSVC++ в операторе new не бросает исключение?
Предлагаю посмотреть реализацию в файле new.cpp.
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
01.03.2009, 21:43 #9
TurboDune, CheshireCat прав. Это зависит от реализации в конкретном компиляторе. new может работать мовершенно по-разному на различных компиляторах. Например, где-то он реализован через malloc, где еще через что. Поэтому где-то будет исключение, а где-то просто NULL. Я сталкивался и с первым и со вторым случаем.
0
ostgals
879 / 674 / 15
Регистрация: 23.01.2009
Сообщений: 1,581
01.03.2009, 22:09 #10
Короче, любая программа несовершенна...
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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... и переписывать его - не вариант.
2
TurboDune
22 / 22 / 1
Регистрация: 20.02.2009
Сообщений: 59
02.03.2009, 11:58 #12
Спасибо CheshireCat! Вот это действительно полезные сведения.

Добавлено через 15 минут 20 секунд
Хотя так и не понял чем принципиально отличается Тест1 от Теста2, что так значительно влияет на результаты.
1
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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).
0
Vasiliusis
41 / 41 / 2
Регистрация: 14.10.2008
Сообщений: 131
29.03.2009, 17:55  [ТС] #14
Это для студентов. Не будьте строги
0
real199007
Сообщений: n/a
02.05.2009, 13:11 #15
СЛУШАЙ Vasiliusis А ТЫ МОЖЕШЬ В ОДНОСВЯЗАННОМ СПИСКЕ СОРТИРОВКУ ПО ВОЗРАСТАНИЮ ИЛИ УБЫВАНИЮ СДЕЛАТЬ

Добавлено через 6 минут 21 секунду
Vasiliusis, А ТЫ МОЖЕШЬ В ОДНОСВЯЗАННОМ СПИСКЕ СОРТИРОВКУ ПО ВОЗРАСТАНИЮ ИЛИ УБЫВАНИЮ СДЕЛАТЬ
02.05.2009, 13:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.05.2009, 13:11
Привет! Вот еще темы с ответами:

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

Односвязный (двусвязный) список - поиск людей по минимальному и максимальному возрасту - C++
Здравствуйте форумчане. Имеется задание: Для структуры из Вашего варианта работы 6 сформировать динамический односвязный или двусвязный...

Реализовать иерархию классов, включающую в себя односвязный и двусвязный список - C++
Нужно реализовать иерархию классов, включающую в себя односвязный и двусвязный список. При компиляции программа выдает ошибку:&quot;Ошибка 1...

Стек (односвязный список) - C++
Нужно реализовать операции работы со стеком(продвижение, вставка, удаление), хочется понять реализацию продвижения, а вставку и удаление...


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

Или воспользуйтесь поиском по форуму:
15
Закрытая тема Создать тему
Опции темы

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