annaleks
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите, пожалуйста, исправить программу по двусвязанным спискам в C++. Нужно найти среднее значение, элементы, меньшие среднего, удалить, а после элементов, больше среднего, добавить 1500. Почему-то иногда удаляются элементы, равные среднему значению. В чем ошибка? # include <iostream.h> # include <windows.h> # include <iomanip.h> # include <stdio.h> # include <conio.h> struct tochd { int inf; tochd *left; tochd *rigth; }; int menu (); void newochd (tochd **, tochd **); void add_r (tochd *, int); void vvodochd (tochd *,tochd *); void showochd (tochd *,tochd *); void read_del (tochd *); void delochd (tochd **, tochd **); void zadanie (tochd *,tochd *); int main() { SetConsoleCP (1251); SetConsoleOutputCP (1251); tochd *sl,*sr; newochd(&sl,&sr); while (1) { switch (menu()) { case 1: vvodochd (sl,sr); break; case 2: showochd (sl,sr); break; case 3: zadanie (sl,sr); showochd (sl,sr); break; case 4: if (sl->rigth!=sr) { delochd(&sl,&sr); cout <<"Очередь удалена!"<<endl; } else cout <<"Очередь пустая!"<<endl; return 0; default: "Выберите правильно!"; } puts("Press any key to continue"); getch(); system("cls"); } } int menu () { cout<<"Выберите:"<<endl; cout<<"1.Ввести значения:"<<endl; cout<<"2.Вывести исходный список"<<endl; cout<<"3.Вывести измененный список"<<endl; cout<<"4.Удалить список. Выход"<<endl; cout<<endl; int i; cin >> i; return i; } void newochd (tochd **sl, tochd **sr) // формирование первого элемента { *sl=new tochd; *sr=new tochd; (*sl)->left=NULL; (*sl)->rigth=*sr; (*sr)->left=*sl; (*sr)->rigth=NULL; return; } void add_r (tochd *sp, int inf) // добавление элемента после заданного { tochd *spt=new tochd; spt->inf=inf; spt->left=sp; spt->rigth=sp->rigth; sp->rigth=spt; spt->rigth->left=spt; return; } void vvodochd (tochd *sl,tochd *sr) // заполнение списка { int n, repeat; cout <<"Будете вводить значения? (1-да/0-нет):"<<" "; cin>>repeat; if (repeat!=0 && repeat!=1) return; while (repeat) { cout <<"Введите число: "; cin>>n; if (n>-50 && n<50) add_r(sl,n); else return; cout <<"Продолжить ввод? (да-1,нет-0): "; cin >>repeat; if (repeat!=0 && repeat!=1) return; } } void showochd (tochd *sl,tochd *sr) // печать списка { if (sl->rigth==sr) { cout <<"Очередь пустая!"<<endl; return; } tochd *p=sl; while ((p=p->rigth)!=sr) { cout <<p->inf<<setw(5); } cout <<endl; } void read_del (tochd *sp) // чтение с удалением { sp->left->rigth=sp->rigth; sp->rigth->left=sp->left; delete sp; } void delochd (tochd **sl, tochd **sr) // удаление очереди { tochd *t; while( (*sl)->rigth != (*sr) ) { t=(*sl)->rigth->rigth; delete (*sl)->rigth; (*sl)->rigth=t; } delete *sl; *sl = NULL; delete *sr; *sr = NULL; return; } void zadanie (tochd *sl,tochd *sr) { tochd *p=sl, *t; int size=0; double srzn=0; while ((p=p->rigth)!=sr) size++; p=sl; while ((p=p->rigth)!=sr) srzn+=(double)p->inf/size; cout <<"Среднее значение элементов списка равно"<<" "<<srzn<<endl; p=sl->rigth; while (p!=sr) { if (p->inf<srzn) { t=p->rigth; read_del(p); p=t; } else if (p->inf>srzn) { t=p->rigth; add_r(p,1500); p=t; } else p=p->rigth; } } |