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

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

Войти
Регистрация
Восстановить пароль
 
 
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
#1

Вставить элемент в очередь - C++

09.03.2013, 19:46. Просмотров 997. Ответов 15
Метки нет (Все метки)

Формирую очередь из чисел. Как вставить после каждого простого числа нужное мне?
Имею такой код,...
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <iostream>
using namespace std;
 
struct node
  {
    float info;
    node *link;
  };
 
  node *k, // Рабочий указатель
      *l, *r; // Левый и правый указатели
  int w;
  int z=0; //счетчик чисел в очереди
  int sum; //произведение чисел в очереди
  float g; //среднее геометрическое
 
bool prost(int n)
{
   for(int i=2;i<n-1;i++)
   {
        if(n%i==0)return false;
    }
    return true;
}
 
void add()
{
    cout<<"Bведите число";
    cin>>w;
 
  while (!feof(stdin))
  {
    k = new node;
    k->link = NULL;
    k->info = w;
    sum=sum*w;
    r->link = k; // Добавление узла справа
    r = k;
    cout<<"Bведите число";
    cin>>w;
    z++;
    
  }
}
 
void vivod()
{
     k = l;
  while (k != NULL)
  {
    cout<<k->info<<" ";
    k = k->link;
  }
  cout<<"\n";
}
 
 
 
void main()
{
  setlocale(LC_CTYPE,"Russian");
  
 
  // Создание пеpвого узла
 
  cout<<"Bведите число";
    cin>>w;
  k = new node;
  k->link = NULL;
  k->info = w;
  l = r = k;
 
  z=1;
  sum = w;
  // Построение остальных узлов очереди
 
  add();
 
  // Вывод содержимого очереди
 
 vivod();
 
 g=pow(sum,1.0/z);
  
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 19:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вставить элемент в очередь (C++):

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

Создать очередь, содержащую целые числа. После всех чисел, кратных 𝑋, вставить новый элемент - C++
Создать очередь, содержащую целые числа. После всех чисел, кратных 𝑋, вставить новый элемент. Например, если введены 1 1 2 3 2 4 3 5 4 1...

Создать очередь. Добавить элемент в очередь. Удалить элемент из очереди - C++
Нужно создать очередь. Добавить элемент в очередь. Удалить элемент из очереди. Вот моё &quot;творение&quot;. int main() { int...

Как добавить элемент в очередь, используя указатель на последний элемент? - C++
Не пойму как добавить элемент в очередь используя указатель на последний элемент. Выполняю задание из книги М Доусона с++ и вот реализовать...

Дан двумерный массив размером 5 * 8, заполненный случайным образом. Вставить перед всеми строками, первый элемент которых делится на3,вставить.... - C++
Дан двумерный массив размером 5 * 8, заполненный случайным образом. Вставить перед всеми строками, первый элемент которых делится на 3,...

Перед каждым положительным элемент массива вставить элемент с нулевым значением - C++
6)Дан массив размера N. Перед каждым положительным элемент массива вставить элемент с нулевым значением.

15
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 01:21 #2
Okswes, можно конкретнее?
0
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 10:11  [ТС] #3
В числовой последовательности вставить после каждого простого числа удвоенное среднее геометрическое всех элементов последовательности
У меня не получается вставить среднее геометрическое в середину очереди....
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 11:01 #4
Okswes, вот писал как-то, тут можно добавлять и удалять элемент в любое место списка, если вдруг все-таки нужно подправить ваш код, скажите, будем разбираться

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
// obr.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;
 
struct List
{
    int data;
    List *next;
};
 
class ListNode
{
    private:
        List *Head;
 
    public:
        ListNode()
        {
            Head = NULL;
        }
 
        void addToBack(const int value)                 //добавление в конец
        {
            List *Ptr = new List;
            Ptr -> data = value;
 
            if(Head == NULL)
            {
                Head = Ptr;
                Ptr -> next = NULL;
            }
            else
            {
                List *temp = Head;
 
                while(temp -> next != NULL)
                    temp = temp -> next;
                
                temp -> next = Ptr;
                Ptr -> next = NULL;
            }
        }
 
        void addToFront(const int value)                    //добавление в начало
        {
            List *Ptr = new List;
            Ptr -> data = value;
 
            Ptr -> next = Head;
            Head = Ptr;
        }
 
        void addToPos(const int value, int Pos)             //добавление в указанную
        {                                                   //позицию
            List *tmp = Head;
            List *cur = NULL;
            List *Ptr = new List;
            Ptr -> data = value;
 
            if(Pos == 1)
                addToFront(value);
            else
            {
                int Kol_el = 1;
                while(tmp != NULL && Kol_el != Pos)
                {
                    cur = tmp;
                    tmp = tmp -> next;
                    ++Kol_el;
                }
            
                cur -> next = Ptr;
                Ptr -> next = tmp;
            }
        }
 
        void delList(const int value)
        {
            List *tmp = Head;
            List *cur = NULL;
 
            if(Head != NULL)
            {
                if((Head -> data) == value)                 //если удаляем 1 элемент
                {
                    cur = Head -> next;
                    delete Head;
                    Head = cur;
                }
                else
                {
                    while((tmp != NULL) && (tmp -> data != value))
                    {
                        cur = tmp;
                        tmp = tmp -> next;
                    }
 
                    if(tmp -> next == NULL)                 //если элемент между
                    {                                       //1 и последним
                        delete tmp;
                        cur -> next = NULL;
                    }
                    else                                    //если элемент последний
                    {
                        cur -> next = tmp -> next;
                        delete tmp;
                    }
                }
            }
        }
 
        void showList()
        {
            List *temp = Head;
 
            if(Head != NULL)
            {
                while(temp != NULL)
                {
                    cout << temp -> data << " ";
                    temp = temp -> next;
                }
            }
            else
                wcout << L"Список пуст!\n";
        }
};
 
void instructions();
void menu();
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    menu();
 
    cout << "\n\n";
    return 0;
}
 
