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

подправить функцию вставки элемента - C++

Восстановить пароль Регистрация
 
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
05.11.2011, 03:47     подправить функцию вставки элемента #1
вот весь листинг контрольной если скопировать в компилятор будет работать, не корректно работает функция вставки нового элемента, неккоректно тоесть вставлять должен после введеного номера, допустим если я ввожу номер 1 то новый елемент который я введу должен быть под номером 2 и так далее... а при вводе 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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
include <iostream>                        // класс для работы с вводом-выводом
# include <windows.h>                     // для функции        CharToOem();
# include <fstream>                       // класс для работы с файлом
 
using namespace std;
        char bufRus[256];
        char* Rus(const char* text)
        {
                CharToOem(text, bufRus);
        return bufRus;
        }
 
struct lfile{
        char name[15];
        char data[10];
        int upd;
};
struct sp{
        lfile elfile;   // поле данных
        sp *next;       // указатель
};
 
sp*print_list(sp *list);//прототип функции вывод на экран
 
sp* fromtipf();
sp* ft_enter();
sp* fb_enter();
sp* fs_enter();
sp* sort(sp *list);
void search(sp *list);
void fsearch(sp *list);
sp* ddf(sp *list);
sp* pind(sp *list);
sp* del(sp *list,sp *adr);
sp * vst(sp *list,sp *adr);
void zmn(sp *list);
 
void main()
{
   int v;
   sp *k;
   do{
          cout<<Rus("  0: формирование списка из текстового файла")<<endl;
          cout<<Rus("  1: формирование списка из типизированного файла")<<endl;
          cout<<Rus("  2: формирование списка с экрана")<<endl;
          cout<<Rus("  3: сортировка")<<endl;
          cout<<Rus("  4: поиск по заданному полю с сохранением результатов в файле")<<endl;
          cout<<Rus("  5: выборка файла с наибольшим количеством обращений")<<endl;
          cout<<Rus("  6: замена записи")<<endl;
          cout<<Rus("  7: удаление записи после указанного адреса")<<endl;
          cout<<Rus("  8: вставка записи после указанного адреса")<<endl;
          cout<<Rus("  9: выход")<<endl;
          cout<<Rus("вариант ")<<endl;
          cin>>v;
          switch(v){
                case 0: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
                case 1: k = fb_enter(); break; // вызов функции ввод с типизированного файла
                case 2: k = fs_enter(); break;// вызов функции ввод с экрана
                case 3: k = sort(k); print_list(k); break;// вызов 2 функций сортировки по переменной к, и вывод списка на экран
                case 4: search(k);break;//вызов функции поиск по переменной к и сохранение в файл одной строки
                case 5: fsearch(k); break;//вызов функции поиск файла с наибольшим количеством обращений к нему
                case 6: zmn(k); print_list(k); break;//вызов функции замена строки по указаному номеру
                case 7: k = del(k,pind(k)); print_list(k); break;// вызов функции удаление строки после указанного номера
                case 8: k = vst(k,pind(k)); print_list(k); break;//вызов функции вставка строки после указанного номера
                case 9: print_list(k);break;//вызов функции вывод списка на экран
                case 10:return; break;
 
                }
        } while(true);//цикл будет повтрятся
}
 
//ввод списка из текстового файла
sp* ft_enter(){
        char name[10];// символьный тип которое будет именем файла и его типом не больше 10знаков
        cout<<Rus("введи имя входн тип.файла")<<endl;
        cin>>name;// ввод имени и типа
        sp* list = new sp;    //создаем указатель на голову списка
        sp *ptr;  //указатель на элемент списка
        bool on=true; //флажок, который определяет, читаем ли мы первый элемент списка или последующие
        ifstream inf(name);//считывание файла по имени name в inf
        while (!inf.eof()){ // цикл пока не будет достигнут конец файла
                if(on){     //если до этого список был пуст, то
                        ptr=list;  //записываем в него первый элемент
                        on=false;
                }else{  //если список не пуст, то записываем в него текущий элемент (настраиваем указатель на след. элемент)
                        ptr->next=new sp; //выделяем память под следующий элемент списка
                        ptr=ptr->next;//ptr теперь указывает на тот элемент который был выделен строкой выше
                }
                inf>> ptr->elfile.name;   //читаем конкретные данные в текущий элемент списка
                inf>> ptr->elfile.data;
                inf>> ptr->elfile.upd;
                inf.ignore();
        }
        ptr->next=NULL; //для последнего элемента списка указатель на следующий элемент не определен/пуст (установлен в NULL)
        inf.close();//закрытие файла
        return list;  //  возвращаем полученный список
}
 
