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

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

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

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

09.03.2013, 19:46. Просмотров 894. Ответов 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);
  
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2013, 19:46     Вставить элемент в очередь
Посмотрите здесь:

добавить элементы в очередь. найти максимальный элемент. C++
C++ Вставить элемент в середину массива
Массив: Вставить элемент с номером к. C++
Вставить в массив элемент C++
C++ Не получается вставить элемент в вектор
Очередь. Поставить перед каждым отрицательным элемент противоположный ему по значению C++
Вставить после данного элемента списка новый элемент, и вывести указатель на добавленный элемент C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 01:21     Вставить элемент в очередь #2
Okswes, можно конкретнее?
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 10:11  [ТС]     Вставить элемент в очередь #3
В числовой последовательности вставить после каждого простого числа удвоенное среднее геометрическое всех элементов последовательности
У меня не получается вставить среднее геометрическое в середину очереди....
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);
}
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 11:34  [ТС]     Вставить элемент в очередь #5
Спасибо) У меня только вместо номера позиции должна быть проверка на простое число. Я ее написал (функция Prost), надо только додуматься как теперь все вместе собрать....
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 это не простое число, а сы то с вами знаем что это не так
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 14:15  [ТС]     Вставить элемент в очередь #7
Спасибо вам большое)
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 14:23     Вставить элемент в очередь #8
Okswes, то что нужно?
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 14:56  [ТС]     Вставить элемент в очередь #9
За труды)
А можете помочь void addSrednee() в мою программу вставить? Что-то не могу разобраться.. У меня без классов просто...
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);
}
Но мне кажется, что лучше работать с классом, хотя это вам решать
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?
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 16:22     Вставить элемент в очередь #12
Okswes, в Prost вы должны подавать все элементы списка, и каждое проверять, иначе никак)
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 16:23  [ТС]     Вставить элемент в очередь #13
Я вот не могу понять как именно? Если можно кодом поясните...
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 16:27     Вставить элемент в очередь #14
Okswes, а чем вам моя реализация не понравилась? я не знаю как со списками в STL работать, я еще не приступал к изучению STL, поэтому не смогу вам в этом помочь...
Okswes
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 15
10.03.2013, 16:28  [ТС]     Вставить элемент в очередь #15
Мне двумя вариантами надо, вы мне помогли с первым) Теперь мне с STL разобраться надо...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2013, 16:36     Вставить элемент в очередь
Еще ссылки по теме:

C++ Умножить все элементы последовательности на элемент, находящийся в её середине. (Очередь/ стек)
Как вставить элемент в список? C++
Как добавить элемент в очередь, используя указатель на последний элемент? C++
C++ Вставить элемент в односвязный список
Перед каждым положительным элемент массива вставить элемент с нулевым значением C++

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

Или воспользуйтесь поиском по форуму:
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
10.03.2013, 16:36     Вставить элемент в очередь #16
Okswes, посмотрите реализацию List в интернетах)
Yandex
Объявления
10.03.2013, 16:36     Вставить элемент в очередь
Ответ Создать тему
Опции темы

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