#1 25.05.08 11:49
Нужна помощь по решению проблемы с программой на С++!!!!!!
Помогите с программой, не очищается выделенная память и к тому же теряется двусвязность списка!!!!
Сортировка двусвязного списка путем исключения элемента с минимальным значением и включения его в начало нового списка.
Вот прога:
Код: C++:
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> //подключаем библиотеку содержащую стандартные функции ввода-вывода struct elem //объявляем элемент списка { int value; //value-значение, хранящееся в элементе списка elem *next,*pred; //*next и *pred - указатели на следующий и предыдущий элементы списка(список двусвязный) }; int _tmain(int argc, _TCHAR* argv[]) { elem *in_h=NULL, *in_e=NULL, *out_h=NULL,*q,*min, *q_pred, *q_next; int m; puts("Vvedite koli4estvo elementov v sodavaemom spiske"); scanf("%d",&m); for(int i=0;i<m;i++) { printf("num %d : ",i); q=new elem; //создание нового элемента спискаб выделение под него динамич памяти scanf("%d",&(q->value)); //заполнение его значением if(in_h==NULL) //если список пуст { q->pred=NULL; q->next=NULL; in_h=q; in_e=q; } else //если в списке уже что было { q->pred=in_e; q->next=NULL; in_e->next=q; in_e=q; } } if(in_h!=NULL) //если список не пуст, то начнем обработку { while(in_h->next!=NULL) //до тех пор пока не останется 1 элемент в исходном списке { min=in_h; //далее отыскание минимума q=min->next; do { if((q->value)<(min->value)) { min=q; } q=q->next; }while(q!=NULL); //минимум ищется до конца списка... if((min->pred!=NULL)&&(min->next!=NULL)) //если минимальный элемент в списке не первый и не последнии { (min->pred)->next=min->next; //вырезаем его (min->next)->pred=min->pred; } else { if(min->pred==NULL) //если первый { in_h=min->next; //вырезаем его in_h->pred=NULL; } else { //ну и если последний (min->pred)->next=NULL; //вырезаем его } } //далее вставляем в начало нового списка if(out_h==NULL) // если новый список еще пуст { min->pred=NULL; //то вставим таким образом min->next=NULL; out_h=min; } else //если в новом списке уже есть элементы { min->pred=NULL; //то вставим таким образом min->next=out_h; out_h=min; } } in_h->pred=NULL; //ну и перенесем последний оставшийся элемент in_h->next=out_h; out_h=in_h; q=out_h; //пробежим по всему новому списку и выведем на экран значения do { printf("%d ",q->value); q=q->next; }while(q!=NULL); q=out_h->next;//пробегаем по всем элементам списка и очищаем выделенную под них память do { delete q->pred; q=q->next; }while(q!=NULL); } else //а если if(in_h!=NULL) не выполнилось, то есть список пуст, то ниче не пытаемся сделать puts("Spisok pust"); //и выдаем что список пуст scanf("%d ",&m); //что б окошко сразу не исчезло return 0; }
Исправлено Beliar (25.05.08 15:53)
Offline
#2 25.05.08 14:55
Re: Нужна помощь по решению проблемы с программой на С++!!!!!!
Вот, может это тебе поможет...
Код: C++:
#include<iostream> using namespace std; struct elem { elem *prev; elem *next; int data; elem(int _data) { data=_data; next=NULL; prev=NULL; } }; elem * max(elem *snach) { elem * max; elem * tek; max=snach; tek=snach; if(tek->next!=NULL) { while(tek->next!=NULL) { tek=tek->next; if((tek->data)>(max->data)) { max=tek; } } } else return NULL; return max; } elem * sort (elem * header) { elem * new_header=NULL; // указатель на начало нового (сортированного) списка (для начала=NULL) elem * tekushiy; elem * bil; elem * bud; bool end=false; while(!end) { tekushiy=max(header); if(tekushiy!=NULL) // если в старом списке больше 1 эл-та { // Вережем минимальный эл-т из старого списка bil=tekushiy->prev; bud=tekushiy->next; if(bil!=NULL) // если минимальным оказался не 1 эл-т { if(bud!=NULL) // и не последний { bil->next=bud; bud->prev=bil; } else bil->next=NULL; // если последний } else // если первый { bud->prev=NULL; header=bud; } // добавим мин. эл-т в нач нового списка if(new_header!=NULL) // если в новом списке уже есть элементы { new_header->prev=tekushiy; tekushiy->next=new_header; } else tekushiy->next=NULL; // если нету tekushiy->prev=NULL; new_header=tekushiy; } else // если в старом списке остался 1 эл-т { end=true; new_header->prev=header; header->next=new_header; header->prev=NULL; new_header=header; } } return new_header; } void ins(int _data, elem *header) { elem *p; elem *q=new elem(_data); if(header==NULL) {header=q; header->next=NULL; header->prev=NULL; cout<<header->data;} else { for (p=header;p->next!=NULL;p=p->next); p->next=q; q->prev=p; q->next=NULL; } return; } void show(elem *header) { int i; elem *p; p=header; while(p!=NULL) {cout<<p->data<<endl; p=p->next;} } void main(){ int i; elem *header; header=new elem(5); for (i=7; i>0; i--){ins(i,header);} show(header); cout<<"max: "<<max(header)->data<<endl; cout<<"otcortiroval "<<endl; elem *out; out=sort(header); show(out); i=1; while(out->next!=NULL) {out=out->next; delete out->prev; } delete out; cin.get(); }
Вроде окончательный вариант) Но он ищет максимальный элемент, и добавляет его в список. Думаю переделаешь сам)
Исправлено forsake (25.05.08 15:59)
Offline
#3 25.05.08 16:06
Re: Нужна помощь по решению проблемы с программой на С++!!!!!!
Выдает вот это:
1>c:\my documents\visual studio 2008\projects\project1\rty\rty\rty.cpp(108) : warning C4101: 'i' : unreferenced local variable
1>c:\my documents\visual studio 2008\projects\project1\rty\rty\rty.cpp(128) : fatal error C1075: end of file found before the left brace '{' at 'c:\my documents\visual studio 2008\projects\project1\rty\rty\rty.cpp(113)' was matched
Offline
#4 25.05.08 16:13
Re: Нужна помощь по решению проблемы с программой на С++!!!!!!
проверь фигурные скобки. Если что, то проект тут ftp://forsake.hostel.nstu.ru/project/sort.zip
Offline
#9 25.05.08 18:29
Re: Нужна помощь по решению проблемы с программой на С++!!!!!!
Мне тут строка header=new elem(10); мешает, а если её убрать то прога останавливается после ввода 1 элемента!!!
void main(){
elem *header;
header=new elem(10);
int i,n,zna4;
cout<<"Vvedite kol-vo elementov"<<endl;
cin>>n;
for (i=n; i>0; i--)
{
cout<<"Vvedite znachenie "<<n-i<<"elementa"<<endl;
cin>>zna4;
ins(zna4,header);
}
show(header);
cout<<"min: "<<min(header)->data<<endl;
cout<<"otsortiroval "<<endl;
elem *out;
out=sort( header);
show(out);
i=1;
while(out->next!=NULL) {out=out->next; delete out->prev; }
delete out;
cin.get();
cin.get();
}
Исправлено Beliar (25.05.08 18:30)
Offline
#10 25.05.08 18:31
#11 25.05.08 18:51
#12 26.05.08 00:04
Re: Нужна помощь по решению проблемы с программой на С++!!!!!!
Beliar, ну если у тебя elem - это структура, то, скорее всего в ней не прописан конструктор...
тогда придётся изменить скобки на квадратные:
Код: C:
header = new elem[10];
это раз... а два - выделяй память под каждый элемент отдельно динамически, т.е. на каждой новой итерации.
Offline

