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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2010, 21:34   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
Восклицание Поменять порядок следования отрицательных элементов на обратный

Добрый вечер...в приведенном ниже листинге нужно написать функцию, которая меняет порядок следования отрицательных членов на обратный...я написал, но она не работает...в чем ошибка? Всем, кто откликнется, большое спасибо!!!

Код:
#include <iostream>
#include <conio.h>
using namespace std;

class List
{
	friend class Potomok;
private:
	int a;
	List *next;
	List *prev;
public:
	List () {a=0;}
	void Postroenie(int v);
	void Vivod ();
	void NewEl (int v, int f);
	void Del (int v);
	void DelSp ();

}*start, *last, *p, *pl;

void List::Postroenie(int v)
{
 if (start==NULL ) {
  start=new List;
  start->a=v;
  start->prev=NULL;
  start->next=NULL;
  last=start;
 }
 else{
  p=new List;
  p->a=v;
  p->next=NULL;
  p->prev=last;
  last->next=p;
  last=p;
 }
}

void List::NewEl(int v, int f)
{
	p=start;
	do { p=p->next;
	v--;
	} while (v!=1);

		List *q;
		q=new List;
		q->a=f;
		q->next=(p->prev)->next;
		q->prev=p->prev;
		(p->prev)->next=q;
		p->prev=q;
	}

void List::Del(int v)
{
	p=start;
	do { p=p->next;
	v--;
	} while (v!=1);

  if (p->next!=NULL)
    { 
		(p->next)->prev = p->prev;
      (p->prev)->next = p->next; delete p;
  }
  else
    { 
		(p->prev)->next = NULL; last = last->prev; delete p;}
}


void List::DelSp()
{
	List *q,*q1;
  q  = start; q1 = q->next;
  while  (q1!=NULL)
  {
    q = q1; q1 = q1->next; delete q;
  }
  delete start; start = last = NULL;
}


void List::Vivod()
{
    p=start;
	cout<<"Список: ";
	do {
	cout<<" "<<p->a;
	p=p->next;
	} while (p!=0);
  cout<<endl;

}
		
class Potomok: public List//-----------------> НАСЛЕДОВАНИЕ
{
public:
	Potomok () {a=0;}
	void Postroenie(int v);
	void SortOtr ();
	void SortPol ();
};

void Potomok::SortOtr()      //----------->данная функция
{
    List *elem,*p,*s,*min; 
	int count=0;
	p=last;
	s=start;
	while (p->prev!=NULL) {
		if (p<0) {
			count++;
			p=p->prev;
		}
	}
		p=start;
		for (int i=0; i<=count/2; i++)
		{
			if (s<0)
			{
			elem=s;
			}
			s=s->next;
			for (int j=0; j<=count/2; j++){
				if (p<0)
				{
					min=p;
					p=elem;
		            s=min;
				}
				p=p->prev;
			}
		}
	}







void main ()
{
	
	setlocale (0,"");
	cout<<"1 - Создание списка\n";
    cout<<"2 - Просмотр списка\n";
    cout<<"3 - Добавление нового элемента\n";
    cout<<"4 - Удаление определенного элемента\n";
    cout<<"5 - Сортировка списка\n";
    cout<<"6 - Обратный порядок отрицательных членов\n";
    cout<<"7 - Обратный порядок положительных членов\n";
    cout<<"8 - Удаление списка\n";
    cout<<"9 - Выход\n\n";
	
	int n, count=0;
	int poz, punkt;
	List A;
	Potomok B;
	
	do{
	cout<<"\nВыберите необходимый пункт меню\n";
	cin>>punkt;
	switch (punkt){
		case 1: cout<<"Введите значения элементов\n";
	            do {
                cin>>n;
	            A.Postroenie(n);
				count++;
	            } while (n!=0);
				break;

		case 2: A.Vivod();
			    break;
		
		case 3: do {
	            cout<<"\nВведите позицию вхождения нового элемента\n";
	            cin>>poz;
	            } while (poz>count);
	            cout<<"\nВведите новый элемент\n";
	            cin>>n;
	            A.NewEl(poz,n);
				break;

		case 4: do{
	            cout<<"\nВыберети позицию удаляемого объекта\n";
	            cin>>poz;
	            } while (poz>count);
                A.Del(poz);
				break;

		case 5: B.SortOtr();
			B.Vivod();
			break;

		case 8: A.DelSp();
			    break;

		case 9: cout<<"Выход\n";
			break;
		default: cout<<"Не верно введен номер пункта\n";
	}}while (punkt!=9);
	
	getch();
}
JeyKip вне форума Ответить с цитированием
Старый 14.01.2010, 01:23   #2
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

Ребята, ну помогите хоть чем нибудь... я уже реально сломал себе голову...никак не могу толком понять списки...
вот немного переделал, но все равно не работает... но мне кажется, что это ближе к истине...


Код:
void Potomok::SortOtr()      
{
    List *p,*s; 
	int min;
	int count=0;
	p=last;
	
	while (p->prev!=NULL) {
		if (p->a<0) {
			count++;
		}
					p=p->prev;
	}
	int i=count/2;
	    s=start;


		while (i>0) 
		{
			while (p->a>0)
			{
				p=p->prev;
			}
			
				if (p->a<0)
				{
					while (s->a>0)
					{
						s=s->next;
					}
					
					if (s->a<0)
					{
						min=s->a;
						s->a=p->a;
						p->a=min;
					}
				}
				i--;
		}
}
JeyKip вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратный порядок вывода (системы счис.) forsaken66 Общие вопросы C/C++ 2 17.10.2009 01:45
Перенести первые k строк в конец массива, соблюдая порядок их следования. umiko Microsoft Office Excel 1 16.05.2009 08:29
Найти максимальный из положительных элементов матрицы и сумму отрицательных элементов. bessonov12 Microsoft Office Excel 7 04.05.2009 05:44
Поменять местами две половины массива, сохраняя их порядок. Леди Уинтер Помощь студентам 11 09.01.2008 09:21
вычислить сумму отрицательных элементов в массиве only_win Паскаль, Turbo Pascal, PascalABC.NET 2 25.09.2007 15:22