//ввод списка из типизированного файла
sp* fb_enter(){
        sp* list =new sp; //создаем указатель на голову списка
        sp *ptr,*q;//два указателя на sp.
        int ok=1;//Переменная ok со значением 1.
        char name[15];// символьный тип которое будет именем файла и его типом не больше 15знаков
        cout<<Rus("введи имя входн тип.файла")<<endl;
        cin>>name;// ввод имени и типа
        ifstream intf(name, ios::binary); //режим бинарного открытия файла
        ptr=list; //теперь ptr указывает туда же куда и list
        while (!intf.eof()){  // // цикл пока не будет достигнут конец файла
                intf.read(reinterpret_cast<char *>(&ptr->elfile),sizeof(lfile)); /*читаем из бинарного файла байты кол-вом размер структуры lfile в переменную. reinterpret_cast<T> - небезопасное преобразование. В данном случае т.к. read принимает указатель на char* преобразовываем указатель на lfile в указатель на char и читаем в него. */
                        if(ptr->elfile.upd != NULL){  // если не ноль
                                q=ptr;//q теперь указывает туда же куда и ptr.
                                ptr->next=new sp;//ptr теперь указывает на тот элемент который был выделен строкой выше
                                ptr=ptr->next;// ptr теперь указывает на тот элемент который был выделен строкой выше
                        }
        }
        ptr->next=NULL;//обнуляем следующий элемент за q.
        intf.close();//закрытие файла
        return list; //  возвращаем полученный список
}
}
 
//ввод списка с экрана
sp* fs_enter(){
        sp* list =new sp; //создаем указатель на голову списка
        sp *ptr; //указатель на элемент списка
        char name; // символьный тип которое будет именем файла и его типом
        cout<< Rus("Введиде имя, дату создания, кольчество обращений к файлу")<<endl;
        ptr=list; //теперь ptr указывает туда же куда и list
        while (true){
                cin>>ptr->elfile.name;
                cin>>ptr->elfile.data;
                cin>>ptr->elfile.upd;
                cout<<Rus("ещё (y/n)")<<endl;
                cin>>name;
                if(name=='n') break;
                ptr->next=new sp;
                ptr=ptr->next;
        }
        return list;
}
 
//вывод списка на экран
sp* print_list(sp *list){
        sp *prt = list;
        int i=0;
        do {
                cout<<++i<<"  ";
                cout<<prt->elfile.name<<"      ";
                cout<<prt->elfile.data<<"      ";
                cout<<prt->elfile.upd<<endl;
                prt=prt->next;
                if(prt == NULL) break;
        } while (true);
}
 
//сортировка списка
sp* sort(sp *list){
        sp *pt=list, *ptr, *pred=list, *q;
        int ok,ok1;
        do{
                ok=0, ok1=1; ptr=pt;
                while (ptr->next){
                        if(ptr->elfile.upd > ptr->next->elfile.upd){
                                if(ok1) { // первый элемент
                                        ok1=0;
                                        q=pt;
                                        pt=pt->next;
                                        q->next=pt->next;
                                        pt->next=q;
                                        ptr=pt;
                                        ok=1;
                                }
                                else {
                                        q=pred->next;
                                        pred->next=pred->next->next;
                                        q->next=pred->next->next;
                                        pred->next->next=q;
                                        ptr=pt->next;
                                        ok=1;
                                }
                        }
                                pred=ptr;
                                ptr=ptr->next;
                }
        } while(ok);
        return pt;
}
 
//поиск
void search(sp *list){
        sp *prt = list;
        char f[15],r[15];
        cout<<Rus("введите текст")<<endl;
        cin>>f;
        cout<<Rus("введите выходной файл")<<endl;
        cin>>r;
        ofstream inf(r);
        while (true){
                if(strstr(prt->elfile.name,f)){
                  inf<<prt->elfile.name<<"  ";
                  inf<<prt->elfile.data<<"  ";
                  inf<<prt->elfile.upd<<endl;
                }
                prt=prt->next;
                if(prt == NULL) break;
        }
}
 
