Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2012, 21:54   #1
SoTwisted
Пользователь
 
Регистрация: 11.01.2011
Сообщений: 12
По умолчанию Сортировка двусвязного списка

Разработать программу учета продажи и поступления товаров в магазин. Перечень товаров, имеющихся в магазине, оформить в виде линейного двусвязного списка. Предусмотреть возможность сортировки товаров по цене.
Код ниже. Зависает на условии в сортировке. Правильно ли определены указатели?
Среда Borland C.


Код:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>


struct Element {
char Name[20];
float price;
Element *Next;
Element *Previous;
};


class list
{
		Element *begin,*end;
		public:
			int n;
			void Add(void);
			void Show (void);
			void Sort(void);
			void Menu(void);
		list(){
			begin=end=NULL;
};

~list()
{
	Element *del;
	while (begin)
		{
			del=begin;
			begin = begin->Next;
			delete del;
		}
	};
};

void list::Add(void)
{ Element *part= new Element;
	cin >> part->Name;
	cin >> part->price;
	part->Next=NULL;
	if (begin==NULL)
		begin=part;
	else
		{
			end->Next=part;
			part->Previous=end;
		}
	end=part;
}

void list::Show(void)
{ Element *part=begin;
	 while (part!=NULL)
	 {
		cout<<"\n "<<part->Name;
		cout<<"\n "<<part->price;
		cout<<"\n";
		part=part->Next;
	 }
	if(begin==NULL) cout<<"\n Empty \n";
	getch();
}

void list::Sort(void)
{ Element *count,*prev;
	int i=0,j;
	count=begin;
	prev=begin;
	while (count->Next!=NULL)
		{
		 for (j=0;j<n-i-1;j++)
			if (count==begin&&(count->price >= count->Next->price))
				{ prev=count;
					count=count->Next;
					prev->Previous=count;
					prev->Next=count->Next;
					count->Previous=NULL;
					count->Next=prev;
					}
				if (count!=begin&&(count->price >= count->Next->price))
				{prev=count;
				 prev->Previous=count->Next;
				 prev->Next=count->Next->Next;
				 count=count->Next;
				 count->Next=prev;}
		 i++;
		}
	 getch();
}


void list::Menu(void)
{
list product;
int key;
clrscr();
do {
cout<<" 1 - Add\n"
<<" 2 - Sort*\n"
<<" 3 - Show \n"
<<" Esc - Exit \n";

key=getch();
switch (key) {
case 49 :
			product.Add();
					break;
case 50 :
			product.Sort();
			break;
case 51 :
			product.Show();
			break;
			} clrscr();
} while (key!=27);
}

main()
{
list T;
T.Menu();
return 0;
}

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 21.02.2012 в 00:23.
SoTwisted вне форума Ответить с цитированием
Старый 21.02.2012, 09:51   #2
reserv
Пользователь
 
Регистрация: 17.02.2012
Сообщений: 10
По умолчанию

В методе Sort у тебя осуществляется изменение count только в случае, если (count->price >= count->Next->price). То есть получается, что цикл while топчется на месте, если (count->price < count->Next->price).
reserv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка двусвязного списка. Ninna Паскаль, Turbo Pascal, PascalABC.NET 0 30.05.2011 13:03
Очередь в виде двусвязного списка. dimorik Общие вопросы C/C++ 9 10.06.2010 02:24
Сортировка двусвязного списка методом шейкера ioda1986 Помощь студентам 0 02.05.2010 00:31
[C++] Шейкер-сортировка двусвязного списка Attenti_ON Помощь студентам 0 17.11.2009 00:24