void instructions()
{
    wcout << L"Выберите пункт меню: " <<
        L"\n1 - Добавить элемент в начало" <<
        L"\n2 - Добавить элемент в конец" <<
        L"\n3 - Добавить элемент в указанную позицию" <<
        L"\n4 - удалить элемент" <<
        L"\n5 - Выход.\n";
}
 
void menu()
{
    ListNode Universal;
    int punkt_menu, value, pos;
 
    instructions();
 
 
    do{
        wcout << L"\n? ";
            cin >> punkt_menu;
 
            switch(punkt_menu)
            {
                case 1:
                    wcout << L"Введите число: ";
                        cin >> value;
 
                    Universal.addToFront(value);
                    Universal.showList();
                    break;
                case 2:
                    wcout << L"Введите число: ";
                        cin >> value;
 
                    Universal.addToBack(value);
                    Universal.showList();
                    break;
                case 3:
                    wcout << L"Введите число: ";
                        cin >> value;
 
                    wcout << L"Введите позицию: ";
                        cin >> pos;
 
                    Universal.addToPos(value, pos);
                    Universal.showList();
                    break;
                case 4:
                    wcout << L"Введите значение удаляемого элемента: ";
                        cin >> value;
 
                    Universal.delList(value);
                    Universal.showList();
                    break;
            }
 
    }while(punkt_menu != 5);
}
0
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 11:34  [ТС] #5
Спасибо) У меня только вместо номера позиции должна быть проверка на простое число. Я ее написал (функция Prost), надо только додуматься как теперь все вместе собрать....
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 13:45 #6
Okswes, я думаю вот так надо сделать(не компилировал)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void addSrednee()
{                                                  
       List *tmp = Head;
       List *cur;
 
       while(tmp -> next != NULL)
       {
              if(prost(tmp -> data) == true)              //если простое
             {
                    cur = new List;
                    cur -> data = ...                           //здесь инициализируем средним геометрическим
                    cur = tmp -> next;
                    tmp -> next = cur;                       //вставляем сразу после простого числа
             }  
        }                                                              //и так по всему списку
}
Добавлено через 1 час 18 минут
Okswes, вот тут побаловался, смотрите что получилось

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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <locale>
#include <math.h>
using namespace std;
 
struct List
{
    double data;
    List *next;
};
 
class ListNode
{
    private:
        List *Head;
 
    public:
        ListNode()
        {
            Head = NULL;
        }
 
        void addToFront(const double value)                    //добавление в начало
        {
            List *Ptr = new List;
            Ptr -> data = value;
 
            Ptr -> next = Head;
            Head = Ptr;
        }
 