//Файл с наиольшим кольчеством обращений
void fsearch(sp *list){
         sp *prt = list;
         int p=-1;
         sp *r;
         while (true){
                if(prt->elfile.upd > p){
                        p = prt->elfile.upd;
                        r = prt;
                }
                prt=prt->next;
                if(prt == NULL) break;
         }
         cout<<Rus("Файл с наиольшим кольчеством обращений")<<endl;
         cout<<r->elfile.name<<" ";
         cout<<r->elfile.data<<" ";
         cout<<r->elfile.upd<<endl;
}
 
//получить адрес
sp* pind(sp *list){
        sp *prt = list;
        int i=1,j=0;
        cout<<Rus("Введите номер")<<endl;
        cin>>j;
        while (true){
                if(i==j){
                        return prt;
                        break;
                }
                prt=prt->next;
                if(prt == NULL) break;
                i++;
        }
}
 
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
        sp *pt=list, *q;
        if(adr==list){
                pt=adr->next;
                q=adr;
        }else{
                q = adr->next;
                adr->next = adr->next->next;
        }
        delete(q);
        return pt;
}
 
//вставка нового элемента после элемента с адресом adr
sp * vst(sp *list,sp *adr){
        lfile rab;
        sp *pt=list,*q=new sp;
        cout<<"name=";
        cin>>rab.name;
        cout<<"data=";
        cin>>rab.data;
        cout<<"up=";
        cin>>rab.upd;
        q->elfile=rab;
        if(adr==list){
                pt=q;
                q->next=adr;
        }else{
                q->next= adr->next;
                adr->next=q;
        }
        return pt;
}
 
//заменить поле
void zmn(sp *list){
        sp *prt = list;
        int i=1,j=0;
        cout<<Rus("Введите номер")<<endl;
        cin>>j;
        while (true){
                if(i==j){
                cout << Rus (" Введите имя нового файла");
        cin>>prt->elfile.name;
        cout << Rus (" Введите дату создания файла");
        cin>>prt->elfile.data;
        cout << Rus (" Введите количество обращений к файлу");
        cin>>prt->elfile.upd;
                        break;
                }
                prt=prt->next;
                if(prt == NULL) break;
                i++;
        }
Добавлено через 1 час 37 минут
и функция с удалением тоже работает не корректно если из двух номеров состоит список то первый удаляет норм, а если ввести удалить номер 2 то никакой реакции тоесть не удаляет...

Добавлено через 57 минут
люди helppppppppppppppppppppppp

Добавлено через 10 часов 51 минуту
HELPP
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2011, 03:47     подправить функцию вставки элемента
Посмотрите здесь:

функция вставки элемента в массив C++
C++ В программе написать функции: вставки элемента, поиска максимального элемента, определения среднего арифметического элементов массива
C++ Написать функцию вставки элемента в массив. Помочь разобраться
Помочь разобраться с программой. Написать функцию вставки элемента в массив C++
Что не так в функции? Написать функцию вставки элемента в массив C++
C++ Нужно подправить рекурсивную функцию
C++ Нужно подправить функцию, не работает
C++ Функция вставки элемента в циклический список

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
05.11.2011, 04:24     подправить функцию вставки элемента #2
272 -273
Цитата Сообщение от lexflax Посмотреть сообщение
C++
1
pt=q; q->next=adr;
попробуйте так
C++
1
2
3
pt=q;
pt->next=adr;
return pt;
lexflax
10 / 10 / 1
Регистрация: 03.04.2011
Сообщений: 627
05.11.2011, 16:57  [ТС]     подправить функцию вставки элемента #3
да так работает, но косяк оставется в том что когда вводишь 1, он должен ставить новый элемент после первого, а он ставит перед собой, во всех других случаях после себя, как исправить эту ошибку...
код сейчас вот так выглядит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sp * vst(sp *list,sp *adr){
    lfile rab;
    sp *pt=list,*q=new sp;
    cout<<"name=";
    cin>>rab.name;
    cout<<"data=";
    cin>>rab.data;
    cout<<"up=";
    cin>>rab.upd;
    q->elfile=rab;// в список на который ссылался q присваиваем строки rab
    if(adr==list){
        pt=q;
        pt->next=adr;
    }else{
        q->next= adr->next;
        adr->next=q;
    }
    return pt;
}
Yandex
Объявления
05.11.2011, 16:57     подправить функцию вставки элемента
Ответ Создать тему
Опции темы

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