Официальный сайт студ.городка НГТУ
Программирование и БД » Нужна помощь по решению проблемы с программой на С++!!!!!! 

#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

#5  25.05.08 16:34

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

А можешь помочь сделать чтобы самому элементы вводить с клавы произвольные ?

Offline

#6  25.05.08 16:48

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

ну епта.... элементарно

Код: C++:

int i,n,zna4;
cout<<"Введи кол-во элементов"<<endl;
cin>>n;
for (i=n; i>0; i--)
{
cout<<"Введи значение "<<n-i<<"злемента"<<endl;
cin>>znach;
ins(znach,header);
}

Offline

#7  25.05.08 17:06

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

Спасибо !!! только почему то теперь результат не выдается а сразу закрывается окно!

Offline

#8  25.05.08 17:31

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

блин, пораскинь мозгами, и cin.get(); не забудь

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

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

блин, ну напиши конструктор без параметров как тебе нужно...

Offline

#11  25.05.08 18:51

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

Да я в чужих прогах, как блондинка за клавой))))))))

Offline

#12  26.05.08 00:04

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

Beliar, ну если у тебя elem - это структура, то, скорее всего в ней не прописан конструктор...
тогда придётся изменить скобки на квадратные:

Код: C:

header = new elem[10];

это раз... а два - выделяй память под каждый элемент отдельно динамически, т.е. на каждой новой итерации.

Offline

#13  26.05.08 11:02

Я
Профиль

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

Beliar написал(а):

Да я в чужих прогах, как блондинка за клавой))))))))

А в своих?

Offline

#14  26.05.08 13:00

Re: Нужна помощь по решению проблемы с программой на С++!!!!!!

Ну если сам делал то понятное дело понимаю, только давно я уже сам проги не делал то!!!!!!)))

Исправлено Beliar (26.05.08 13:03)

Offline

Программирование и БД » Нужна помощь по решению проблемы с программой на С++!!!!!! 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.136 сек.
Выполнено 14 запросов.