        void delList(const double value)
        {
            List *tmp = Head;
            List *cur = NULL;
 
            if(Head != NULL)
            {
                if((Head -> data) == value)                 //если удаляем 1 элемент
                {
                    cur = Head -> next;
                    delete Head;
                    Head = cur;
                }
                else
                {
                    while((tmp != NULL) && (tmp -> data != value))
                    {
                        cur = tmp;
                        tmp = tmp -> next;
                    }
 
                    if(tmp -> next == NULL)                 //если элемент между
                    {                                       //1 и последним
                        delete tmp;
                        cur -> next = NULL;
                    }
                    else                                    //если элемент последний
                    {
                        cur -> next = tmp -> next;
                        delete tmp;
                    }
                }
            }
        }
 
        bool prost(double n)
        {
            if(n != 1 && n != 2)
            {
                for(int i = 2; i < n; i++)
                {
                    if(((int)n % i) == 0)
                        return false;
                }
            }
 
            return true;
        }
 
        void addSrednee()
        {                                                  
            List *tmp = Head;
            List *cur;
            double Kol = 0;
            double multiply = 1;
 
            while(tmp != NULL)
            {
                ++Kol;
                multiply *= tmp -> data;
                if(prost(tmp -> data) == true)   //если простое
                {
                    cur = new List;
                    cur -> data = pow(multiply, (1.0 / Kol)); //здесь инициализируем тем, чем надо
                    cur -> next = tmp -> next;
                    tmp -> next = cur;           //вставляем сразу после простого числа
                }  
 
                tmp = tmp -> next; 
            }                                   //и так по всему списку
        }
 
        void showList()
        {
            List *temp = Head;
 
            if(Head != NULL)
            {
                while(temp != NULL)
                {
                    cout << setprecision(2) << temp -> data << " ";
                    temp = temp -> next;
                }
            }
            else
                wcout << L"Список пуст!\n";
        }
};
 
void instructions();
void menu();
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    menu();
 
    cout << "\n\n";
    return 0;
}
 
void instructions()
{
    wcout << L"Выберите пункт меню: " <<
        L"\n1 - Добавить элемент в начало" <<
        L"\n2 - Проверка на простые числа" <<
        L"\n3 - Удалить элемент" <<
        L"\n4 - Выход.\n";
}
 
void menu()
{
    ListNode Universal;
    int punkt_menu;
    double value;
 
    instructions();
 
 
    do{
        wcout << L"\n? ";
            cin >> punkt_menu;
 
            switch(punkt_menu)
            {
                case 1:
                    wcout << L"Введите число: ";
                        cin >> value;
 
                    Universal.addToFront(value);
                    Universal.showList();
                    break;
                case 2:
                    Universal.addSrednee();
                    Universal.showList();
                    break;
                case 3:
                    wcout << L"Введите значение удаляемого элемента: ";
                        cin >> value;
 
                    Universal.delList(value);
                    Universal.showList();
                    break;
            }
 
    }while(punkt_menu != 4);
}
слегка подправил вашу функции определения простых чисел, т.к. она показывала что 2 это не простое число, а сы то с вами знаем что это не так
0
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 14:15  [ТС] #7
Спасибо вам большое)
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 14:23 #8
Okswes, то что нужно?
0
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 14:56  [ТС] #9
За труды)
А можете помочь void addSrednee() в мою программу вставить? Что-то не могу разобраться.. У меня без классов просто...
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 16:14 #10
Okswes, вот посмотрите

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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <locale>
#include <math.h>
using namespace std;
 
struct List
{
    double data;
    List *next;
};
 
List *addToFront(const double value, List *Head)                    //добавление в начало
{
    List *Ptr = new List;
    Ptr -> data = value;
     
    Ptr -> next = Head;
    Head = Ptr;
 
    return Head;
}
 
List *delList(const double value, List *Head)
{
    List *tmp = Head;
    List *cur = NULL;
     
    if(Head != NULL)
    {
        if((Head -> data) == value)                 //если удаляем 1 элемент
        {
            cur = Head -> next;
            delete Head;
            Head = cur;
        }
        else
        {
            while((tmp != NULL) && (tmp -> data != value))
            {
                cur = tmp;
                tmp = tmp -> next;
            }
     
            if(tmp -> next == NULL)                 //если элемент между
            {                                       //1 и последним
                delete tmp;
                cur -> next = NULL;
            }
            else                                    //если элемент последний
            {
                cur -> next = tmp -> next;
                delete tmp;
            }
        }
    }
 
    return Head;
}
 
bool prost(double n)
{
    if(n != 1 && n != 2)
    {
        for(int i = 2; i < n; i++)
        {
            if(((int)n % i) == 0)
                return false;
        }
    }
 
    return true;
}
 
void addSrednee(List *Head)
{                                                  
    List *tmp = Head;
    List *cur;
    double Kol = 0;
    double multiply = 1;
 
    while(tmp != NULL)
    {
        ++Kol;
        multiply *= tmp -> data;
        if(prost(tmp -> data) == true)   //если простое
        {
            cur = new List;
            cur -> data = pow(multiply, (1.0 / Kol)); //здесь инициализируем тем, чем надо
            cur -> next = tmp -> next;
            tmp -> next = cur;           //вставляем сразу после простого числа
        }  
 
        tmp = tmp -> next; 
    }                                   //и так по всему списку
}
 
void showList(List *Head)
{
    List *temp = Head;
     
    if(Head != NULL)
    {
        while(temp != NULL)
        {
            cout << setprecision(2) << temp -> data << " ";
            temp = temp -> next;
        }
    }
    else
        wcout << L"Список пуст!\n";
}
 
void instructions();
void menu();
 
int _tmain(int argc, _TCHAR* argv[])
{
    wcout.imbue(locale(".866"));
    wcin.imbue(locale(".866"));
 
    menu();
 
    cout << "\n\n";
    return 0;
}
 
void instructions()
{
    wcout << L"Выберите пункт меню: " <<
        L"\n1 - Добавить элемент в начало" <<
        L"\n2 - Проверка на простые числа" <<
        L"\n3 - Удалить элемент" <<
        L"\n4 - Выход.\n";
}
 
void menu()
{
    int punkt_menu;
    double value;
 
    List *Head = NULL;                  //указатель на начало списка
    instructions();
 
    do{
        wcout << L"\n? ";
            cin >> punkt_menu;
 
            switch(punkt_menu)
            {
                case 1:
                    wcout << L"Введите число: ";
                        cin >> value;
 
                    Head = addToFront(value, Head);
                    showList(Head);
                    break;
                case 2:
                    addSrednee(Head);
                    showList(Head);
                    break;
                case 3:
                    wcout << L"Введите значение удаляемого элемента: ";
                        cin >> value;
 
                    Head = delList(value, Head);
                    showList(Head);
                    break;
            }
 
    }while(punkt_menu != 4);
}
Но мне кажется, что лучше работать с классом, хотя это вам решать
0
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 16:17  [ТС] #11
Спасибо, я уже сам додумался)
Еще вопрос, если можно...) Мне нужно тоже самое сделать STL списками.
Вот сам написал
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <list>
 
using namespace std;
 
bool prost(float n)
{
    if(n!=1 && n!=2)
            {
                for(int i = 2; i < n; i++)
                {
                    if(((int)n % i) == 0)
                        return false;
                }
            }
 
            return true;
}
 
 
void main()
{
    setlocale(LC_CTYPE,"Russian");
    float w;
    int g=99;
    list<int> myList;
    list<int>::iterator listIt;
     cout<<"Bведите число";
    cin>>w;
    while (!feof(stdin))
    {
        myList.push_back(w);
        cout<<"Bведите число";
        cin>>w;
    }
    
    for(listIt=myList.begin();listIt!=myList.end();listIt++)
        cout << *listIt << ' ';
    cout << endl;
 
}
Не могу понять как реализовать проверку? Какое значение подавать в Prost?
Как работает myList.Insert?
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 16:22 #12
Okswes, в Prost вы должны подавать все элементы списка, и каждое проверять, иначе никак)
0
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 16:23  [ТС] #13
Я вот не могу понять как именно? Если можно кодом поясните...
0
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 16:27 #14
Okswes, а чем вам моя реализация не понравилась? я не знаю как со списками в STL работать, я еще не приступал к изучению STL, поэтому не смогу вам в этом помочь...
0
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 16:28  [ТС] #15
Мне двумя вариантами надо, вы мне помогли с первым) Теперь мне с STL разобраться надо...
0
10.03.2013, 16:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 16:28
Привет! Вот еще темы с ответами:

Вставить после данного элемента списка новый элемент, и вывести указатель на добавленный элемент - C++
Дано число D и указатель Р0 на один из элементов пустая двозвязного списка. Вставить после данного элемента списка новый элемент со...

Удалить первый положительный элемент массива; вставить новый элемент перед первым максимальным элементом - C++
Дан целочисленный массив размера N. Как удалить первый положительный элемент ? Как вставить новый элемент перед первым максимальным...

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

Очередь. Поставить перед каждым отрицательным элемент противоположный ему по значению - C++
Поставить перед каждым отрицательным элемент противоположный ему по значению.


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

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

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